集群目錄服務(wù)Directory, 代表多個Invoker, 可以看成List<Invoker>,它的值多是動態(tài)變化的比如注冊中心推送變更。集群選擇調(diào)用服務(wù)時通過目錄服務(wù)找到所有服務(wù)
Directory的接口定義
public interfaceDirectory<T> extends Node {
//服務(wù)類型
Class<T>getInterface();
//列出所有服務(wù)的可履行對象
List<Invoker<T>>list(Invocation invocation) throws RpcException;
}
Directory有兩個具體實現(xiàn)
StaticDirectory: 靜態(tài)目錄服務(wù), 它的所有Invoker通過構(gòu)造函數(shù)傳入, 服務(wù)消費方援用服務(wù)的時候, 服務(wù)對多注冊中心的援用,將Invokers集合直接傳入 StaticDirectory構(gòu)造器,再由Cluster假裝成1個Invoker
StaticDirectory的list方法直接返回所有invoker集合
RegistryDirectory: 注冊目錄服務(wù), 它的Invoker集合是從注冊中心獲得的, 它實現(xiàn)了NotifyListener接口實現(xiàn)了回調(diào)接口notify(List<Url>)。
比如消費方要調(diào)用某遠(yuǎn)程服務(wù),會向注冊中心定閱這個服務(wù)的所有服務(wù)提供方,定閱時和服務(wù)提供方數(shù)據(jù)有變動時回調(diào)消費方的NotifyListener服務(wù)的notify方法NotifyListener.notify(List<Url>) 回調(diào)接口傳入所有服務(wù)的提供方的url地址然后將urls轉(zhuǎn)化為invokers, 也就是refer利用遠(yuǎn)程服務(wù)
到此時援用某個遠(yuǎn)程服務(wù)的RegistryDirectory中有對這個遠(yuǎn)程服務(wù)調(diào)用的所有invokers。
RegistryDirectory.list(invocation)就是根據(jù)服務(wù)調(diào)用方法獲得所有的遠(yuǎn)程服務(wù)援用的invoker履行對象