請支援原創:
先大概了解一下系統作為乙個消費者從啟動到註冊完成的過程
系統啟動時,引用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...