轉https://segmentfault.com/a/1190000004361778
在上一篇部落格中我們提到過,OpenStack每個項目内部的服務程序之間是通過消息總線來通訊的,而在各個項目之間則是通過RESTful API來進行通訊的,在這一篇部落格中,我們就來詳細的讨論一下OpenStack各個項目之間的通訊。
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指令為例來看一下具體的流程。
首先用戶端使用http發送請求,說明要調用nova list指令了。
Rails是OpenStack所使用的路由子產品,收到HTTP請求後,将這個請求指派到對應的Controller,并且綁定一個action。
每個Controller都對應了一個RESTful資源,代表了對該資源的操作集合,其中包含了很多Action。因為Rails指定了要執行index的action,是以該Controller就調用index函數。
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是與OpenStack密切相關的兩個元件。
OpenStack使用Paste的Deploy元件來完成WSGI伺服器和應用的建構,每個項目源碼etc目錄下都有一個Paste配置檔案,例如nova中的,如下圖所示。
Paste配置檔案分為過個section,每個section以type:name的格式命名,具體的可以參考官網源碼。使用Paste Deploy的主要目的就是從配置檔案中生成一個WSGI Application,有了配置檔案之後,隻需要使用下面的調用方式:
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)
本文轉自茄子_2008部落格園部落格,原文連結:http://www.cnblogs.com/xd502djj/p/7570786.html,如需轉載請自行聯系原作者。