最近搭了一个新项目,使用微服务dubbo+zookeeper,其中有些接口是其他部门提供,在对这些接口调试验证的时候遇到了一些问题,其中一个就是调试接口,必须启动服务器,这样太浪费时间了,为了方便调试,下面写了一个test类,不需要启动服务器,即可对dubbo服务进行调试验证
主要使用了dubbo服务的泛化调用方式,下面直接上代码
一、快速创建一个maven项目,或现有的maven项目也可以
二、加入maven依赖
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dubbo</artifactId>
<version>2.5.3</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>io.netty</groupId>
<artifactId>netty-all</artifactId>
<version>4.0.35.Final</version>
</dependency>
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-framework</artifactId>
<version>2.11.1</version>
</dependency>
<dependency>
<groupId>com.101tec</groupId>
<artifactId>zkclient</artifactId>
<version>0.10</version>
</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;
}
}