neutron-server是neutron的核心组件之中的一个。负责直接接收外部请求,然后调用后端对应plugin进行处理。
其核心启动过程代码主要在neutron.server包中。
__init__.py文件里包含一个main()函数,是WSGIserver開始的模块,而且通过调用serve_wsgi来创建一个NeutronApiService的实例。然后通过eventlet的greenpool来执行WSGI的应用程序,响应来自client的请求。
主要过程为:
()
绿化各个模块为支持协程(通过打补丁的方式让本地导入的库都支持协程)。
[1:])
.config_file:
"
"
通过解析命令行传入的參数。获取配置文件所在。 ( 创建基于协程的线程池。 neutron_api = service. api_thread = pool.
serve_wsgi方法创建NeutronApiService实例(作为一个WsgiService),并调用其的start()来启动socketserver端。
#neutron.service
(cls):
try:
()
()
except Exception:
():
LOG('Unrecoverable error: please check log '
'for details.'))
return service
neutron.service.NeutronApiService类继承自neutron.service.WsgiService。其create方法返回一个appname默觉得“neutron”的WsgiService对象;start方法则调用_run_wsgi方法。
(self):
.app_name)
_run_wsgi方法主要是从api-paste.ini文件里读取应用(最后是利用neutron.api.v2.router:APIRouter.factory来构造应用)。然后为应用创建一个wsgi的服务端,并启动应用。主要代码为。
(app_name):
(app_name)
if not app:
LOG('No known API applications configured.'))
return
.bind_host,
workers=cfg.api_workers)
# Dump all option values here after all options are parsed
.DEBUG)
LOG.info(_("Neutron service started, listening on
{'.bind_host, '.bind_port}) return server 至此,neutron server启动完毕。之后。须要创建rpc服务端。 try
neutron_rpc = service()
except NotImplementedError:
LOG.info(_("RPC was already started in parent process by plugin."))
else:
rpc_thread = pool.wait)
rpc_thread())
api_thread())
这些代码创建plugin的rpc服务端,并将api和rpc的生存绑定到一起,一个死掉,则另外一个也死掉。
()
最后是后台不断等待。
下图总结了neutron-server的核心启动过程。