最近想有没有一个可以兼容各种分布式接口测试的工具,github上搜到很多开源的,但实际运行起来,和自己想的并不一致,于是自己研究一下试着写一下。
先对当前主流的dubbo,springcloud的feign接口,普通http接口做适配
dubbo消费端,一般必须依赖服务端提供的api包,没有api接口包,就无法直接引用,此时可以使用泛型调用,调用方可不用知道被调用方的具体细节。
泛接口实现方式主要用于服务器端没有 API 接口及模型类元的情况,参数及返回值中的所有 POJO 均用 Map 表示,通常用于框架集成,比如:实现一个通用的远程服务 Mock 框架,可通过实现 GenericService 接口处理所有服务请求。 --引自官方文档
核心方法为GenericService接口的$invoke方法:
package com.alibaba.dubbo.rpc.service;
/**
* Generic service interface
*
* @export
*/
public interface GenericService {
/**
* Generic invocation
*
* @param method Method name, e.g. findPerson. If there are overridden methods, parameter info is
* required, e.g. findPerson(java.lang.String)
* @param parameterTypes Parameter types
* @param args Arguments
* @return invocation return value
* @throws Throwable potential exception thrown from the invocation
*/
Object $invoke(String method, String[] parameterTypes, Object[] args) throws GenericException;
}
从源码可知,我们可以在只知道方法名,参数类型和参数值的情况下,调用远程方法。
实现如下:
ReferenceConfig<GenericService> reference = new ReferenceConfig<GenericService>();
// 弱类型接口名
reference.setApplication(new ApplicationConfig("ApplicationName");
//接口类全限定类名
reference.setInterface("interface class");
//注册中心地址
reference.setRegistry(new RegistryConfig("registryAddress"));
reference.setCheck(false);
//设置容错模式
reference.setCluster("failfast");
//接口版本号
reference.setVersion("version");
// 声明为泛化接口
reference.setGeneric(true);
// 用org.apache.dubbo.rpc.service.GenericService可以替代所有接口引用
ReferenceConfigCache cache = ReferenceConfigCache.getCache();
GenericService genericService = cache.get(reference);
//封装参数(params为Map<String, Object>,参数名和值)
String[] paramTypes = null;
Object[] paramValues = null;
if(!CollectionUtils.isEmpty(params)){
paramTypes = new String[params.size()];
paramValues = new Object[params.size()];
int i = 0;
for (Map.Entry entry : params.entrySet()) {
paramTypes[i] = entry.getValue().getClass().getTypeName();
paramValues[i] = entry.getValue();
i++;
}
}
Object result = genericService.$invoke(iface.getMethodName(), paramTypes, paramValues);
这样我们可以把方法名,参数等信息可以保存在数据库中,做统一管理和配置。