便捷调试dubbo服务之泛化调用

最近搭了一个新项目,使用微服务dubbo+zookeeper,其中有些接口是其他部门提供,在对这些接口调试验证的时候遇到了一些问题,其中一个就是调试接口,必须启动服务器,这样太浪费时间了,为了方便调试,下面写了一个test类,不需要启动服务器,即可对dubbo服务进行调试验证

主要使用了dubbo服务的泛化调用方式,下面直接上代码

一、快速创建一个maven项目,或现有的maven项目也可以
二、加入maven依赖
    <dependency>
      <groupId>com.alibabagroupId>
      <artifactId>dubboartifactId>
      <version>2.5.3version>
      <scope>testscope>
    dependency>
    <dependency>
      <groupId>io.nettygroupId>
      <artifactId>netty-allartifactId>
      <version>4.0.35.Finalversion>
    dependency>
    <dependency>
      <groupId>org.apache.curatorgroupId>
      <artifactId>curator-frameworkartifactId>
      <version>2.11.1version>
    dependency>
    <dependency>
      <groupId>com.101tecgroupId>
      <artifactId>zkclientartifactId>
      <version>0.10version>
    dependency>
三、java代码
package com.jin.dubbo;

import com.alibaba.dubbo.config.ApplicationConfig;
import com.alibaba.dubbo.config.ReferenceConfig;
import com.alibaba.dubbo.config.RegistryConfig;
import com.alibaba.dubbo.config.utils.ReferenceConfigCache;
import com.alibaba.dubbo.rpc.service.GenericService;
import org.junit.Test;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 泛化调用dubbo测试类
 */
public class DubboGenericTest {
     

    @Test
    public void GenericTest() {
     
        // 多注册中心地址
        String registry = "192.168.10.100:2181,192.168.10.101:2181,192.168.10.102:2181";
//        String registry = "127.0.0.1:2181";
        // dubbo接口
        String interfaces = "com.jin.dubbo.service.UserService__1_0";
        // 方法
        String function = "selectUserById";
        // 参数
        Map<String, String> parMap = new HashMap<>();
        parMap.put("id", "U00101");
        // 参数类型
        String parType = "java.util.Map";
        // 调用dubbo服务
        Object result = callDubbo(registry, interfaces, function, parMap, parType);
        System.out.println(result);
    }

    /**
     * 封装参数,调用dubbo服务
     *
     * @param registry   多注册中心地址
     * @param interfaces 调用接口地址
     * @param function   调用接口方法
     * @param parMap     接口参数
     * @param parType    参数类型
     * @return
     */
    private Object callDubbo(String registry, String interfaces, String function, Map<String, String> parMap, String parType) {
     
        ReferenceConfig config = new ReferenceConfig();
        config.setApplication(new ApplicationConfig("test"));
        config.setRegistries(getRegistry(registry)); // 多注册中心
        config.setGeneric(true); // 支持泛化调用
        config.setTimeout(10000); // 超时时间10秒
        config.setInterface(interfaces); // 接口
        ReferenceConfigCache cache = ReferenceConfigCache.getCache();
        GenericService genericService = (GenericService) cache.get(config);
        return genericService.$invoke(function, new String[]{
     parType}, new Object[]{
     parMap});
    }

    /**
     * 解析多注册中心地址
     *
     * @param registry 多注册中心地址
     * @return
     */
    private List<RegistryConfig> getRegistry(String registry) {
     
        List<RegistryConfig> registryConfigList = new ArrayList<>();
        String[] split = registry.split(",");
        for (String s : split) {
     
            registryConfigList.add(new RegistryConfig("zookeeper://" + s));
        }
        return registryConfigList;
    }

}

你可能感兴趣的:(dubbo,Zookeeper,dubbo)