本博客欢迎转载,但请注明出处 http://blog.youkuaiyun.com/ringoshen/article/details/51321540
由于能力与时间有限,文章内容难免错漏,望大家多加指正,相互进步!
0. 总览
nova的服务在功能上主要分为应用层和逻辑层两类,nova-api就是应用层的服务,而nova-scheduler、nova-conductor等则是逻辑层服务。本文主要通过注释的方式讲述nova-api服务的启动流程。
首先看一下main函数,之后针对几个重要的部分简单跟踪一下。
# nova/cmd/api.py
def main():
# 加载命令行传入的参数,设置数据库和RPC,argv是服务启动命令的参数列表,
# ['/usr/local/bin/nova-api', '--config-file', '/etc/nova/nova.conf']
config.parse_args(sys.argv)
# 直接调用oslo_log.log设置服务的日志文件
logging.setup(CONF, "nova")
# 打补丁的方式导入模块,但默认不开启
utils.monkey_patch()
# 其实就是import objects模块的各个object,在RPC接收时用到
objects.register_all()
# 根据wiki的解释,应用于admin了解系统运行细节,
# 通过信号量的方式进行触发,可生成极为详细的运行报告
gmr.TextGuruMeditation.setup_autorun(version)
# 创建一个ProcessLauncher对象,也就是服务启动器
launcher = service.process_launcher()
# 创建api,我的默认配置是enabled_apis = osapi_compute,metadata
for api in CONF.enabled_apis:
# 默认都不使用ssl
should_use_ssl = api in CONF.enabled_ssl_apis、
# 创建相应api的WSGIService对象
server = service.WSGIService(api, use_ssl=should_use_ssl)
# 启动相应api的服务
launcher.launch_service(server, workers=server.workers or 1)
# 监控api服务的worker,不正常结束就reset;接收到终止的信号量就kill workers
launcher.wait()
以下是本文涉及到的一些文件目录
1. 解析命令行参数
主要是设置默认的配置,其中最主要的是RPC的设置和初始化,我的环境的默认driver是rabbitmq。
# nova/config.py
def parse_args(argv, default_config_files=None, configure_db=True,
init_rpc=True):
# 设置oslo_log使用的默认选项
log.set_defaults(_DEFAULT_LOGGING_CONTEXT_FORMAT, _DEFAULT_LOG_LEVELS)
# 注册命令行和配置选项
log.register_options(CONF)
# 设置DB相关的默认选项
options.set_defaults(CONF, connection=_DEFAULT_SQL_CONNECTION,
sqlite_db='nova.sqlite')
# 设置RPC的默认选项,设置默认exchange为nova
rpc.set_defaults(control_exchange='nova')
# ===== 这三个默认配置并不是很懂,之后看懂了补上 =====
cache.configure(CONF)
debugger.register_cli_opts()
config.set_middleware_defaults()
# ====================================================
# 解析命令行参数和配置文件
CONF(argv[1:],
project='nova',
version=version.version_string(),
default_config_files=default_config_files)
# 初始化RPC。之前都是些默认配置,RPC的初始化过程稍微复杂一些,涉及stevedore模块,
# 主要涉及几个对象:TRANSPORT, NOTIFICATION_TRANSPORT, LEGACY_NOTIFIER, NOTIFIER
if init_rpc:
rpc.init(CONF)
# 配置sqlalchemy api
if configure_db:
sqlalchemy_api.configure(CONF)
2. Guru Meditation Reports
这个模块主要是进行对系统操作的监控,这里可以看一看wiki里的一个展示看一下效果。
如果有兴趣可以看一下wiki的详细解释 Guru Meditation Reports
========================================================================
==== Guru meditation report ====
========================================================================
UUID: 6d4faf99-480c-4d0c-90be-b7d090ecd83e
Time: Mon, 18 Feb 2013 18:01:11 +0000
========================================================================
==== Config ====
========================================================================
DEFAULT:
allow_resize_to_same_host=True
allow_same_net_traffic=True
allowed_direct_url_schemes=[]
allowed_rpc_exception_modules=['nova.openstack.common.exception', 'nova.exception', 'cinder.exception', 'exceptions']
api_paste_config=/etc/nova/api-paste.ini
api_rate_limit=True
auth_strategy=keystone
auto_assign_floating_ip=False
backdoor_port=None
bandwidth_poll_interval=600
base_dir_name=_base
bindir=/home/berrange/src/cloud/nova/bin
... ... ... ...
... ... ... ...
Thread ID 3
/usr/lib/python2.7