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

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

 

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

1、什麼是RESTfulshell

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

RESTful架構的核心概念就是「資源」,在RESTful的世界裏,網絡上的全部東西都是資源,好比一段文本,一張圖片均可以看做是資源。每個資源都對應着一個特定的URI(統一資源定位符)並用它進行標記。markdown

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

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

這裏寫圖片描述

咱們以nova list命令爲例來看一下具體的流程。app

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

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

三、每一個Controller都對應了一個RESTful資源,表明了對該資源的操做集合,其中包含了不少Action。由於Rails指定了要執行index的action,因此該Controller就調用index函數。

2、什麼是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中間件理解爲服務端和應用端交互的一層包裝,通過不一樣中間件的包裝,便具備不一樣的功能。

3、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)
相關文章
相關標籤/搜索