dubbo源码分析学习—dubbo 重要内容Invoker 和服务注册过程

dubbo源码分析学习—dubbo 重要内容Invoker 和服务注册过程本文深入探讨 Dubbo 的 Invoker 概念及其重要性 详细解析 Invoker 的生成过程 包括 ProxyFactory 的自适应扩展点和 JavassistPro 的角色

大家好,欢迎来到IT知识分享网。

这篇文章主要续接上一篇文章的基础上做的分析学习。前面没有分析 Invoker,我们来简单看看 Invoker 到底是一个啥东西。

一、Invoker 是什么

从前面的分析来看,服务的发布分三个阶段:

  • 第一个阶段会创造一个 invoker
  • 第二个阶段会把经历过一系列处理的 invoker(各种包装),在 DubboProtocol 中保存到 exporterMap 中
  • 第三个阶段把 dubbo 协议的 url 地址注册到注册中心上

        Invoker 是 Dubbo 领域模型中非常重要的一个概念, 和 ExtensionLoader 的重要性是一样的,如果 Invoker 没有搞懂,那么不算是看懂了Dubbo的源码。我们继续回到 ServiceConfig 中 export 的代码,这段代码是还没有分析过的。以这个作为入口来分析 我们前面 export 出去的 invoker 到底是啥东西。

 //invoker -> RegistryProcol -> DubboProtocol .->exporterMap(key,invoker)
//invoker ->
//TODO  invoker -> 代理类
//ProxyFactory$Adaptive.getInvoker
//调用链路:StubProxyFactoryWrapper(JavassistProxyFactory())
Invoker<?> invoker = proxyFactory.getInvoker(ref, (Class) interfaceClass, registryURL.addParameterAndEncoded(EXPORT_KEY, url.toFullString()));

   1.1、ProxyFacotory.getInvoker

这个是一个代理工程,用来生成 invoker,从它的定义来看,它是一个自适应扩展点,看到这样的扩展点,我们几乎可以不假思 索的想到它会存在一个动态适配器类

private static final ProxyFactory proxyFactory = ExtensionLoader.getExtensionLoader(ProxyFactory.class).getAdaptiveExtension();

ProxyFactory

这个方法的简单解读为: 它是一个 spi 扩展点,并且默认的扩展实现是 javassit, 这个接口中有三个方法,并且都是加了 @Adaptive 的自适应扩展点。所以如果调用 getInvoker 方法,应该会返回一个 ProxyFactory$Adaptive

ProxyFactory$Adaptive

这个自适应扩展点,做了两件事情:

  •  通过 ExtensionLoader.getExtensionLoader(ProxyFactory.class).getExtension(extName)获取了一个指定名称的扩展点,
  •  在 dubbo-rpc-api/resources/META-INF/com.alibaba.dubbo.rpc.ProxyFactory 中,定义了 javassis=JavassisProxyFactory
  •  调用 JavassisProxyFactory 的 getInvoker 方法

JavassistProxyFactory.getInvoker

  • javassist 是一个动态类库,用来实现动态代理的。
  • proxy:接口的实现: com.gupaoedu.practice.dubbo.SayHelloServiceImpl
  • type:接口全称 com.gupaoedu.dubbo.ISayHelloService
  • url:协议地址:registry://…
 @Override public <T> Invoker<T> getInvoker(T proxy, Class<T> type, URL url) { // TODO Wrapper cannot handle this scenario correctly: the classname contains '$' //会创建一个动态代理,核心的方法 会生成 三个方法 setPropertyValue getPropertyValue 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, 

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/151688.html

(0)
上一篇 2025-03-12 14:33
下一篇 2025-03-12 14:45

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信