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.");
}

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值