1. 程式人生 > >nova創建虛擬機流程源碼系列分析之二 wsgi模型

nova創建虛擬機流程源碼系列分析之二 wsgi模型

app 技術 har forever 服務端 服務器程序 inter nova 127.0.0.1

openstack nova啟動時首先通過命令行或者dashborad填寫創建信息,然後通過restful api的方式調用openstack服務去創建虛擬機。數據信息從客戶端到達openstack服務器端。

技術分享

以上的過程看不到openstack調用restful api的詳細過程,如果想詳細的看到restful api的過程,可以使用postman工具。

postman是一個在驗證restful api接口,開發過程中十分方便的工具。上篇博客中使用restful api請求token的過程。

技術分享

其中標出3點,為restful請求3個要素,分別是:

  1. 請求方法--->POST
  2. 請求URL--->http://192.168.252.134:5000/v2.0/tokens
  3. 請求內容--->username/password

返回信息如下

技術分享

當restful請求到達openstack之後,openstack是如何處理這條請求呢?具體來說有如下步驟:

  1. openstack開啟相應的WSGI監聽服務
  2. WSGI監聽服務接收到restful請求
  3. WSGI根據配置文件處理不同的URL請求

WSGI簡介

以下摘錄自“廖雪峰 python教程”:

WSGI:Web Server Gateway Interface。網站服務網關接口。
網站程序分為兩個部分,一個部分是接收客戶端發送的請求,稱為服務端程序;另一個部分是處理客戶端的請求,稱為應用程序。

當一個請求過來之後WSGI將請求解析,並根據請求的內容調用處理函數。應用程序接收到參數,處理並返回結果。

因為我們不希望接觸到TCP連接、HTTP原始請求,請求定位等,所以,需要一個統一的接口,讓我們專心用Python編寫Web業務。這個接口就是WSGI:Web Server Gateway Interface。


一個簡單的restful模型,可以看到WSGI在其中起到的作用,負責解析URL,將請求發往處理的函數。

例如:http://192.168.252.134:500/v2.0/token請求,WSGI會根據/2.0/token將處理轉發到token的處理函數。

技術分享


WSGI的實現
在python中自帶一個WSGI的服務器,實現的方式很簡單,分為兩步:
  1. 開啟WSGI端口監聽
  2. 實現處理函數

第1步實現代碼:

server.py

 1  # 從wsgiref模塊導入:
 2  from wsgiref.simple_server import make_server
 3  # 導入我們自己編寫的application函數(函數名任意):
 4  from hello import application
 5 
 6 
 7 # 創建一個服務器,IP地址為空,端口是8000,處理函數是application:
 8 httpd = make_server(127.0.0.1, 8080, application)
 9 print "Serving HTTP on port 8000..."
10 
11 # 開始監聽HTTP請求:
12 httpd.serve_forever()

WSGI封裝了底層代碼,底層代碼是使用網絡通訊的socket來實現。

第2步實現代碼:

hello.py

1 def application(environ, start_response):
2     start_response(200 OK, [(Content-Type, text/html)])
3     return <h1>Hello,WSGI!</h1>

這裏是server.py中引入的application,該函數的參數有兩個:environ、starrt_response。

environ是一次請求的所有的傳入參數,包括 URL,請求端IP地址,等。

start_response是一個回調函數,功能是發送http應答的報頭,包括狀態碼 200 ,發送的數據格式text/html。

return是返回http應答的body,一個最簡單的網頁,顯示"hello WSGI!"字符串。

運行該服務:python server.py

技術分享

通過瀏覽器訪問:

技術分享

通過postman訪問

技術分享

方法:get

URL:http://192.168.252.134:8000

返回數據包:application函數中return的簡單網頁。

回過頭來看該WSGI例子實現了restful的服務。解析URL:URL其實是http://192.168.252.134:8000/,解析的是最簡單的"/",應用程序是:return <h1>hello WSGI!</h1>,沒有服務器程序,即沒有nginx/apache。

以上就是一個簡單WSGI搭建的過程。在openstack nova創建虛擬機的過程中涉及到的restful ,模型都是從這個最簡單的例子演化出來的。

nova創建虛擬機流程源碼系列分析之二 wsgi模型