您的位置:首页 > 其它

NOVA-API服务的启动流程

2013-01-08 15:11 316 查看
原文地址: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分析)
/article/7808267.html

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()函数回收资源。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: