NOVA-API服务的启动流程

原文地址:http://wenku.baidu.com/view/801fae0dcc175527072208ed.html

1. bin.nova-api

    1. utils.default_flagfile()
       
获取nova.conf配置文件路径,并将其放入sys.argv环境变量中。

      2. flags.FLAGS(sys.argv))   

          调用FlagValues的__call(self,argv)函数,对sys.argv进行“getopt”处理。(详见Nova-Flags分析)

     3. logging.setup()

          进行nova-api的日志设置。(详见Nova-Logging分析)       http://blog.csdn.net/washli2001/article/details/8479915

     4. utils.monkey_patch()

          该函数中根据monkey_patch宏来确定是否载入相应模块,默认为false

     5. servers = []
         for api in flags.FLAGS.enabled_apis:
             servers.append(service.WSGIService(api))

         调用WSGIService初始化(ec2', 'osapi两个服务)server。(详见2.1节)

     6. service.serve(*servers)

         service.wait()启动服务.(详见2.2)

 2. nova.service

    1. WSGIService.__init__()函数

         a. self.name = name
             self.name为'ec2'或'osapi'        

         b. self.loader = loader or wsgi.Loader()
             创建一个loader实例,用来装载api-paste.ini配置文件。(详见3.1)

         c. self.app = self.loader.load_app(name)
             利用paste.deploy第三方软件载入配置文件中指定的name应用。(详见3.2)
         d. self.host = getattr(FLAGS, '%s_listen' % name, "0.0.0.0")
             从标记中获取主机的地址
         e. self.port = getattr(FLAGS, '%s_listen_port' % name, 0)#ec2=8773,osapi=8774
             从标记中获取服务端口的地址
         f. self.server = wsgi.Server(name, self.app, host=self.host, port=self.port)
             利用上面获得参数创建一个wsgi服务实例。(详见3.3)

 

     2. serve()函数

         a. _launcher = Launcher()
            创建一个Launcher实例。该实例用来创建eventlet线程池并启动服务。
         b. _launcher.launch_server(server)
                     线程池中启动服务server,并最终调用server的strart()函数启动服务。  即启动wsgi服务实例的start()函数。(详见3.5)

 

 

3.nova.wsgi

    1. Loader.__init__()
        a. config_path = config_path or FLAGS.api_paste_config
            self.config_path = self._find_config(config_path)
            从标记中获取配置文件的名字,并利用_find_config函数找到该文件所在的路径保存到self.config_path中。
    3. Loader.load_app
        a. return deploy.loadapp("config:%s" % self.config_path, name=name)
           利用paste.deploy第三方库载入配置文件指定的app。
    4. Server.__init__()
        a. 该函数仅仅初始化参数,配置日志等参数,实例化该类。
    5. Server.start(self, backlog=128)
        a. self._socket = eventlet.listen((self.host, self.port), backlog=backlog)
            利用eventlet.listen创建一个socket监听宿主机的端口。
        b. self._server = eventlet.spawn(self._start)
            线程池中调用Server._start()函数启动服务。详见(3.6)
    6. Server._start()
        a. eventlet.wsgi.server(self._socket, self.app, custom_pool=self._pool, log=self._wsgi_logger)
利用eventlet.wsgi.server函数启动wsgi服务监听宿主机的端口号。直到该服务退出,利用Server.wait()函数回收资源。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值