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。