最近想做个公共的平台,直接转发dubbo服务,为http的json、xml接口服务;
大致思路是,管理后台注册需要转发的服务接口,平台通过注册中心和maven仓库,获取dubbo客户端接口share包,然后通过classloader加载jar包,然后通过ReferenceConfig创建代理里,反射调用;
试了很多版本,发现里面的classloader使用都不一样,最终发现在2.2.X之前(版本偏老,有些特性没有)可以直接调通;
另外只有2.4.10版本简单做个如下扩展,可以调通(具体还有没有其他问题,还要验证下);
调用代码:
URL fileUrl = new URL("file:" + "F:\\a\\vcode-service-share-1.2-20150325.025628-3.jar");
ClassLoader classLoader = new URLClassLoader(new URL[]{fileUrl});
Class clazz = classLoader.loadClass(strIntefaceName);
Thread.currentThread().setContextClassLoader(classLoader);
ApplicationConfig application = new ApplicationConfig();
// application.setCompiler("jdk");
application.setName("dubbo_consumer");
ClassLoaderManager.put(strIntefaceName, classLoader);
ReferenceConfig referenceConfig = new ReferenceConfig();
referenceConfig.setApplication(application);
referenceConfig.setTimeout(timeout);
referenceConfig.setInterface(clazz);
referenceConfig.setUrl(url);
referenceConfig.setProxy("frogProxyFactory");//2.4.10扩展指定代理工厂
// referenceConfig.setVersion(version);
Object obj = referenceConfig.get();
Method clazzMethod = obj.getClass().getMethod(method, new Class[] {String.class,long.class});
Object resultObj = clazzMethod.invoke(obj, new Object[] {"xxxxxxx",100000});
2.4.10扩展
FrogJavassistProxyFactory.java扩展
public class FrogJavassistProxyFactory extends JavassistProxyFactory {
@SuppressWarnings("unchecked")
@Override
public <T> T getProxy(Invoker<T> invoker, Class<?>[] interfaces) {
return (T) Proxy.getProxy(Thread.currentThread().getContextClassLoader(),interfaces).newInstance(new InvokerInvocationHandler(invoker));
}
}
META-INF/dubbo/com.alibaba.dubbo.rpc.ProxyFactory文件配置
frogProxyFactory=com.xxxx.frog.biz.manager.rpc.FrogJavassistProxyFactory