OpenStack設計與實現(五)RESTful API和WSGI

ss_184 8年前發布 | 21K 次閱讀 OpenStack 分布式/云計算/大數據

來自: http://blog.csdn.net/xingjiarong/article/details/50571289


在上一篇博客中我們提到過,OpenStack每個項目內部的服務進程之間是通過消息總線來通訊的,而在各個項目之間則是通過RESTful API來進行通訊的,在這一篇博客中,我們就來詳細的討論一下OpenStack各個項目之間的通訊。

一、什么是RESTful

RESTful是目前最流行的一種互聯網軟件架構。REST(Representational State Transfer,表述性狀態轉移),如果一個架構符合REST原則,就稱它為RESTful架構。

RESTful架構的核心概念就是“資源”,在RESTful的世界里,網絡上的所有東西都是資源,比如一段文本,一張圖片都可以看作是資源。每一個資源都對應著一個特定的URI(統一資源定位符)并用它進行標記。

每一個資源都有多種表現形式,我們上網的過程,就是調用資源的URI,獲取它不同表現形式的過程。也就是說,服務器保存了資源的各種表現形式,客戶端可以使用HTTP的幾個基本操作,包括GET、POST、PUT等使服務端上的資源發生“狀態轉化”,這就是為什么叫做“表述性狀態轉移”。

OpenStack各個項目都提供了RESTful架構的API作為對外提供的接口,也就是說,OpenStack定義了很多的資源,并實現了針對這些資源的各種操作函數。OpenStack的API服務進程接收到客戶端的HTTP請求時,一個所謂的”路由“模塊就會將請求的URL轉化成相應的資源,并路由到合適的操作函數上。

這里寫圖片描述

我們以nova list命令為例來看一下具體的流程。

1、首先客戶端使用http發送請求,說明要調用nova list命令了。

2、Rails是OpenStack所使用的路由模塊,收到HTTP請求后,將這個請求指派到對應的Controller,并且綁定一個action。

3、每個Controller都對應了一個RESTful資源,代表了對該資源的操作集合,其中包含了很多Action。因為Rails指定了要執行index的action,所以該Controller就調用index函數。

二、什么是WSGI

RESTful只是設計風格而不是標準,而WSGI(Web Server Gateway Interface,Web 服務器網關接口)則是python語言中所定義的Web服務器和Web應用程序之間或框架之間的通用接口標準。

WSGI就是一座橋梁,橋梁的一端稱為服務端或網關端,另一端稱為應用端或者框架端,WSGI的作用就是在協議之間進行轉化。

WSGI將Web組件分成了三類:Web 服務器(WSGI Server)、Web中間件(WSGI Middleware)與Web應用程序(WSGI Application)。

Web Server接收HTTP請求,封裝一系列環境變量,按照WSGI接口標準調用注冊的WSGI Application,最后將響應返回給客戶端。

WSGI Application是一個可被調用的Python對象,它接受兩個參數,通常為environ和start_response。比如:

def application(environ, start_response):
    start_response('200 OK', [('Content-Type', 'text/plain')])
    yield 'Hello World\n'

參數environ指向一個python字典,要求里面至少包含了一些在CGI中定義的環境變量已經WSGI所定義的環境變量,WSGI應用可以從environ中獲取相對應的請求及其執行上下文的所有信息。

參數start_response指向一個回調函數,回調函數負責執行客戶端的請求并且返回結果。當有請求到來時,WSGI Server會準備好environ和start_response參數,然后調用WSGI Application獲得對應請求的響應。

WSGI中間件同時實現了服務端和應用端的API,因此可以在兩端之間起協調作用。從服務器看起來,中間件就是一個WSGI應用;從應用端看起來,中間件則是一個WSGI服務器。WSGI中間件可以將客戶端的HTTP請求路由給不同的應用對象,然后將應用處理后的結果返回給客戶端。我們可以將WSGI中間件理解為服務端和應用端交互的一層包裝,經過不同中間件的包裝,便具有不同的功能。

三、Paste和Webob

Paste和Webob是與OpenStack密切相關的兩個組件。

Paste:

OpenStack使用Paste的Deploy組件來完成WSGI服務器和應用的構建,每個項目源碼etc目錄下都有一個Paste配置文件,例如nova中的,如下圖所示。

這里寫圖片描述

Paste配置文件分為過個section,每個section以type:name的格式命名,具體的可以參考官網源碼。使用Paste Deploy的主要目的就是從配置文件中生成一個WSGI Application,有了配置文件之后,只需要使用下面的調用方式:

wsgi_app = loadapp('config:/path/to/config.ini')

Webob:

Webob通過對WSGI的請求與響應進行封裝來簡化WSGI應用的編寫。Webob中兩個最重要的對象,一是webob.Request,對WSGI請求的environ參數進行封裝,一是webob.Response,包含了標準WSGI響應的所有要素。來看一個例子:

原始的WSGI格式:

app_iter = myfunc(environ, start_response)

使用webob封裝之后:

def myfunc(req):
    return webob.Response('hey there')

resp = myfunc(req)</pre> </div>

 本文由用戶 ss_184 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!