整理了一下Dubbo集成测试工具,完整代码如下:
import com.alibaba.dubbo.config.ApplicationConfig;
import com.alibaba.dubbo.config.ReferenceConfig;
import com.alibaba.dubbo.config.RegistryConfig;
import com.alibaba.dubbo.rpc.service.GenericService;
import com.alibaba.fastjson.JSON;
import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.util.StringUtils;
import java.lang.reflect.Method;
import java.util.Objects;
public class DubboUtils {
private static String ZOOKEEPER_ADDRESS;
private static String DUBBO_VERSION;
private static String DUBBO_GROUP;
private static String DUBBO_HOST;
public static void init(String zkAddress, String dubboVersion, String dubboGroup, String dubboHost) {
ZOOKEEPER_ADDRESS = zkAddress;
DUBBO_VERSION = dubboVersion;
DUBBO_GROUP = dubboGroup;
DUBBO_HOST = dubboHost;
}
public static <T> T getService(Class<T> dubboServiceClass) {
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(dubboServiceClass);
enhancer.setCallback((MethodInterceptor) (obj, method, args, proxy) -> {
ReferenceConfig<GenericService> reference = getReferenceConfig(dubboServiceClass, DUBBO_VERSION, DUBBO_GROUP, DUBBO_HOST);
GenericService genericService = reference.get();
Object resultObj = genericService.$invoke(method.getName(), getMethodParamType(method), args);
if (!Objects.isNull(resultObj)) {
String resultJSONStr = JSON.toJSONString(resultObj);
return JSON.parseObject(resultJSONStr, method.getReturnType());
}
return null;
});
Object service = enhancer.create();
return (T) service;
}
private static <T> ReferenceConfig<T> getReferenceConfig(Class<?> interfaceClass, String dubboVersion, String dubboGroup, String dubboHost) {
String referenceKey = interfaceClass.getName();
ReferenceConfig<T> referenceConfig = new ReferenceConfig<>();
referenceConfig.setApplication(getApplicationConfig());
referenceConfig.setRegistry(getRegistryConfig());
referenceConfig.setInterface(interfaceClass);
referenceConfig.setVersion(dubboVersion);
referenceConfig.setTimeout(8000);
referenceConfig.setGeneric(true);
referenceConfig.setGroup(dubboGroup);
if (!StringUtils.isEmpty(dubboHost)) {
String url = String.format("dubbo://%s/%s", dubboHost, referenceKey);
referenceConfig.setUrl(url);
}
return referenceConfig;
}
private static RegistryConfig getRegistryConfig() {
RegistryConfig registryConfig = new RegistryConfig();
registryConfig.setAddress(DubboUtils.ZOOKEEPER_ADDRESS);
return registryConfig;
}
private static ApplicationConfig getApplicationConfig() {
ApplicationConfig application = new ApplicationConfig();
application.setName("b2c-test");
return application;
}
private static String[] getMethodParamType(Method method) {
Class<?>[] paramClassList = method.getParameterTypes();
String[] paramTypeList = new String[paramClassList.length];
for (int i = 0; i < paramClassList.length; i++) {
paramTypeList[i] = paramClassList[i].getTypeName();
}
return paramTypeList;
}
public static void main(String[] args) {
DubboUtils.init("zookeeper://127.0.0.1:2181", "V01.00", "*", "127.0.0.1:20987");
// ABCDService service = DubboUtils.getService(ABCDService);
// service.test(123);
}
}