一 Neutron Server的范围
先看下图:
![](https://i-blog.csdnimg.cn/blog_migrate/06ed4f5a70cfa5bce7524a21b275072b.png)
图中,加粗虚框内,自Web Server以下,从urlmap app部件开始,包括Version Filter Apps、Extension Service Filter Apps、Core Service App等,都是符合WSGI规范的Application。
对于这些Application而言,最重要的事情,是将Neutron RESTful API的请求路由到正确的Plugin。
二 Neutron启动一个Web Server
要想启动一个Web Server(进程),Neutron Server首先作为一个普通的进程启动起来,然后它有两种选择:在当前进程中,以协程的方式,开启Web Server,或者另外启动进程,在新的进程中开启Web Server。
三 Web Server的启动过程
在neutron.egg-info/entry_points.txt文件中有下面一句话,它定义了Neutron Server的启动函数的名称:
neutron-server=neutron.cmd.eventlet.server:main
Neutron Server启动函数的实现如下:
def main():
server.boot_server(_main_neutron_server)
def _main_neutron_server():
if cfg.CONF.web_framework == 'legacy':
wsgi_eventlet.eventlet_wsgi_server()
else:
wsgi_pecan.pecan_wsgi_server()
从中可以看出,Neutron Server存在两个分支,这两个分支就是Web的两个框架:Paste+PasteDeploy+Routes+WebOb(PPRW)和pecan。不过两者的区别仅仅体现在加载WSGI Application这一块,其他部分相同,如下表。
![](https://i-blog.csdnimg.cn/blog_migrate/053826c9c12d8c4fa445a079ea7da404.png)
从帮助理解Neutron Server代码的来龙去脉的角度来讲,PPRW框架更好一些,所以以PPRW框架进行分析。
1 先分析wsgi_eventlet.eventlet_wsgi_server,代码如下:
def eventlet_wsgi_server():
neutron_api = service.serve_wsgi(service.NeutronApiService)
start_api_and_rpc_workers(neutron_api)
2 Neutron启动顺序图如下:
![](https://i-blog.csdnimg.cn/blog_migrate/94181a4df0e2ce685e6f600d489447bd.png)
图中,内容中加了(fun)的方框代表的是函数;白色方框代表的是class(或者class instance);Server._run,是class Server的一个函数,它会被协程调度。
这些函数与class的关系,用另外一个关系图表示:
![](https://i-blog.csdnimg.cn/blog_migrate/e3eb86f4291d6ba89cd0761a459ca8d7.png)