nova創建虛擬機流程源碼系列分析之二 wsgi模型
openstack nova啟動時首先通過命令行或者dashborad填寫創建信息,然後通過restful api的方式調用openstack服務去創建虛擬機。數據信息從客戶端到達openstack服務器端。
以上的過程看不到openstack調用restful api的詳細過程,如果想詳細的看到restful api的過程,可以使用postman工具。
postman是一個在驗證restful api接口,開發過程中十分方便的工具。上篇博客中使用restful api請求token的過程。
其中標出3點,為restful請求3個要素,分別是:
- 請求方法--->POST
- 請求URL--->http://192.168.252.134:5000/v2.0/tokens
- 請求內容--->username/password
返回信息如下
當restful請求到達openstack之後,openstack是如何處理這條請求呢?具體來說有如下步驟:
- openstack開啟相應的WSGI監聽服務
- WSGI監聽服務接收到restful請求
- 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的服務器,實現的方式很簡單,分為兩步:
- 開啟WSGI端口監聽
- 實現處理函數
第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模型