zoukankan      html  css  js  c++  java
  • OpenStack 中的neutron-server启动过程

    neutron-server是neutron的核心组件之中的一个。负责直接接收外部请求,然后调用后端对应plugin进行处理。

    其核心启动过程代码主要在neutron.server包中。

    __init__.py文件里包含一个main()函数,是WSGIserver開始的模块,而且通过调用serve_wsgi来创建一个NeutronApiService的实例。然后通过eventletgreenpool来执行WSGI的应用程序,响应来自client的请求。

    主要过程为:

       eventlet.monkey_patch()

    绿化各个模块为支持协程(通过打补丁的方式让本地导入的库都支持协程)。

    config.parse(sys.argv[1:])

    if not cfg.CONF.config_file:

            sys.exit(_("ERROR: Unable to find configuration file via the default"

                       " search paths (~/.neutron/, ~/, /etc/neutron/, /etc/) and"

                       " the '--config-file' option!"))

    通过解析命令行传入的參数。获取配置文件所在。

    pool = eventlet.GreenPool()

    创建基于协程的线程池。

    neutron_api = service.serve_wsgi(service.NeutronApiService)

    api_thread = pool.spawn(neutron_api.wait)

    serve_wsgi方法创建NeutronApiService实例(作为一个WsgiService),并调用其的start()来启动socketserver端。

    #neutron.service

    def serve_wsgi(cls):

        try:

            service = cls.create()

            service.start()

        except Exception:

            with excutils.save_and_reraise_exception():

                LOG.exception(_('Unrecoverable error: please check log '

                                'for details.'))

        return service

    neutron.service.NeutronApiService类继承自neutron.service.WsgiService。其create方法返回一个appname默觉得“neutron”的WsgiService对象;start方法则调用_run_wsgi方法。

    def start(self):

            self.wsgi_app = _run_wsgi(self.app_name)

    _run_wsgi方法主要是从api-paste.ini文件里读取应用(最后是利用neutron.api.v2.router:APIRouter.factory来构造应用)。然后为应用创建一个wsgi的服务端,并启动应用。主要代码为。

    def _run_wsgi(app_name):

        app = config.load_paste_app(app_name)

        if not app:

            LOG.error(_('No known API applications configured.'))

            return

        server = wsgi.Server("Neutron")

        server.start(app, cfg.CONF.bind_port, cfg.CONF.bind_host,

                     workers=cfg.CONF.api_workers)

        # Dump all option values here after all options are parsed

        cfg.CONF.log_opt_values(LOG, std_logging.DEBUG)

        LOG.info(_("Neutron service started, listening on %(host)s:%(port)s"),

                 {'host': cfg.CONF.bind_host,

                  'port': cfg.CONF.bind_port})

        return server

    至此,neutron server启动完毕。之后。须要创建rpc服务端

    try:

                neutron_rpc = service.serve_rpc()

    except NotImplementedError:

                LOG.info(_("RPC was already started in parent process by plugin."))

    else:

                rpc_thread = pool.spawn(neutron_rpc.wait)

                rpc_thread.link(lambda gt: api_thread.kill())

                api_thread.link(lambda gt: rpc_thread.kill())

    这些代码创建pluginrpc服务端,并将apirpc的生存绑定到一起,一个死掉,则另外一个也死掉。

    pool.waitall()

    最后是后台不断等待。

    下图总结了neutron-server的核心启动过程。




  • 相关阅读:
    堆栈学习
    需要阅读的书籍
    Rust Book Lang Ch.19 Fully Qualified Syntax, Supertraits, Newtype Pattern, type aliases, never type, dynamic sized type
    Rust Lang Book Ch.19 Placeholder type, Default generic type parameter, operator overloading
    Rust Lang Book Ch.19 Unsafe
    Rust Lang Book Ch.18 Patterns and Matching
    Rust Lang Book Ch.17 OOP
    Rust Lang Book Ch.16 Concurrency
    Rust Lang Book Ch.15 Smart Pointers
    HDU3966-Aragorn's Story-树链剖分-点权
  • 原文地址:https://www.cnblogs.com/bhlsheji/p/5136283.html
Copyright © 2011-2022 走看看