Openstack既然作为一个IaaS层项目,对外是需要提供服务的,那么目前对外提供服务基本基于以下三种方式:
1 通过web方式提供服务。
通过openstack 中的horizon 项目对外提供web图形化操作界面。既可以通过调用API来其他各个组件进行交互,也可以接受用户的操作命令,调用API完成对各个组件的调用。Horizon是python中Django的一个实现。
扩展:Djongo是一个优秀的开源的由python编写的web应用框架。采用MVC软件设计模式。
2 通过命令行提供服务。例如 keystonenova nurtron等命令。
Openstack中各个组件对外通过类似于python-projectclinet的一系列项目来对外提供命令行界面的服务。例如,python-keystoneclient、 python-novaclint等。
3 通过openstack 提供的开发API提供服务。
Openstack对外通过采用HTTP协议的符合REST规范的API 来对外提供服务。比如Nova对外提供关于计算相关的API。
扩展:REST规范是一种软件架构风格,中文翻译为:表征性状态转移。这种软件架构非常适合HTTP协议来实现,openstack也采用了这种风格的架构来实现,OpenStack基于HTTP协议和JSON来实现自己的RESTful API。不错的REST设计风格学习了解链接:
http://www.ruanyifeng.com/blog/2011/09/restful.html
http://www.ruanyifeng.com/blog/2014/05/restful_api.html
Openstack实现RESTful API部署设计思想
Python目前有两种web应用开发部署方案:基于WSGI和不基于WSGI.Openstack基本是采用WSGI 来进行部署的。Openstack官方推荐是用apache +mod_wsgi 来进行安装部署。
在应用程序开发框架中,openstack早期通过组合 paste + PasteDeploy +routers + webOb来实现WSGI 化、URL路由好请求处理等功能,所以这个开发快将还是需要学习的。
扩展:WSGI (web服务器网关接口),是一个规范,是web服务器与python应用程序进行交互的桥梁。类似于python专用的WSGI规范有java专用的servlet规范以及CGI 与fastCGI 。
WSGI 就是为了解决 :
1 . web服务器如何调用python应用程序,并将用户请求传递给应用程序
2 让python应用程序理解用户的具体请求,以及如何将处理结果返回给web服务器端。
WSGI扩展学习链接:
http://segmentfault.com/a/1190000003069785
Paste + PasteDeploy + routers + WebOb
以下是基于Juno版的keystone项目来展开学习开发流程。
1. WSGI入口文件:
keystone.httpd:keysthone.py文件是基于apache方式部署的WSGI应用程序入口文件。文件中创建了入口需要使用的application对象实例。
2.在keystone.py 入口文件中,通过调用initialize_application方法来载入整个WSGI应用,并且用到了Paste和PasteDeploy库。其中,通过config.find_paste_config()来查找WSGI所需要的配置文件。在loadapp()函数内部通过调用paste.deploy.loadapp()来加载keystone-paste.ini配置文件。
3. 解析paste.ini 配置文件
Paste.ini是实现WSGI所必须的,文件中包含很多格式为[type:name],如下列出比较核心的section:
composite:将指定的http请求分发到指定的app
app:对应具体的application
filter:过滤器- middleware(基本是WSGI提供的一些中间件)进行验证限速等操作
pipeline:过滤器集合串
一般流程是:composite àpipelineàfilterà app 处理。
4. 通过[app:xxxx]找到这个函数并获得相应的app去处理。例如通过[app:service_v3]会找到keystone.service:v3_app_factory去获得一个application。
5.Routers模块
当请求交给具体的application来处理的时候,它会根据请求中剩下的具体url,来实现路由。路由模块一般会创建一个Mapper对象,然后调用这个Mapper对象中的Connect()方法来讲具体的path映射到一个自定义类controller的实例上的某个action。