天天看点

 oslo.messaging库

 oslo.messaging库为OpenStack各个项目使用RPC和事件通知(Event Notification)提供了一套统一的接口。

oslo.messaging库是支持amqp、kafka等通信协议的,由于openstack使用amqp协议,且默认使用kombu的库来进行amqp协议通信,因此我们主要围绕着kombu实现的amqp的driver来剖析。

oslo.messaging提供的RPCClient类用于RPC调用,主要提供了两个接口call及cast,分别表示同步rpc调用及异步rpc调用,在openstack里也是使用这两个接口进行RPC调用的。接下来我们就从这个类入手。首先,看下该类类图:

 oslo.messaging库

RPCClient继承于_BaseCallContext类,call、cast的实现主要是在_BaseCallContext类,在这两个函数里主要是调用Transport._send来进行调用。其中_CallContext继承_BaseCallContext类主要是实现类方法_prepare,后续RPCClient的prepare直接调用该类方法,该方法可以用于设置调用RPC前的一些参数。从上面的类图看,真正实现功能的是Transport类,接下来我们看下Transport类的类图:

 oslo.messaging库

从Transport的_send()源码可以看到它是调用self._driver.send函数来实现的,而这里核心点就在于这个_driver,这里还要注意的是有一个全局的get_transport函数用于创建具体的Transport对象,相当于一个Factory函数,在里面我们将看到它使用了stevedore库里的driver.DriverManager方法来实现后端driver的创建。

stevedore库是oslo项目中为OpenStack其他项目提供动态加载功能的公共组件库。stevedore利用python的特性,使得动态加载代码变得更加容易,其也允许你在运行时通过发现和加载扩展插件来配置和扩展你的应用程序。这里get_transport就是通过在传入的url来搜索合适的后端driver,在setup.cfg文件我们可以看到不同的driver:

oslo.messaging.drivers =

      rabbit = oslo_messaging._drivers.impl_rabbit:RabbitDriver

      amqp = oslo_messaging._drivers.impl_amqp1:ProtonDriver

      # This driver is supporting for only notification usage

     kafka = oslo_messaging._drivers.impl_kafka:KafkaDriver

     # To avoid confusion

     kombu = oslo_messaging._drivers.impl_rabbit:RabbitDriver

     # This is just for internal testing

     fake = oslo_messaging._drivers.impl_fake:FakeDriver

由上面配置可以看出使用kmobu对应的driver是oslo_messaging._drivers.impl_rabbit:RabbitDriver,因此,我们接着看RabbitDriver的类图。

 oslo.messaging库

从上面的类图可以看到所有的后端driver都是继承于BaseDriver这个接口类,而RabiitDriver继承AMQPDriverBase类,AMQPDriverBase实现了RPC通信的业务逻辑,通过在ConnectionPool中获取具体的connection,再调用具体connection相对应的发送函数(direct_send、topic_send等)。而RabbitDriver继承AMQPDriverBase类后,主要功能是在类初始化时把ConnectionPool跟对应的Connection对象初始化好。在代码中也可以看出Connection是最终调用combu库的类。

继续阅读