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

本文深入探讨Dubbo的Invoker概念及其重要性,详细解析Invoker的生成过程,包括ProxyFactory的自适应扩展点和JavassistProxyFactory的角色。同时,文章阐述了服务注册的完整步骤,从getRegistry()开始,通过ZookeeperRegistryFactory、ZookeeperRegistry到最终在Zookeeper上的注册。整个流程展示了Dubbo服务发布的核心机制。

这篇文章主要续接上一篇文章的基础上做的分析学习。前面没有分析 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 
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值