dubbo作為消費者註冊過程分析

2021-06-23 10:04:02 字數 2211 閱讀 4735

請支援原創:

先大概了解一下系統作為乙個消費者從啟動到註冊完成的過程

系統啟動時,引用service時首先將系統本身自己需要引用的服務註冊到zookeeper,然後訂閱系統需要的服務,最後,會接收到zookeeper傳送的訂閱資訊。比如乙個消費者註冊了乙個userservice,系統在啟動時,首先宣告自己是userservice的乙個消費者,然後再向zookeeper宣告自己需要訂閱userservice,最後,從zookeeper接收訂閱的服務,然後儲存到本地。

如果同時引用多個介面,則上面的服務會重複執行多次。

montitorservice是在執行的時候,才執行訂閱。

問題:

1、dubbo是通過哪個類跟zookeeper進行互動的?

2、dubbo把訂閱的資訊儲存到了哪個類?

registryprotocol.dorefer這裡面進行的註冊,將呼叫failbackregistry.registry進行真正的註冊,實際跟zookeeper進行互動,呼叫的是zookeeperregistry的doregistry方法。如果註冊失敗,會將url新增定定時任務中進行重試。

abstractregistry.notify真正接收到zookeeper的通知。在那兒將notify介面新增到zookeeper的改變事件的呢?

在zookeeperregistry**的dosubscribe方法中(與zookeeper進行互動的**中),將訂閱的介面傳送給zookeeper,並且從zookeeper取得可用的服務列表。

zookeeperregistry**:

zkclient.create(path, false

);//

這個是zookeeper返回客戶端訂閱的服務

listchildren =zkclient.addchildlistener(path, zklistener);

if (children != null

) 在迴圈之外,將已經可用的列表進行通知。

notify(url, listener, urls);,呼叫了abstractregistry.notify

abstractregistry在收到通知後,將url進行儲存,繼續通知notifylistener。

notifylistener是在哪兒放入registry的呢?

在registryprotocol訂閱服務的時候,會呼叫registrydirectory.subscribe方法。registrydirectory這類本身就實現了notifylistener介面,在呼叫failbackregistry的subscribe方法的時候,把自己當成乙個引數傳遞給了abstractregistry物件。所以abstractregistry在收到通知後,繼續通知的是registrydirectory。

registrydirectory這個類維護著從本地方法到遠端方法的對映關係,遠端引數到本地方法的呼叫關係等。

在註冊過程中的幾個主要類

zookeeperregistry:負責與zookeeper進行互動

registryprotocol:從註冊中心獲取可用服務,或者將服務註冊到zookeeper,然後提供服務或者提供呼叫**。

registrydirectory:維護著所有可用的遠端invoker或者本地的invoker。這個類實現了notifylistner。

notifylistener:負責registrydirectory和zookeeperregistry的通訊。

failbackregistry:繼承自registry,實現了失敗重試機制。

回答一開始的問題

1、通過zookeeperregistry和zookeeper進行互動,相關的類還有zookeeperclient,zkclientzookeeperclient和org.i0itec.zkclient.zkclient類。通過這些類的方法,實現服務的註冊和訂閱及資訊的傳遞。

2、主要是abstractregistry和registrydirectory這兩個類。其中registrydirectory儲存的可供客戶端直接呼叫的invoker,而abstractregistry這個類主要儲存的是已經註冊的服務介面,已經訂閱的服務介面和已經收到通知的介面的url,不能直接呼叫。

dubbo消費者註冊到zookeeper失敗

概要 1.vm部署linux,然後部署了zookeeper服務,dubbo admin管理中心 2.本機開啟兩個工程,服務提供者 成功註冊 消費者 tomcat啟動未報異常,但是在dubbo admin就是找不到消費者 原因 在除錯其他bug時,不小心把依賴刪除了 com.github.sgrosc...

Dubbo發布過程中,消費者呼叫過程

目錄2.遠端物件rpcinvocation 我們從controller開始看起,當我們發起乙個request請求的時候,controller呼叫的是service,此處我們呼叫的dubbo引用服務的 類 iuserservice是乙個介面,實際呼叫的是乙個 類,我們接著往下看 restcontrol...

ribbon eureka註冊中心消費者

解決問題 負載均衡及遠端呼叫以及重試等 spring cloud ribbon是乙個基於http和tcp的客戶端負載均衡工具,它基於netflix ribbon實現。通過spring cloud的封裝,可以讓我們輕鬆地將面向服務的rest模版請求自動轉換成客戶端負載均衡的服務呼叫。spring cl...