openstack源码分析二

本期我开始讲服务的创建,os服务有两种服务,一种是api服务,一种组件之间用于通信的服务,我们先来说一下组件之间的通信服务是如何创建的以及怎么工作的。

 如上期所说,os每个组件都有一个service模块,这个模块是专门用来创建服务实例的,是一个通用的服务基础类,该类负责对应服务实例的初始化,创建和启动,以及服务请求的处理。

我们先看类的初始化方法:

该初始化方法里有主机名的处理,二进制服务名称,消息队列服务主题topic,服务对应处理类(manager 模块),组件服务周期状态报告的周期值,以及组件周期执行的任务间隔时间等等。我们随着服务的创建代码来一一分析每个作用,后边一期我们部署一下服务跑一下看看他们的具体运作展示。

未完待续。

服务创建代码是Service类里一个类方法,如下:

我们看到,我们运行nova服务启动时,运行的是这个nova-compute python脚本,那么topic就是这个如上所述说,是这个名脚本名称的一部分,也就是compute,后边我们会说,manager自然就是compute_manager了,我们也看到了,所有参数都有默认值。

再往下看,该方法代码不多,如下:

开始处理主机名,默认从flags模块获取,flags模块存储了服务启动所有的依赖信息和默认值,它在flags模块里是这样定义的:

接下来是binary,加入我们运行nova-compute脚本,那这个值就是:nova-compute,topic是由一下代码获取的:

topic = binary.rpartition("nova-")[2],本例就是compute

manager对于本例来说就是compute_manager,report_interval就在service模块内定义着,10s同步一下节点的状态,periodic_interval默认是1分钟,一分钟执行一次我们设置的定期执行的任务。然后使用如下代码实例化类:

service_obj = cls(host, binary, topic, manager,
                  report_interval, periodic_interval)

该方法返回服务实例对象。服务的元数据ok了,也就是说服务已经创建出来了,接着我们需要启动服务,再看:

该类里的start方法负责服务实例的启动,该方法一开始先利用工具方法import manager类,也就是ComputeManager,这个类的名字来源于flags的对应关联:

DEFINE_string('compute_manager', 'nova.compute.manager.ComputeManager',
              'Manager for compute')

紧接着实例化该manager类,如上图所示,这个实例化主要是初始化虚拟化驱动,也就是创建vm时用的driver,以及网络,存储所用的操作driver。然后利用实例化后的manager的对象调用其内部提供的init_host方法初始化nova-compute实例所对应的主机数据初始化(主要是virtualization driver相关)。

 

接下下是数据库的信息获取,再下边是个比较重要的步骤了,如图:

创建了两个rpc连接,其实就是两个rabbitmq broker。我们可以发现,nova代码目录下有个rpc模块,什么东西?AMQP-based RPC. Queues have consumers and publishers.,对,就是基于消息队列实现的rpc框架,该模块里有和rabbitmq建立关系的Connection类,用的框架库就是carrot,从代码看是继承的该carrot类。

建立了到两个rabbitmq的连接后,接着代码就开始初始化消费者服务,上边的连接作为参数传入,这个时候只是创建了消费者实例,还没有真正开始工作。再看:

这些其实利用协程机制创建一个可以调用的协程对象,实现消息的接收和周期任务的执行。 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章