天天看點

Openstack API 類型 & REST 風格目錄Openstack 提供了三種操作方式REST 風格基于HTTP協定的RESTful APIOpenStack中的RESTful API開發架構

<a href="#%E7%9B%AE%E5%BD%95">目錄</a>

<a href="#openstack-%E6%8F%90%E4%BE%9B%E4%BA%86%E4%B8%89%E7%A7%8D%E6%93%8D%E4%BD%9C%E6%96%B9%E5%BC%8F">Openstack 提供了三種操作方式</a>

<a href="#web%E7%95%8C%E9%9D%A2">Web界面</a>

<a href="#cil-%E6%8C%87%E4%BB%A4%E8%A1%8C">CIL 指令行</a>

<a href="#restful-api">RESTful API</a>

<a href="#rest-%E9%A3%8E%E6%A0%BC">REST 風格</a>

<a href="#restful%E9%A3%8E%E6%A0%BC%E7%9A%84api%E8%AE%BE%E8%AE%A1">RESTFul風格的API設計</a>

<a href="#%E5%9F%BA%E4%BA%8Ehttp%E5%8D%8F%E8%AE%AE%E7%9A%84restful-api">基于HTTP協定的RESTful API</a>

<a href="#openstack%E4%B8%AD%E7%9A%84restful-api%E5%BC%80%E5%8F%91%E6%A1%86%E6%9E%B6">OpenStack中的RESTful API開發架構</a>

也就是通過Dashboard(儀表闆)來使用Openstack雲計算平台上的功能。通過Web界面使用 OpenStack Services 這種方式是通過 OpenStack Horizon Project 提供的。Horizon Project 是一個Django Web Application。Horizon Project 會通過API來和各個 OpenStack Services 進行互動,然後在 Web 界面上顯示這些 Services 的狀态和互動結果。

通過以往的 keystone、nova、neutron 等指令,或者通過最新的 OpenStack 指令來操作各個 Services 的功能。社群目前希望使用統一的 OpenStack 指令來代替以往每個 Project 都有各自的 Commands 的方式,這些 Commands 是由命名為 client(EG. keystoneclient、novaclient) 的項目所實現的。這些 client 項目除了爲使用者提供指令行操作界面方式之外還提供了 Python 的 SDK (其實是在SDK的基礎上實作了指令行)。這些 client 項目提供的 SDK 本質是封裝了這些 Openstack services 的 API 的調用。現在 Openstack 社區希望僅使用 openstackclient 作爲統一的指令行工具,然後使用各個 Services 的 client 項目所提供的 SDK 來完成相應的操作。

通過各個 OpenStack Project 提供的 API 來使用各 Services 的功能。API 這種方式是支撐上述兩種方式的基礎,由各個 Services 自身來實作使用 API 操作 OpenStack 的方式。這些 API 具有統一的形式,均采用了基於 HTTP 協定的 Restful 風格來實作。Openstack API 服務程序在接收了用戶端的HTTP Request之後,一個所謂的 路由 子產品就會将URL轉換成為相應的資源,并路由到合适的操作函數上去。以此來實作了從API到具體操作的映射。

REST(Representational State Transfer)表述性狀态轉換,是一種軟體架構的設計風格,而不是一種标準,為軟體設計提供了一組原則和限制條件,但這是原則和限制的條件也同樣不具有标準性。是以也可以将REST了解為是一組沒有嚴格标準的架構限制條件和設計原則。REST的軟體設計傾向于簡單輕量的方法設計和實作,以及**REST具有通過HTTP直接傳輸資料的特性。**REST風格的軟體架構必須滿足下面兩點規範:

URI 辨別資源:首先從Restful的角度來看,網際網路上的任何東西(文本/圖檔/視訊/歌曲/Services)都是一個資源。每個資源都使用了一個特定的URI來唯一标示,通路這一個URI就是通路這一個資源,而且這個資源具有至少一種狀态。

無狀态原則: 再一個就是,Client 和 Server 之間互相傳遞的隻是資源的表述,即:調用資源的URI并擷取資源的不同表現形式。并且 Client 和 Server 之間的互動是由 HTTP 無狀态協定來支撐的,是以資源的所有狀态都隻會儲存在 Server 中。當 Client 應用 HTTP 協定中的 GET/POST/PUT/DELETE 操作資源時,會使得 Server 中的資源的狀态發生轉換,這就是所謂的“表述性狀态轉換”。

你的URI中應該都是名詞,表示一個事物,而非動詞。EG. <code>/resources/142</code> 是好的URI,它看起來像是一個事物 而 <code>/resources/142/get</code> 則不是好的URI,因為它看起來更像是一個動作,隻有事物才符合資源的定義。

面向資源的體系結構

URI使用名詞,不使用動詞

資源位址即URI

無狀态性

靈活使用單數和複數

傳輸資源的表現形式(Web Server 接收和傳回的網際網路媒體類型,JSON/XML)

對資源的操作與HTTP内置方法映射

由于這種軟體設計風格非常适合采用HTTP協定來實作,是以HTTP協定是目前實作RESTful API的主要方案。

OpenStack 就是基于 HTTP 協定和 JSON 來實作自己的 RESTful API(之前OpenStack還有采用XML來表示資料的,現在都已經轉到JSON了)。當一個 Service 要對外提供 API 時,它就會啟動一個 HTTP Web Server,用來對外提供 RESTful API。

OpenStack 的 API 服務都是使用 WSGI 的方式來部署的。部署WSGI,一般會使用 Web Server + Application Server + Application(架構) 的部署方式。OpenStack 官方推薦的是使用 Apache + mod_wsgi ,當然你也可以選 nginx + uWSGI 。還有些項目會提供使用 eventlet 的單程序部署方案(EG. Keystone項目的keystone-all指令)。

OpenStack 早期的核心項目(EG. Keystone/Nova/Glance/Neutron)使用了由幾個子產品組合出來的一個架構: Paste + PasteDeploy + Routes + WebOb 。這些子產品分别負責了應用的 WSGI 化、URL 路由和請求處理等功能。但是這種架構存在着較為複雜的弊端,是以現在 Openstack 社群的新項目已經開始使用新的 Web 架構 Pecan。

Pecan 是一個基于對象路由的架構,即靈活又簡單。Pecan 主要實作了 URL 路由功能,支援 RESTful API 。Pecan 沒有實作模闆、session 管理、 ORM 等功能,但是這些功能可以通過其他的子產品來實作。對于 OpenStack 來說,Pecan 是一個很好的選擇,因為 OpenStack 項目中統一使用 sqlalchemy 來實作ORM,API的實作也不需要模闆功能,安全控制則基于 Keystone 體系。使用 Pecan 來開發 REST 服務,代碼量很少,代碼結構也清晰。