集羣目錄服務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執行對象