一、为什么要用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泛化调用完整代码