dubbo源碼-RegistryProtocol(注冊中心和服務提供者的橋梁)


RegistryProtocol是Protocol的實現類,是注冊中心和服務提供者的橋梁,下面分析該類主要的兩個方法export(導出服務)、refer(引用服務)的實現流程,分析是如何實現服務導出和服務引用的。

export:

export比較簡單,先從invoker中抽取出服務提供者url,調用底層protocol(通過SPI 注入的具體protocol,比如dubbo protocol)的export執行導出,然后從invoker抽取出注冊中心url,在調用注冊中心的factory獲取注冊中心,最后進行服務的注冊。

 

refer:

refer因為涉及到服務提供者是集群提供,所以邏輯比export復雜一些,要依賴directory(前面博客有分析)的功能。

首先通過invoker的url獲取注冊中心的url配置信息,然后給獲取的注冊中心構建ServiceDiscoveryMigrationInvoker invoker。分析下這類Invoker:

 

 

這類Invoker都是以Migration(遷移)開頭的,不知道為啥是這個名字,有什么歷史故事。MigrationClusterInvoker繼承自Invoker主要定義了ServiceDiscoveryInvoker和InterfaceDiscoveryInvoker的刷新操作。

MigrationInvoker實現了MigrationClusterInvoker接口,底層依賴RegistyProtocol的getServiceDiscoveryInvoker和getInvoker接口獲取invoker並刷新自己維護的invoker,而RegistryProtocol這兩個方法獲取到的Invoker都是ClusterInvoker,唯一的差別的是傳入的directory一個是ServiceDiscoveryDirectory,一個是RegistryDirectory,在創建Directory后會在這里調用directory的訂閱方法,底層具體實現訂閱的注冊中心類里,比如zookeeperregistry里在訂閱完成以后會在調用DynamicDirectory的notify方法更新他們內部的invoker,這也是主要的注冊中心和服務提供者關聯的地方。 MigrationInvoker封裝了serviceDiscoveryinvoker和interfaceinvoker的選擇邏輯,底層還是依賴從RegistryProtocol中拿到的invoker的invoke方法。

再回到上面RegistryProtocol的refer流程里,獲取到MigrationInvoker這個實例后,又調用了定義的registryProtocolListener的onRefer方法,在唯一的實現MigrationRuleListener類中調用了MigrationInvoker的刷新invoker方法初始化MigrationInvoker類中的兩個invoker。

最后返回 MigrationInvoker作為最終的invoker。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM