动态反射调用dubbo的服务

最近想做个公共的平台,直接转发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







你可能感兴趣的:(动态反射调用dubbo的服务)