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。