初看openstack代码,会发现里边有各种和api相关的文件和目录,本文以nova为例,来分析一下这些api的组织与功能。
nova中和api有关的文件/目录夹有:
api目录
多个rpcaip.py
多个api.py
本文不区分api和API,取决于输入法:)
openstack中的几种api:
rest api:项目对外接口。
本地调用api(local api): 进程内方法调用,及普通的Python方法调用。
远程调用api(rpc api): 跨进程方法调用。使用openstack RPC实现方法调用。开销比local api大。
api目录就是rest api的实现代码
api.py就是某个功能模块的本地调用api.
rpcapi.py就是某个功能模块的远程调用api.
Rest API
RestAPI是openstack的标准对外接口,所有API都有官方文档详细定义。
openstack中的rest api实现有两个关键技术:wsgi和Paste Deployment.
wsgi是pthon中的一个接口规范,定义web server和web application之间的接口。openstack中的rest实现都遵循了这个规范。
参考 http://legacy.python.org/dev/peps/pep-0333/
Paste Deployment是一个针对wsgi开发的库,用来配置和加载wsgi application和server。openstack中配置都是通过api-paste.ini文件提供。通过这个文件就可以直接调用Paste Deployment代码来加载web server和上面的application(Rest API实现)
参考 http://pythonpaste.org/deploy/
openstack service endpoint
每个服务(nova,cinder,neutron)都会在keystone上注册一个service endpoint,这个endpoint就是一个URL。每个rest api的完整URL是由这个endpoint+api文档中定义的URI构成的。
keystone中可以为每个service定义3个endpoint:一个是面向公网(public)使用的;一个是面向内网(internal)使用的;还有一个是面向admi使用的。通常internal和admin的endpoint是相同的,都是用openstack管理网络中的IP地址。public需要使用公网IP地址。
用户在通过keystone认证后,keystone会在返回数据中包含一个ServiceCatalog。这个ServiceCatalog会包含注册是keystone中的所有service endpoints。用户即可根据这些endpoint来进行后续的rest api调用。
远程调用api
每个openstack项目会包括多个功能独立的服务(service)。如nova会分成nova-api,nova-conductor,nova-compute,nova-consoleauth,nova-novncproxy,nova-scheduler...其中除了nova-api外,其余的都是RPC server,通过RCP对外提供API。其他项目也是按照这种方式组织,一个服务负责实现rest api,其他的都是RPC server, 通过RCP对外提供API。
每个服务的代码会在一个package中实现(package名字和服务名字一致),如nova-compute代码在compute中。每个服务会提供一个rpcapi.py文件,这个文件包含了调用本服务RPC api的client端代码。简化了client调用rpc api的代码。如compute中包含了rpcapi.py,文件注释说明了该文件的作用:
"""
Client side of the compute RPC API.
"""
在scheduler中即引用了该代码,filter_scheduler.py
from nova.compute import rpcapi as compute_rpcapi
scheduler在选定了一个计算节点后,通过RPC调用节点上的nova-compute服务来创建虚拟机。
rpcapi .ComputeAPI.run_instance
其他的服务(包括其他项目中的服务)也基本遵照了这种风格,增加代码的易读性。
关于RPC的介绍,可以参考另一篇文章 http://blog.csdn.net/zhengleiguo/article/details/26758413
本地调用api
和远程调用api非常类似,只能在进程间调用。每个服务会有一个api.py文件,这个文件就提供了该服务的本地调用api接口。如compute中api.py
查看api.py文件可以看到,该文件中的很多实现其实由调用了compute的rpcapi.py。从中可以看出,api.py应该是属于遗留代码(legacy code),不应该继续使用,保留是为了兼容以前的代码。
openstack中的api使用规则
如果是跨项目的调用(如nova调用keystone,glance等),使用rest api(通过相应的python-XXXclient库)。安装nova时需要依赖python-cinderclient python-neutronclien python-glanceclient python-keystoneclient,因为nova需要调用这些rest api。其他项目也有类似的依赖。
如果是项目内跨服务调用,则使用RPC调用,通过服务提供的rpcapi.py文件。
如果是项目内服务内的不同代码之间调用,就没有明确规则了,取决于代码作者的安排了。
————————————————
版权声明:本文为CSDN博主「zhengleiguo」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/zhengleiguo/article/details/26885557