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的信息以及消息發布者和訂閱者的處理就算基本搭好了框架。

天天彩票三分彩靠谱吗