首先來看一下directory接口的實現類,他主要有兩個實現類,一個是StaticDirectory,一個是RegistryDirectory
其實這個也是道很好的面試題,他還是可以區分三種人
一種是停留在使用層面的,沒看過源碼的,因此他不會懂得這兩個實現類
第二種是看過官網如下描述,因此認為directory的實現類都是動態變化的
Directory 代表多個 Invoker,可以把它看成 List,但與 List 不同的是,它的值可能是動態變化的,比如注冊中心推送變更
第三種則是有看過源碼的,其實從StaticDirectory中的Static關鍵詞來看,就知道,這個其實是不會動態變化的,從下圖知道,他的Invoker是通過構造函數傳入,StaticDirectory用得比較少,主要用在服務對多注冊中心的引用
本文介紹的重點是RegistryDirectory,首先來看看他的繼承結構
這個NotifyListener中的notify方法就是注冊中心的回調,也就是它之所以能根據注冊中心動態變化的根源所在.
下面放一個上篇中集群容錯的整體架構中的一個圖喚醒大家的對Directory記憶
從中可以看出,Directory獲取invoker是從methodInvokerMap中獲取的,從這個圖也可以看出,這些主要都是讀操作,那它的寫操作是在什么時候寫的呢?就是在回調方法notify的時候操作的
也就是注冊中心有變化,則更新methodInvokerMap和urlInvokerMap的值(這個后面講服務引用原理的時候會再提一下),這就是官網提到的它的值可能是動態變化的,比如注冊中心推送變更的原因所在.


