数据人成长交流的一站式服务平台

网站首页 > 数据编程 正文

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

nandi88 2025-03-24 18:36:49 数据编程 19 ℃

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 reference = new ReferenceConfig();
        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 方式使用泛化调用

最近发表
标签列表