接口测试-dubbo泛化调用

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章