nova創建虛擬機源碼分析系列之一 restful api


開始學習openstack源碼,源碼文件多,分支不少。按照學習的方法走通一條線是最好的,而網上推薦的最多的就是nova創建虛機的過程。從這一條線入手,能夠貫穿openstack核心服務。寫博文僅做學習筆記整理,多為借鑒網上大牛的分析。因為涉及到的知識點很多,所以分期來比較寫合適。

 

openstack有3中創建虛擬機的方法,分別是:命令行創建,dashboard界面創建和api接口創建。

前兩種方式最終還是調用openstack的Restful API去工作。

openstack創建虛擬機流程如下:

 

 通過命令行查看鏡像列表來調試整個過程:

openstack image list

 

 1 ----->START with options: [u'--debug', u'image', u'list']  2 ###將命令行轉化成url
 3 ----->command: image list -> openstackclient.image.v2.image.ListImage  4 ###發送請求
 5 ----->Starting new HTTP connection (1): controller  6 http://controller:35357 "GET /v3 HTTP/1.1" 200 250
  ##沒有token,所以先請求token
7 ----->Making authentication request to http://controller:35357/v3/auth/tokens 8 http://controller:35357 "POST /v3/auth/tokens HTTP/1.1" 201 5229 9 ##返回的token信息。 10 11 {"token": 12 { 13 "is_domain": false, 14 "methods": ["password"], 15 "roles": [{ 16 "id": "39a6815cad0e4e7c879de0092076ff3f", 17 "name": "admin" 18 }], 19 "expires_at": "2017-10-27T09:11:56.000000Z", 20 "project": { 21 "domain": { 22 "id": "default", 23 "name": "Default" 24 }, 25 "id": "ffd1a0df301045f1b20eef7d9e126dbf", 26 "name": "admin" 27 }, 28 "catalog": [{ 29 "endpoints": [{ 30 "url": "http://controller:8080/v1/AUTH_ffd1a0df301045f1b20eef7d9e126dbf", 31 "interface": "internal", 32 "region": "RegionOne", 33 "region_id": "RegionOne", 34 "id": "0ee0b857383a44d98970cce3fd0cdfd2" 35 }, 36 { 37 "url": "http://controller:8080/v1/AUTH_ffd1a0df301045f1b20eef7d9e126dbf", 38 "interface": "public", 39 "region": "RegionOne", 40 "region_id": "RegionOne", 41 "id": "8c0c6d20c6c1468387282b9a4c5fd444" 42 }, 43 { 44 "url": "http://controller:8080/v1", 45 "interface": "admin", 46 "region": "RegionOne", 47 "region_id": "RegionOne", 48 "id": "eb1f0c50aa1e45c2968da7a59a3054e0" 49 }], 50 ##返回信息中獲得token,並獲得image服務的入口。
##再次請求image服務
51 ----->REQ: curl -g -i -X GET "http://controller:9292/v2/images?marker=None" -H "User-Agent: osc-lib/1.3.0 keystoneauth1/2.18.0 python-requests/2.12.4 CPython/2.7.12" -H "X-Auth-Token: {SHA1}7b4a526303024850fd85c54c830599ad94641d7a" 52 ----->Starting new HTTP connection (1): controller 53 54 ##獲得返回信息,其中有id,name,statues三項,能夠顯示出來。 55 RESP: [200] Content-Length: 653 Content-Type: application/json; charset=UTF-8 X-Openstack-Request-Id: req-5bae1adb-0638-438a-93f2-e2e4cfc6664c Date: Fri, 27 Oct 2017 08:11:57 GMT Connection: keep-alive 56 ------>RESP BODY: 57 { 58 "images": [{ 59 "status": "active", 60 "name": "cirros", 61 "tags": [], 62 "container_format": "bare", 63 "created_at": "2017-07-11T11:43:18Z", 64 "size": 13267968, 65 "disk_format": "qcow2", 66 "updated_at": "2017-07-11T11:43:18Z", 67 "visibility": "public", 68 "self": "/v2/images/d22d0398-8b12-406c-9ebb-285257c6d31f", 69 "min_disk": 0, 70 "protected": false, 71 "id": "d22d0398-8b12-406c-9ebb-285257c6d31f", 72 "file": "/v2/images/d22d0398-8b12-406c-9ebb-285257c6d31f/file", 73 "checksum": "f8ab98ff5e73ebab884d80c9dc9c7290", 74 "owner": "ffd1a0df301045f1b20eef7d9e126dbf", 75 "virtual_size": null, 76 "min_ram": 0, 77 "schema": "/v2/schemas/image" 78 }], 79 "schema": "/v2/schemas/images", 80 "first": "/v2/images"} 81 GET call to None for http://controller:9292/v2/images?marker=d22d0398-8b12-406c-9ebb-285257c6d31f used request id req-553123bd-6373-4306-9e72-fff4737b49b4 82 clean_up ListImage: 83 END return value: 0 84 +--------------------------------------+--------+--------+ 85 | ID | Name | Status | 86 +--------------------------------------+--------+--------+ 87 | d22d0398-8b12-406c-9ebb-285257c6d31f | cirros | active | 88 +--------------------------------------+--------+--------+

 

在這個過程中能夠清晰看出,請求都是通過URL的方式發送的相應服務,這就是一個基於RESTFUL 的架構。

總結openstack image list 命令生效的過程:

  1. 在本地將openstack image list命令轉化成URL。
  2. 以restful的方式請求image服務,但沒有認證所以不成功。
  3. 以restful的方式請求keystone獲取token。
  4. 通過keystone返回的服務列表獲取image的服務入口。
  5. 以restful的方式請求image服務,獲取list信息。

 

Restful API:

RESTFUL即遠程調用函數接口的設計風格,對http協議包裝,使其能夠滿足REST方法,即restful api。

遠程:使用http協議,用類似網站請求的流程。

調用函數接口:通過不同的URL請求地址調用不同的函數接口(API)。

設計風格:不同於本地函數調用,所有的API都可以看做是資源,使用URL調用。

 


例如請求openstack token的過程,一個標准的restful api工作方式。

http://192.168.252.134:5000/v2.0/tokens

該命令是一條URL,http://192.168.252.134:5000是keystone服務的入口 /v2.0/tokens是對應的keystone的restful api的接口。

返回的結果部分如下

{
    "access": {
      "token": {
            "issued_at": "2017-09-22T18:13:42.000000Z",
            "expires": "2017-09-22T19:13:42Z",
            "id": "6cfdf8c54e1b482c90bbacf53efc9623",
            "tenant": {
                "description": "Bootstrap project for initializing the cloud.",
                "enabled": true,
                "id": "3602a1190ab74fa4aa17ac4da1a7bbc2",
                "name": "admin"
            },
            "audit_ids": [
                "jnYGZYHbSbeejDSQm0ORxA"
            ]
        },
        "serviceCatalog": [
            {
                "endpoints": [
                    {
                        "adminURL": "http://192.168.252.134:8774/v2.1",
                        "region": "RegionOne",
                        "internalURL": "http://192.168.252.134:8774/v2.1",
                        "id": "4b1950b5cc9c49c685f19cdb003601d3",
                        "publicURL": "http://192.168.252.134:8774/v2.1"
                    }
                ],
                "endpoints_links": [],
                "type": "compute",
                "name": "nova"
            },

 

通過一條URL調用了openstack環境中的函數,操作通過認證,返回下一步要使用的認證token。

熟悉openstack應該了解,keystone認證成功之后除了返回token之外,還會返回所有服務的組件接口,及restful接口。

 

 

REST

REST(Representational State Transfer 表現層狀態轉移)是一種軟件架構風格、設計風格,而不是標准。主要用於客戶端和服務端的API交互,它的優勢在於更簡潔、清晰、可讀性強。

 

RESTFUL

滿足REST約束條件和原則的應用程序或設計就是Restful,即Rest風格的應用

 

RESRFUL 特征

一、請求方式:

REST構建於HTTP協議之上,遵循並擴展和規范了傳統HTTP協議中的標准方法,

以下是RESTful API定義的標准方法:

GET 查詢資源
POST 增加資源
PUT 更新資源
HEAD 驗證,包括用戶身份的驗證和資源的驗證
DELETE 刪除資源

 

 

 

 

 

 

 

二、資源化:

REST要求URL的格式遵守統一的規范,所有資源都具有唯一的ID。具體到OpenStack中,每個資源都有一個UUID,作為全局唯一的標識。

我們用instances來表示虛擬機的集合,每一個instance(虛擬機實例)具有全局唯一的UUID

 

在以上的過程中能夠看到,restful和URL有着千絲萬縷的聯系。最后簡單總結:

Restful 設計模式 和 網站設計模式的對比:

不同點:數據格式

網站數據傳輸格式有多種,常見為text/html 而restful為json格式。

相同點:架構設計

都需要相同的架構,即服務器程序(appach,nigix)+ WSGI(接口)+ 應用程序。

 

 

額外補充:

與Restful的設計風格不同的其他設計風格:

1.SOA : 面向服務的架構 【組件模型】【將服務通過定義良好的接口和契約聯系起來】

2.SOAP : 簡單對象訪問協議 一種數據交換協議規范,是一種輕量的、簡單的、基於XML的協議的規范

3.RPC : 遠程過程調用協議 從一台機器(客戶端)上通過參數傳遞的方式調用另一台機器(服務器)上的一個函數或方法(服務)並得到返回的結果【調用本地函數/方法一樣去調用遠程的函數/方法】

4.微服務:
    A 獨立的進程的方式存在,互相之間並無影響
    B 接口方式更加通用化
    C 傾向於分布式去中心化的部署方式,在互聯網業務場景下更適合

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM