openstack G版源码分析

     Nova在整个openstack中是代码最多的一部分也是最复杂的一部分。如果对这部分代码和架构有比较深的理解,就可以说对整个openstack的程序架构有了一个比较深的理解,这里将分步骤的进行相关的讲解,这一章先从一些核心的概念讲起。

      先提一下几个在openstack中非常重要的基本概念Server,Manager,Driver。Server顾名思义就是服务,openstack的各种应用都是以服务的形式暴露出来,openstack中主要有两种服务一种是以linux中的服务守护进程方式存在,一种是WSGIService一种以WSGI标准形式存在的web服务。在这里讨论的server就是第一种形式的服务。这个server的主要存在形式就是一个消息队列的守护进程,接受特定topic的消息执行相应的命令,对外提供一个rpc接口,一个sever对应一个topic。一个server要有什么样的具体功能,也就是可以对外提供什么样的服务功能,是由其中的manager来决定,manager顾名思义就是管理者,主要提供管理功能,具体的操作是由manager中定义driver决定的,一个driver可以看做是一个worker,在manager的管理协调下(manager可以调用其他相关模块功能,结合driver)执行相关的工作,为外界提供相关服务应用。

      我们以nova_compute service为例,从实际代码中深入理解一下上边介绍的基本概念。服务的启动时通过执行源代码中nova_master/bin目录中的nova_compute文件来实现服务的启动。

View Code
def main():
    config.parse_args(sys.argv)
    logging.setup('nova')
    utils.monkey_patch()

    if not CONF.conductor.use_local:
        block_db_access()

    server = service.Service.create(binary='nova-compute',
                                    topic=CONF.compute_topic,
                                    db_allowed=False)
    service.serve(server)
    service.wait()

 

其中create函数相当于一个工厂方法,利用python的语言特性根据出入的参数动态生成了一个server对象,其中binary可以理解为server的名,topic就是消息队列中要监听的topic,db_allowed主要是限制sever是否可以直接访问数据库(g版主要通过conductor来访问数据库,来减小数据库访问压力)。然后通过eventlet的方式启动服务守护进程,等待对应topic的请求。Manager是可以手动的方式通过create的方式传入,如果没有显示声明就解析binary参数的值来得到Manager的字符串的名字来通过动态载入的方式载入对应的Manager对象。这里自动解析到nova_master/nova/compute中的manager.py中的ComputeManager对象。其中的driver也是通过动态载入的方式得到的,相应的driver的名字是通过openstack的配置框架通过配置的方式来实现的。

    总体说来,这种程序的实现方式是非常的灵活和优雅的,非常容易扩展和修改,其中一个Manager可以对应几个driver按道理来说可以是多个,但根据程序中的注释,作者的回答是一个,应该是为了实现单一原则吧。

由于本人水平有限其中的一些理解可能不到位,希望大家多指正。

(注:这里对高级消息队列,topic,eventlet等一些概念不作解释如果有不清楚的朋友可以上网查看)

posted @ 2013-05-08 15:12  wangyish201  阅读(836)  评论(0编辑  收藏  举报