天天看點

 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庫的類。

繼續閱讀