1. 程式人生 > >OpenStack設計與實現(五)RESTful API和WSGI

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

在上一篇部落格中我們提到過,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)