把Neutron看成一个整体(上图中红色框体内),neutron外部就是:nova,linux,ovs,dnsmsq database等。简单描述neutron的主要工作就是接收novaAPI请求,完成一些动作到linux、ovs、database等,最后再返回结果给nova。对于neutron内部,将API映射到对应Plugin进行处理,Plugin又会将请求通过RPC发送到对应的agent进行处理。
API学习总结尝试讲下:API到ML2plugin中间的怎么映射的,如何定界nova给我们下发哪写API,参数是什么,最后相关的消息有没有发给对应的Agent。
启动过程:
/usr/lib/systemd/system/neutron-server.service 服务
对应程序的代码:
neutron/cmd/eventlet/server/__init__.py
wsgi_eventlet.eventlet_wsgi_server 是一个回调函数
boot_server里面就是加了初始化,然后再回调刚才回调函数 wsgi_eventlet.eventlet_wsgi_server
继续回到eventlet_wsgi_server这个函数里面
serve_wsgi 里面创建一个NeutronApiService的对象,并start,start里面就是去创建neutron server resful服务,并启动线程进入死循环,后面再展开这个start。
neutron_api = service.serve_wsgi(service.NeutronApiService) --创建一个NeutronApiService对象neutron_api
start_api_and_rpc_workers函数中使用start_all_workers函数来启动RPC相关的workers,返回worker_launcher对象(实际上是oslo_service.service::ProcessLauncher的实例)。接着,主进程使用GreenPool分别spawn出neutron_api和worker_launcher的wait函数,并调用waitall函数来等待这两个GreenThread结束。其中的两个link函数是为了保证其中一个服务挂掉,另外一个服务也要随之结束。
再展开NeutronApiService 的start方法
调用NeutronApiService的start方法实际是调用基类的start方法
self.wsgi_app = _run_wsgi(self.app_name) 放回一个app对象放到NeutronApiService对象neutron_api的成员变量中。
继续跟进_run_wsgi(self.app_name)
入参就是“neutron”字符串,是NeutronApiService构造函数默认的参数值。
289行:创建了一个app,这个app可以理解为接收 resful服务请求的响应处理的一个对象,这个对象里面管理了,URL请求将给谁了分发处理,在/etc/neutron/api-paste.ini 这个里面定义,
paste.app_factory = neutron.api.v2.router:APIRouter.factory 对应代码里面的 /neutron/api/v2/router.py 里面的factory 属性。
里面有一行这样的配置,不在此展开,只要知道load_paste_app 会根据配置文件创建一个app对象,该对象就是处理请求的就可以了。回过头再看是怎么处理请求的,先把初始化流程走完。
server = wsgi.Server("Neutron") --创建Server对象
server.start() --调用Server对象的start方法,传入4个参数,一个app对象,port, ip,worker数。