分享

Openstack Neutron-server服务加载与启动源码分析(三)

nettman 发表于 2014-11-10 20:19:18 [显示全部楼层] 回帖奖励 阅读模式 关闭右栏 1 24982
问题导读
1.Openstack neutron服务启动过程需要加载哪些资源?
2.那个函数完成了资源的加载功能?







本文是在学习Openstack的过程中整理和总结,由于时间和个人能力有限,错误之处在所难免,欢迎指正!
Neutron-server服务加载与启动源码分析(二)中搞定模块功能的扩展和加载,我们就回到Neutron-server服务加载与启动源码分析(一)中的_run_wsgi函数
  1. def _run_wsgi(app_name):
  2.     app = config.load_paste_app(app_name)
  3.     ifnot app:
  4.         LOG.error(_('No known API applications configured.'))
  5.         return
  6.     server = wsgi.Server("Neutron")
  7.     server.start(app, cfg.CONF.bind_port, cfg.CONF.bind_host,
  8.                  workers=cfg.CONF.api_workers)
  9.     # Dump all option values here after all options are parsed
  10.     cfg.CONF.log_opt_values(LOG, std_logging.DEBUG)
  11.     LOG.info(_("Neutron service started, listening on%(host)s:%(port)s"),
  12.              {'host': cfg.CONF.bind_host,
  13.               'port': cfg.CONF.bind_port})
  14. return server
复制代码


app =config.load_paste_app(app_name)在这里就完成模块功能的扩展和加载,接下来看
  1. server = wsgi.Server("Neutron")
  2.     server.start(app, cfg.CONF.bind_port, cfg.CONF.bind_host,
  3.                 workers=cfg.CONF.api_workers)
复制代码


创建一个neutron的服务端,然后启动这个server
这边配置文件中默认的api_workers为0
  1. def start(self, application, port, host='0.0.0.0', workers=0):
  2.         """Run a WSGI server with the givenapplication."""
  3.         self._host = host
  4.         self._port = port
  5.         backlog = CONF.backlog
  6.         #获取socket信息
  7. self._socket = self._get_socket(self._host,
  8.                                        self._port,
  9.                                         backlog=backlog)
  10.         self._launch(application, workers)
复制代码

  1. def _launch(self, application, workers=0):  
  2.         service = WorkerService(self, application)  
  3.         if workers <1:  
  4.             # workers小于1直接运行在当前的进程  
  5.             self._server = service  
  6.             service.start()  
  7.             systemd.notify_once()  
  8.         else:  
  9.             # API服务运行一定数量的子进程  
  10.             # 等待间隔时间默认0.01s  
  11.             self._server = common_service.ProcessLauncher(wait_interval=1.0)  
  12.             self._server.launch_service(service, workers=workers)
复制代码




执行完_run_wsgi函数,就完成service.start()的执行,也就完成neutron_api= service.serve_wsgi(service.NeutronApiService)的工作。

  1. def main():
  2. ……
  3. try:
  4. pool = eventlet.GreenPool()
  5. neutron_api = service.serve_wsgi(service.NeutronApiService)
  6. api_thread = pool.spawn(neutron_api.wait)
  7. try:
  8. neutron_rpc = service.serve_rpc()
复制代码




      我们启动了一个wsgi的服务,并且把资源加载和扩展等等准备工作都做好了,“万事具备只欠东风”,现在就从线程池中spawn一个线程来监听neutron api命令,这里再啰嗦一句neutron api命令到来之后,最后是路由到neutron.api.v2.base中的Controller中进行处理。

      main函数最后就是执行neutron_rpc =service.serve_rpc())是通过plugin实现的,开始一个或者多个Rpcworker,并监听请求,监听topics中消息队列。我的理解是这个是用来监听neutron内部组件之间的通信。

至此Openstack neutron服务启动过程中的资源加载和扩展的源码简单解析完成了。


已有(1)人评论

跳转到指定楼层
sheldon 发表于 2015-1-23 16:01:22
楼主,干的漂亮。
根据你的启发,我也分析了启动源码,服务启动时,分别启动了api thread跟rpc thread。
api thread启动加载了neutron api server对外暴漏的rest api, rpc thread启动加载了core_plugin与service_plugins,提供真正的功能实现,可称作是provider吧? rpc thread在加载的时候,还比较了core_plugin所提供的核心功能与扩展功能, 如果service_plugins提供的功能与core_plugin提供的有冲突,rpc thread将会退出。 这样理解是否恰当,请楼主多多指教。望与楼主多多交流。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条