OpenStack項目做爲一個IaaS平臺,提供了三種使用方式:python
經過Web界面,也就是經過Dashboard(面板)來使用平臺上的功能。nginx
經過命令行,也就是經過keystone, nova, neutron等命令,或者經過最新的openstack命令來使用各個服務的功能(社區目前的發展目標是使用一個單一的openstack命令替代過去的每一個項目一個命令的方式,之後會只存在一個openstack命令)。web
經過API,也就是經過各個OpenStack項目提供的API來使用各個服務的功能。sql
上面提到的三種方式中,經過API這種方式是基礎,是其餘兩種方式可行的基礎。segmentfault
經過Web界面使用OpenStack服務這種方式是經過OpenStack的Horizon項目提供的。Horizon項目是一個Django應用,實現了一個面板功能,包含了先後端的代碼(除了Python,還包括了CSS和JS)。Horizon項目主要是提供一種交互界面,它會經過API來和各個OpenStack服務進行交互,而後在Web界面上展現各個服務的狀態;它也會接收用戶的操做,而後調用各個服務的API來完成用戶對各個服務的使用。後端
經過命令行是用OpenStack服務的方式是由一系列項目來提供的,這些項目通常都命名爲python-projectclient,好比python-keystoneclient,python-novaclietn等。這些命令行項目分別對應到各個主要的服務,爲用戶提供命令行操做界面和Python的SDK。好比python-keystoneclient對應到keystone,爲用戶提供了keystone這個命令,同時也提供了keyston項目的SDK(實際上是在SDK的基礎上實現了命令行)。這些client項目提供的SDK其實也是封裝了對各自服務的API的調用。因爲每一個主要項目都有一個本身的命令行工具,社區以爲很差,因而又有了一個新的項目python-openstackclient,用來提供一個統一的命令行工具openstack(命令的名字就叫作openstack),這個工具實現了命令行,而後使用各個服務的client項目提供的SDK來完成對應的操做。安全
經過API使用OpenStack的方式是由各個服務本身實現的,好比負責計算的nova項目實現了計算相關的API,負責認證的keystone項目實現了認證和受權相關的API。這些API都是有統一的形式的,都是採用了HTTP協議實現的符合REST規範的API。OpenStack中如何實現這些API就是本文重點要將的內容。服務器
REST的全稱是Representational State Transfer,中文翻譯過來是表徵狀態轉移,是Roy Fielding在他的博士論文**Architectural Styles and the Design of Network-based Software Architectures**提出的一種軟件架構風格。能夠先到wikipedia頁面瞭解一下這個風格的特色。通常會把知足這種設計風格的API成爲RESTful API。因爲這種軟件設計風格很是適合採用HTTP協議來實現,所以HTTP協議是目前實現RESTful API的主要方案。session
OpenStack就是基於HTTP協議和JSON來實現本身的RESTful API(以前OpenStack還有采用XML來表示數據的,如今都已經轉到JSON了)。當一個服務要提供API時,它就會啓動一個HTTP服務端,用來對外提供RESTful API。架構
OpenStack的API都是有詳細的文檔記錄的,能夠在http://docs.openstack.org/看到全部的API的文檔。每一個API的文檔形式以下:
固然,你能夠點開detail看到詳細的說明。從上面這個API的文檔來看,你會以爲這個和開發網站時使用的GET方法和POST方法差很少,實際上也是差很少的,只不過對HTTP協議的使用方法作了知足REST風格的規定而已。
由於Python可以進行Web開發,因此用來開發RESTful API也就不成問題,這二者的技術基礎是同樣。在Python下開發RESTful API應用,無非是解決兩個問題:
服務如何部署?
用什麼框架開發?
說到Python的Web服務部署這個問題,就不得不提到WSGI。目前Python有兩種方式來開發和部署一個Web應用:用WSGI和不用WSGI。若是你不瞭解WSGI,那麼你須要先看下另外這篇關於WSGI的文章:WSGI簡介。
OpenStack的API服務都是使用WSGI的方式來部署的。在生產環境中部署WSGI,通常會考慮使用Web服務器 + 應用服務器 + 應用(框架)的方案。OpenStack官方推薦的是使用Apache + mod_wsgi的方案,不過這個要換成其餘方案也很容易,你也能夠選nginx + uWSGI。對於開發調試的目的,有些項目也會提供使用eventlet的單進程部署方案,好比Keystone項目的keystone-all命令。採用eventlet這種異步架構來進行應用開發也是一個比較大的話題,本文不覆蓋這方面的內容。
固然,也能夠不用WSGI。在Python中,若是不使用WSGI的化,通常開發者會選擇一些專門的服務器和框架,好比Tornado,或者最新最潮的aiohttp。不過在OpenStack的項目中我還沒見過不使用WSGI的。
Python的Web開發框架不少,最出名天然是Django了。基本上,還活躍的框架都支持RESTful API的開發,有些框架還專門爲RESTful API的開發提供了便利的功能(好比Pecan),有些框架則經過第三方模塊來提供這種便利,好比Django和Flask都有很多和REST相關的第三方庫。
對於框架選擇,也沒有什麼特別好的標準,通常都是比較性能、文檔、社區是否活躍等。在我看來,選擇流行的通常就不會錯。
上面已經談到了OpenStack都是使用WSGI,也提到了部署方式。這一章來講一下OpenStack中使用的框架。
OpenStack項目傾向於不從新發明輪子,通常都會選擇現有的庫和框架來使用,除非現有的框架不知足需求。由於Web框架的選擇不少,並且都知足需求,因此OpenStack項目到目前爲止都是使用現成的Web框架。
OpenStack早期的項目並無使用一個框架,而是使用了幾個不一樣的模塊來組合出一個框架:Paste + PasteDeploy + Routes + WebOb,這幾個不一樣的模塊分別負責應用的WSGI化、URL路由和請求處理等功能。Nova, Glance, Neutron, Keystone等早期的項目都是使用這樣的架構來實現RESTful API的。
早期的這種技術選型帶來的好處是"框架"具有足夠的靈活性,缺點則是要把這幾個模塊組合起來實現一個REST服務,須要寫不少代碼,連WSGI的入口函數都要本身實現(好比Keystone項目的keystone/common/wsgi.py文件中的class Application
)。由於靈活性的好處不是很明顯,而代碼量大的壞處很明顯,好比上面那個class Application
須要在每一個項目中複製一遍,因此社區的新項目就開始使用新的Web框架Pecan。
Pecan是一個基於對象路由的框架,即靈活又簡單。Pecan主要實現了URL路由功能,支持RESTful API。Pecan沒有實現模板、session管理和ORM等功能,可是這些功能能夠經過其餘的模塊來實現。對於OpenStack來講,Pecan是一個很好的選擇,由於OpenStack項目中統一使用sqlalchemy來實現ORM,API的實現也不須要模板功能,安全控制則基於Keystone體系。使用Pecan來開發REST服務,代碼量不多,代碼結構也清晰。Ceilometer項目就是使用了Pecan。