Dubbo動態調用實現
問題提出
Dubbo常用使用方式大家都比較熟悉,確定好服務的與服務之間調用關係,確定好相關介面參數,基於spring配置好,啟動provider,然後啟動consumer去調用相關服務。但有這樣的一種場景:
- 所有的Provider的介面都相同,但每個系統有自己的不同實現。例如系統A和B都提供com.HelloService服務,但具體實現不一樣,需要Consumer端根據傳入參數來區分開來並調用
- Dubbo的Consumer端需要在
運行時
才知道調用具體的Dubbo服務,而這個<dubbo:reference/>並沒有在spring的bean中配置
解決方案
同一個服務不同實現版本
先來看第一種場景,可以通過配置group 的方式實現同一個服務的不同實現版本:
提供者dubbo端配置:
<dubbo:service interface="com.HelloService" group="groupA" ref="helloService" />
消費者consumer配置:
<dubbo:reference id="helloService"interface="com.HelloService" group="groupA"/>
說明:只有相同group的才能進行匹配,若要實現消費者任意調用提供者的某個服務,只需要把group設置為「*」,即:
<dubbo:reference interface="com.HelloService" group="*" id="helloService"/>
動態調用
需要在實際使用時,構造出Consumer端的服務類,並通過上述的group的方式區分不同的服務實現,如下:
public HelloService getInvokeService(String group) {
ApplicationConfig application = new ApplicationConfig();
application.setName("dubboConsumer");
RegistryConfig registry = new RegistryConfig();
registry.setAddress("127.0.0.1:2181");
registry.setProtocol("zookeeper");
ReferenceConfig<HelloService> referenceConfig = new ReferenceConfig<>();
referenceConfig.setApplication(application);
referenceConfig.setRegistry(registry);
referenceConfig.setGroup(group);
referenceConfig.setInterface(HelloService.class);
return referenceConfig.get();
}
性能優化
上述實現已經可以滿足我們提出的兩個要求,但是存在性能問題,因為每次調用該方法,都需要重新生成一個新的ReferenceConfig,並且調用get()方法獲取一個代理的實現,該實現封裝了與註冊中心的連接以及與提供者的連接。為了能夠重用該連接,可以將其緩存,這裡使用dubbo內置的簡單緩存工具類進行緩存,實現代碼如下:
public HelloService getInvokeService(String group) {
ApplicationConfig application = new ApplicationConfig();
application.setName("dubboConsumer");
RegistryConfig registry = new RegistryConfig();
registry.setAddress("127.0.0.1:2181");
registry.setProtocol("zookeeper");
ReferenceConfig<HelloService> referenceConfig = new ReferenceConfig<>();
referenceConfig.setApplication(application);
referenceConfig.setRegistry(registry);
referenceConfig.setGroup(group);
referenceConfig.setInterface(HelloService.class);
ReferenceConfigCache cache = ReferenceConfigCache.getCache();
return cache.get(referenceConfig);
}
※代碼生成x264編碼flv記錄
※curl不能支持https問題-解決
TAG:程序員小新人學習 |