searchusermenu
  • 发布文章
  • 消息中心
点赞
收藏
评论
分享
原创

Openstack Neutron组件加载分析

2023-03-24 01:13:43
23
0

 

把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数。

0条评论
0 / 1000
牛哥
8文章数
0粉丝数
牛哥
8 文章 | 0 粉丝
原创

Openstack Neutron组件加载分析

2023-03-24 01:13:43
23
0

 

把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数。

文章来自个人专栏
Openstack
8 文章 | 1 订阅
0条评论
0 / 1000
请输入你的评论
0
0