2.7.1 API服务(nova-api)
nova-api也称为API服务器,是用Python实现的一个Web服务器,实现Restful API到内部请求消息的转换。nova-api支持两类API,一类是Nova自定义的API,这个API又区分为不同的版本,其中V2是主流支持的接口版本。另一类是兼容EC1-API接口,这个API接口在未来可能被移除。
nova-api本身并不复杂,先看一下启动Nova的代码:
[[email protected] ~]# cat /usr/bin/nova-api#!/usr/bin/python# PBR Generated from u'console_scripts'import sysfrom nova.cmd.api import mainif __name__ == "__main__": sys.exit(main)
找到nova.cmd.api的main()函数。
def main: config.parse_args(sys.argv) logging.setup("nova") utils.monkey_patch gmr.TextGuruMeditation.setup_autorun(version) launcher = service.process_launcher for api in CONF.enabled_apis: should_use_ssl = api in CONF.enabled_ssl_apis if api == 'ec2': server = service.WSGIService(api, use_ssl=should_use_ssl, max_url_len=16384) else:server = service.WSGIService(api, use_ssl=should_use_ssl) launcher.launch_service(server, workers=server.workers or 1) launcher.wait
从代码大概能够看出,首先是读取配置文件,读取配置参数,并且根据配置完成初始化消息队列,用以后续与别的组件进行内部消息交互。同时根据配置文件中的配置项启动WSGI服务器,配置文件中的每一个API对应一个服务器。另外根据系统的CPU核心数n,每个WSGI服务器都会有n个worker协程去处理请求。
通常,EC2的API对应TCP端口8773,Nova自定义的API对应端口8774。WSGI服务器运行后,开始循环侦听TCP端口,接收客户端发起的HTTP请求,并将请求参数验证解释后转换为系统内部消息,然后通过RPC将内部消息传递到后端组件执行。在技术实现上,nova-api利用WSGI框架,实现URL到action的映射。action是对应模块里面的具体实现函数。