當前位置:
首頁 > 知識 > Dubbo動態調用實現

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);
}

Dubbo動態調用實現

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 程序員小新人學習 的精彩文章:

代碼生成x264編碼flv記錄
curl不能支持https問題-解決

TAG:程序員小新人學習 |