07.計算Nova→4.源碼→2.RPC機制

  1. Nova 中各個服務之間的通訊使用了基於 AMQP 實現的 RPC 機制
  2. 其中 nova-compute、nova-conductor 和 nova-scheduler 在啓動時都會註冊一個 RPC Server監聽有誰要連我,而 nova-api 由於 Nova內部並無服務會調用它提供的接口,因此無需註冊,下面以nova-compute爲例
    1. 一般是供其它組件調用的封裝庫。換句話說,該模塊一般並不會由本模塊調用。
       1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      #nova/nova/compute/api.py
      
      from nova.compute import rpcapi as compute_rpcapi
      
      class API(base.Base):
      """API for interacting with the compute manager."""
      
      def start(self, context, instance):
      """Start an instance."""
      LOG.debug("Going to try to start instance", instance=instance)
      
      instance.task_state = task_states.POWERING_ON
      instance.save(expected_task_state=[None])
      
      self._record_action_start(context, instance, instance_actions.START)
      #調用類 nova.compute.rpcapi.ComputeAPI 中的接口
      self.compute_rpcapi.start_instance(context, instance)
    2. 類nova.compute.rpcapi .ComputeAPI中的函數即爲Compute服務提供給 RPC調用的接口,其餘服務調用前須要首先 import 這個模塊。
       1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      #nova/nova/compute/rpcapi.py
      class ComputeAPI(object):
      '''Client side of the compute rpc API.
       '''
      
      def start_instance(self, ctxt, instance):
      version = self._ver(ctxt, '4.0')
      cctxt = self.router.client(ctxt).prepare(
      server=_compute_host(None, instance), version=version)
      
      cctxt.cast(ctxt, 'start_instance', instance=instance)
      
      RPC cast 主要用於異步形式,好比建立虛擬機,在建立過程可能須要很長時間,若是使用 RPC call (call方法是遠程過程調用帶有返回值的方法)顯然對性能有很大影響。cast()的第二個參數是RPC 調用的函數名(cast方法是遠程過程調用,不帶有返回值的方法),後面的參數將做爲參數被傳入該函數
      這裏爲何寫的是Client呢:這個是RPC請求的封裝,或者說是RPC封裝的client端,該模塊封裝了RPC請求調用
    3. nova.compute.rpcapi .ComputeAPI 只是暴露給其餘服務的 RPC 調用接口,Compute 服務的RPC Server 接受到 RPC 清求後,真正完成任務的是nova.compute.manager 模塊
      1
      2
      3
      4
      5
      6
      7
      8
      9
      #nova/nova/compute/manager.py
      class ComputeManager(manager.Manager):
      """Manages the running instances from creation to destruction."""
      @wrap_exception()
      @reverts_task_state
      @wrap_instance_event(prefix='compute')
      @wrap_instance_fault
      def start_instance(self, context, instance):
      """Starting an instance on this host."""
      這個纔是真正服務的功能實現,也是RPC的服務端,即處理RPC請求的入口,實現的方法一般和rpcapi實現的方法一一對應。
    4. 從nova.compute.rpcapi.ComputeAPI到nova.compute.manager.ComputeManager 的過程便是RPC 調用過程
    5. 例子:對一個虛擬機執行關機操做  由下面的過程也能夠知道OpenStack項目的目錄結構並非根據組件嚴格劃分,而是根據功能劃分。好比compute目錄並非必定在nova-compute節點上運行,而主要是和compute相關
      1. API節點:
        1. nova-api接收用戶請求在nova/api目錄
        2. nova-api調用nova/compute/api.py
        3. compute/api調用nova/compute/rpcapi.py
        4. rpcapi.py向目標計算節點發起stop_instance()RPC請求
      2. 計算節點:
        1. 收到stop_instance()請求
        2. 調用nova/compute/manager.py的callback方法回調函數stop_instance()
        3. 調用libvirt關閉虛擬機
相關文章
相關標籤/搜索