一、爲什麼要用dubbo泛化調用
泛化接口調用方式主要用於客戶端沒有 API 接口及模型類元的情況,參數及返回值中的所有 POJO 均用 Map 表示,通常用於框架集成,比如:實現一個通用的服務測試框架,可通過 GenericService 調用所有服務實現。
二、查找dubbo地址和端口
進行dubbo接口測試之前首先需要知道dubbo接口的端口號,如果provider註冊時已經指定了dubbo端口,直接使用就可以,如果沒有指定就需要連接註冊中心查看對應的端口,以下是在zookeeper查看dubbo端口的方法:
- 連接zk查看
# 切換到zookeeper的bin目錄下 ./zkCli.sh -server zk服務地址:zk服務端口 ls /dubbo_group/com.xxx.xxx.xxxService/providers
- 解碼zk結果
zk查看結果是經過編碼的URL,所以通過URL解碼的方式解碼就可以,貼一個我自己使用的解碼網址:在線解碼
三、使用telnet命令進行接口調試
從 2.0.5 版本開始,dubbo 開始支持通過 telnet 命令來進行服務治理。
- 使用telnet命令連接dubbo
telnet dubbo_provider_ip dubbo_port
- telnet常用命令
# 顯示服務列表 ls # 顯示服務詳細信息列表 ls -l # 顯示服務的方法列表 ls xxxService # 顯示服務的方法詳細信息列表 ls -l xxxService # 調用服務的方法 invoke xxxService.method # 調用服務的方法(自動查找包含此方法的服務) invoke method
四、泛化調用核心代碼
public Object dubboGeneric(DubboDto dto){
logger.info(">>>>>調用dubbo服務接口,入參:{}", dto);
// 引用遠程服務
// 該實例很重量,裏面封裝了所有與註冊中心及服務提供方連接,請緩存
ReferenceConfig<GenericService> reference = new ReferenceConfig<>();
// 弱類型接口名
reference.setInterface(dto.getInterfaceName());
// 聲明爲泛化接口
reference.setGeneric(true);
reference.setApplication(new ApplicationConfig(dto.getApplication()));
reference.setVersion(dto.getVersion());
reference.setTimeout(dto.getTimeout());
reference.setUrl(dto.getUrl());
// 獲取緩存中的實例
ReferenceConfigCache cache = ReferenceConfigCache.getCache();
GenericService genericService = cache.get(reference);
// 用org.apache.dubbo.rpc.service.GenericService可以替代所有接口引用
// 基本類型以及Date,List,Map等不需要轉換,直接調用
// 調用實例
Object result = genericService.$invoke(dto.getMethod(), dto.getParameterTypes(), dto.getArgs());
logger.info(">>>>>調用dubbo服務接口,出參:{}", result);
return result;
}
歡迎大家一起交流,完整代碼傳送門:dubbo泛化調用完整代碼