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的連接後,接着代碼就開始初始化消費者服務,上邊的連接作爲參數傳入,這個時候只是創建了消費者實例,還沒有真正開始工作。再看:

這些其實利用協程機制創建一個可以調用的協程對象,實現消息的接收和週期任務的執行。 

 

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