除了Invoke,还能怎么调用Dubbo接口

285 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

前言

日常工作中,如果需要调用Dubbo接口,通常会先登录到服务部署的服务器,然后通过Invoke的方式来调用接口,那Dubbo接口测试除了通过telnet invoke来调用,还有其他的方式吗?

泛化调用

Dubbo官方文档中有一个示例,关于泛化调用Dubbo接口 这里截取官方文档中对于泛化接口调用的说明

泛化接口调用方式主要用于客户端没有 API 接口及模型类元的情况,参数及返回值中的所有 POJO 均用 Map 表示,通常用于框架集成,比如:实现一个通用的服务测试框架,可通过 GenericService 调用所有服务实现。

我们 通过 API 方式使用泛化调用 先引入官方提供的依赖服务

import com.alibaba.dubbo.rpc.service.GenericService;

使用 GenericService 请求dubbo接口


    public Object invokeDubboService(DubboTestQuery dubboTestQuery) {

        ReferenceConfig<GenericService> reference = new ReferenceConfig<GenericService>();
        ApplicationConfig applicationConfig = new ApplicationConfig();
        applicationConfig.setName("remoteInvoke");
        applicationConfig.setVersion("");
        RegistryConfig registryConfig = new RegistryConfig();

        registryConfig.setFile("/tmp/dubbo.cachr");
        // configZkAddress 就是你zookeeper的注册ip
        registryConfig.setAddress(configZkAddress);
        registryConfig.setProtocol("zookeeper");
        // 这里配置dubbo的注册中心信息,因此demo没有额外的dubbo.xml配置文件
        reference.setApplication(applicationConfig);
        reference.setRegistry(registryConfig);

        // 弱类型接口名
        reference.setInterface(dubboTestQuery.getServiceName());
        reference.setVersion("1.0.0");
        // 声明为泛化接口
        reference.setGeneric(true);
        reference.setProtocol("dubbo");
        //不重试,重试会造成数据重复执行
        reference.setRetries(0);
        reference.setTimeout(10000);

        // 用org.apache.dubboinfo.rpc.service.GenericService可以替代所有接口引用
        GenericService genericService = reference.get();
        Object result = genericService.$invoke(dubboTestQuery.getMethodName(), dubboTestQuery.getParamsTypes(),dubboTestQuery.getParams());
        return result;
    }

其中实体类DubboTestQuery字段(get,set方法这些就不放出来了)

public class DubboTestQuery {
    /*** Dubbo接口服务名*/
    private String serviceName;
	/*** 请求参数Dubbo接口方法名*/
    private String methodName;
    /*** 请求参数类型*/
    private String[] paramsTypes;
    /*** 请求参数*/
    private Object[] params;
}

这里简单说明一下这四个字段

  1. serviceName 接口服务名,比如:com.demo.test.IUserService
  2. methodName 接口下的方法名,比如:add(User user)
  3. paramsTypes 请求参数类型,因为一个方法包含多种类型的入参,所以这里用了一个List来一 一对应入参 如:["java.lang.String","int"] ,["com.demo.bo.userBo"]
  4. params 入参,根据入参类型来填入对应的参数 如["testdemo",1],[{"name":"test","age":18}]

这样就可以通过 API 方式使用泛化调用

总结

dubbo接口测试过程中通常会踩到一个版本的坑,那就是dubbo 2.7之后的版本和dubbo2.6之前的版本,在测试之前一定要检查好测试的版本。

新版本的dubbo接口管理后台DubboAdmin已经自带了接口调用工具,以后可以直接通过管理后台去调试了