15. Dubbo原理解析-集羣&容錯之目錄服務Directory

集羣目錄服務Directory, 代表多個Invoker, 可以看成List<Invoker>,它的值可能是動態變化的比如註冊中心推送變更。集羣選擇調用服務時通過目錄服務找到所有服務

Directory的接口定義

public interfaceDirectory<T> extends Node {

    //服務類型

Class<T>getInterface();

//列出所有服務的可執行對象

List<Invoker<T>>list(Invocation invocation) throws RpcException;

}

Directory有兩個具體實現


 

StaticDirectory: 靜態目錄服務, 它的所有Invoker通過構造函數傳入, 服務消費方引用服務的時候, 服務對多註冊中心的引用,將Invokers集合直接傳入 StaticDirectory構造器,再由Cluster僞裝成一個Invoker


StaticDirectory的list方法直接返回所有invoker集合

 

 

RegistryDirectory: 註冊目錄服務, 它的Invoker集合是從註冊中心獲取的, 它實現了NotifyListener接口實現了回調接口notify(List<Url>)。

比如消費方要調用某遠程服務,會向註冊中心訂閱這個服務的所有服務提供方,訂閱時和服務提供方數據有變動時回調消費方的NotifyListener服務的notify方法NotifyListener.notify(List<Url>) 回調接口傳入所有服務的提供方的url地址然後將urls轉化爲invokers, 也就是refer應用遠程服務


到此時引用某個遠程服務的RegistryDirectory中有對這個遠程服務調用的所有invokers。

RegistryDirectory.list(invocation)就是根據服務調用方法獲取所有的遠程服務引用的invoker執行對象

發佈了69 篇原創文章 · 獲贊 99 · 訪問量 46萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章