2024年6月5日发(作者:)

NOVA-API服务的启动流程

1. -api

1. t_flagfile()

获取配置文件路径,并将其放入环境变量中。

2. ())

调用FlagValues的__call(self,argv)函数,对进行“getopt”处

理。(详见Nova-Flags分析)

3. ()

进行nova-api的日志设置。(详见Nova-Logging分析)

4. _patch()

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

5. servers = []

for api in d_apis:

(rvice(api))

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

节)

6. (*servers)

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

2. e

1. WSGIService.__init__()函数

a. = name

为'ec2'或'osapi'

b. = loader or ()

创建一个loader实例,用来装载配置文件。(详见

3.1)

c. = _app(name)

利用第三方软件载入配置文件中指定的name应用。(详

见3.2)

d. = getattr(FLAGS, '%s_listen' % name, "0.0.0.0")

从标记中获取主机的地址

e. = getattr(FLAGS, '%s_listen_port' % name,

0)#ec2=8773,osapi=8774

从标记中获取服务端口的地址

f. = (name, , host=,

port=)

利用上面获得参数创建一个wsgi服务实例。(详见3.3)

2. serve()函数

a. _launcher = Launcher()

创建一个Launcher实例。该实例用来创建eventlet线程池并启动服

务。

b. __server(server)

线程池中启动服务server,并最终调用server的strart()函数启

动服务。即启动wsgi服务实例的start()函数。(详见3.5)

3.

1. Loader.__init__()

a. config_path = config_path or _paste_config

_path = self._find_config(config_path)

从标记中获取配置文件的名字,并利用_find_config函数找到该文件所

在的路径保存到_path中。

3. _app

a. return p("config:%s" % _path,

name=name)

利用第三方库载入配置文件指定的app。

4. Server.__init__()

a. 该函数仅仅初始化参数,配置日志等参数,实例化该类。

5. (self, backlog=128)

a. self._socket = ((, ),

backlog=backlog)

利用创建一个socket监听宿主机的端口。

b. self._server = (self._start)

线程池中调用Server._start()函数启动服务。详见(3.6)

6. Server._start()

a. (self._socket, ,

custom_pool=self._pool, log=self._wsgi_logger)

利用函数启动wsgi服务监听宿主机的端口号。

直到该服务退出,利用()函数回收资源。