古人云: 三思而后行
但对我们来说, 有什么地方值得去思呢?
任何事情, 如果能够身临其境,了解其来龙去脉,肯定是最好的学习方式。但是在代码走读时, 人不能像机器一样,去把代码都运行一次, 亲身去感受下。但是我们能在脑袋里运行代码, 但这里也有问题, 代码多了, 脑袋就不够用了,这个时候就要学会思。
不再废话, 回到我们的问题。上一章中, nova 命令行已经发送了一个基于HTTP的RESTful请求过来, 那么在nova服务中,nova需要干些什么呢?
既然是HTTP, 那么第一步,就是需要一个HTTP服务器, 实现HTTP服务器的方式有很多, 那么Openstack中又是怎么实现的呢?
在Python中, 对于WEB服务有一个标准,PEP333 Python Web Server Gateway Interface v1.0。Openstack就是根据这个标准来实现的。
下面我们就来看看nova的实现
入口
cat /usr/lib/systemd/system/openstack-nova-api.service
[Unit]
Description=OpenStack Nova API Server
After=syslog.target network.target
[Service]
Type=notify
Restart=always
User=nova
ExecStart=/usr/bin/nova-api
[Install]
WantedBy=multi-user.target
可以看出, 其执行文件是/usr/bin/nova-api, 继续打开这个文件cat /usr/bin/nova-api
#!/usr/bin/python
# PBR Generated from u'console_scripts'
import sys
from nova.cmd.api import main
if __name__ == "__main__":
sys.exit(main())
main
在nova.cmd.api中, main函数的代码如下,可以看出,就是分析了下参数,然后就启动了HTTP服务。在启动HTTP服务时, 首先创建了一个WSGIService对象, 这是一个基于WSGI标准的WEB服务器类。
def main():
config.parse_args(sys.argv)
logging.setup("nova")
utils.monkey_patch()
launcher = service.process_launcher()
#这里启动了好几个服务, 那么都有那些服务呢?
for api in CONF.enabled_apis:
should_use_ssl = api in CONF.enabled_ssl_apis
if api == 'ec2':
server = service.WSGIService(api, use_ssl=should_use_ssl,
max_url_len=16384)
else:
server = service.WSGIService(api, use_ssl=should_use_ssl)
launcher.launch_service(server, workers=server.workers or 1)
launcher.wait()
从代码中,我们看到, 启动了不止一个服务,那么到底启动了那几个服务呢?
$cat /etc/nova/nova.conf | grep enabled_apis
enabled_apis=ec2,osapi_compute,metadata
nova api事实上启动了三个服务
ec2: 与亚马逊兼容的API
osapi_compute: Openstack自己的API
metadata: 实例启动时的metadata服务
先不管这些服务的具体作用, 这不是这次的重点, 以后的内容中, 会讲到这些。现在看看我们今天的重点WSGIService。