接口测试平台(一)——dubbo的泛化调用

  最近想有没有一个可以兼容各种分布式接口测试的工具,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);

这样我们可以把方法名,参数等信息可以保存在数据库中,做统一管理和配置。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

白效正

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值