我是靠谱客的博主 羞涩裙子,最近开发中收集的这篇文章主要介绍dubbo 2.6.2 暴露远程服务invoker的创建过程,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

代码如下:

Invoker<?> invoker = proxyFactory.getInvoker(ref, (Class) interfaceClass, registryURL.addParameterAndEncoded(Constants.EXPORT_KEY, url.toFullString()));
proxyFactory = ExtensionLoader.getExtensionLoader(ProxyFactory.class).getAdaptiveExtension();

查看ProxyFactory接口可以知道

@SPI("javassist")
public interface ProxyFactory

由于ProxyFactory实现类不有加@Adaptive 注解的 所有会动态创建一个名称是ProxyFactory$Adaptive类(详情请了解dubbo的spi)

ProxyFactory$Adaptive类getInvoker方法实现大致如下:
String extName = url.getParameter("proxy", "javassist");//这儿的javassist是使用的ProxyFactory接口上的spi注解变量
try{
extension = (org.apache.dubbo.rpc.ProxyFactory) ExtensionLoader.getExtensionLoader(ProxyFactory.class).getExtension(extName);
}catch(){
extension = (org.apache.dubbo.rpc.ProxyFactory) ExtensionLoader.getExtensionLoader(org.apache.dubbo.rpc.ProxyFactory.class).getExtension("javassist");
}
return extension.getInvoker(arg0, arg1, arg2);

默认使用javassist 对应的实现ProxyFactory 如果有配置proxy参数则使用配置的 配置的有问题还是使用默认的

 

所以最终经过

StubProxyFactoryWrapper(因为这个类构造函数有只有一个参数为ProxyFactory 所以更具spi获取的ProxyFactory 实现类都会经过它)执行到JavassistProxyFactory.getInvoker(T proxy, Class<T> type, URL url)
这儿的proxy参数就是实现接口类的对象 然后在return wrapper.invokeMethod(proxy, methodName, parameterTypes, arguments);
运行的时候和方法名和参数一同传入过去 wrapper实现类invokeMethod方法通过方法名称判断调用对应的方法返回结果
执行代码如下:
final Wrapper wrapper = Wrapper.getWrapper(proxy.getClass().getName().indexOf('$') < 0 ? proxy.getClass() : type);
return new AbstractProxyInvoker<T>(proxy, type, url) {
@Override
protected Object doInvoke(T proxy, String methodName,
Class<?>[] parameterTypes,
Object[] arguments) throws Throwable {
return wrapper.invokeMethod(proxy, methodName, parameterTypes, arguments);
}
};

Wrapper.getWrapper(proxy.getClass().getName().indexOf('$') < 0 ? proxy.getClass() : type) 根据传入的接口动态生成了一个实现类Wrapper0

例如: 我有个接口 int add(int a,int b);

Wrapper实现类invokeMethod方法实现如下:

 

public Object invokeMethod(Object o, String n, Class[] p, Object[] v) throws java.lang.reflect.InvocationTargetException {
com.zzz.dubbodemo.api.service.DemoService w;
try {
w = ((com.zzz.dubbodemo.api.service.DemoService) o);
} catch (Throwable e) {
throw new IllegalArgumentException(e);
}
try {
if ("add".equals(n) && p.length == 2) {
return (int) w.add(((Number) v[0]).intValue(), ((Number) v[1]).intValue());
}
} catch (Throwable e) {
throw new java.lang.reflect.InvocationTargetException(e);
}
throw new org.apache.dubbo.common.bytecode.NoSuchMethodException("Not found method "" + n + "" in class com.zzz.dubbodemo.api.service.DemoService.");
}

所以最终返回的invoker是AbstractProxyInvoker ,执行invoke方法是调用doInvoke 然后执行Wrapper实现类invokeMethod方法 根据方法名判断执行到具体对象的发放而得到结果

public Object invokeMethod(Object o, String n, Class[] p, Object[] v) throws java.lang.reflect.InvocationTargetException {
    com.zzz.dubbodemo.api.service.DemoService w;
    try {
        w = ((com.zzz.dubbodemo.api.service.DemoService) o);
    } catch (Throwable e) {
        throw new IllegalArgumentException(e);
    }
    try {
        if ("add".equals(n) && p.length == 2) {
            return (int) w.add(((Number) v[0]).intValue(), ((Number) v[1]).intValue());
        }
    } catch (Throwable e) {
        throw new java.lang.reflect.InvocationTargetException(e);
    }
    throw new org.apache.dubbo.common.bytecode.NoSuchMethodException("Not found method "" + n + "" in class com.zzz.dubbodemo.api.service.DemoService.");
}

 

 

最后

以上就是羞涩裙子为你收集整理的dubbo 2.6.2 暴露远程服务invoker的创建过程的全部内容,希望文章能够帮你解决dubbo 2.6.2 暴露远程服务invoker的创建过程所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(48)

评论列表共有 0 条评论

立即
投稿
返回
顶部