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;
}
这里简单说明一下这四个字段
- serviceName
接口服务名,比如:com.demo.test.IUserService - methodName
接口下的方法名,比如:add(User user) - paramsTypes
请求参数类型,因为一个方法包含多种类型的入参,所以这里用了一个List来一 一对应入参
如:[“java.lang.String”,“int”] ,[“com.demo.bo.userBo”] - params
入参,根据入参类型来填入对应的参数
如[“testdemo”,1],[{“name”:“test”,“age”:18}]
这样就可以通过 API 方式使用泛化调用
