openstack老版本的消息定义处理记录以及代码的组
少儿音乐
betwayapp
admin
2020-06-11 06:51

  我们本次分析的代码版本是nova-2011,从代码的分析来看,代码组织结构还是挺规整的。

  我们先看目录树,如下:

  

  bin目录之前已经介绍过了,他们是服务启动脚本工具,我们主要看nova目录,nova目录下基本上每个目录就是一个nova子服务,这些子服务都一定程度上继承了nova目录下的各个模块文件。

  service.py:用来创建服务,启动服务实例的基础类定义,novs所有的组件服务都通过他实例化

  rpc.py:os各个组件之间的通信都是依靠该模块提供的rpc机制实现,主要是rabbitmq服务,里边定义了众多的消费者和生产者类的定义,比如:

  基于topic的消息消费者类型,初始化的时候除了连接mq的conn对象和topic之外,还有一个proxy对象,这是什么呢?从代码看,这里传的是compute_manager类的实例化后的对象,该对象定义真正的对vm生命周期的管理操作,所以这个proxy是这个类的实例化的对象值,可以用来操作vm。这个类里有个方法:

  当接收到mq传来的消息时,我们看到消息体里有请求上下文,需要执行的方法以及传给方法的参数。我们要执行消息告诉给我们的方式时,肯定是某个manager提供的,所以会有 getattr(self.proxy, str(method))这个操作,方法要么是某个类的方法,要么是单独的模块方法。显然这里调用的是类实例方法,但是从manager的构造来看,getattr是不能直接获取到对应的method的,我们继续查看代码,发现service.py 里的服务创建类里做了一个getattr重写:

  这也是rpc模块能正确获取到实例方法地址的诀窍之处。

  manager.py:这个模块是nova所有组件manager都要继承依赖的操作类,其他组件负责实现增加自己的所有操作,该顶级模块只是定义了简单的几个没有实现的抽象方法,比如:周期函数periodic_tasks,各组件初始化函数:init_host,以及db的实例化操作对象。我们看到每个组件代码目录下都有一个manager.py,继承了上层目录的manager.py,理解起来也不难。

  flags.py:该模块定义了nova服务生命周期里需要的环境配置类信息,方便使用一些固化的配置信息

  exception.py:这里定义了基本的异常处理类和函数,主要是一堆装饰器函数。

  log.py:主要定义nova的日志模块通用的使用方法。

  我们再来看消息处理。

  消息这块其实不太复杂,主要就是定义好连接mq的信息以及消息发布者和订阅者的处理就算基本搭好了框架。