上篇我们介绍了Provider端监听注册中心动态配置原理,地址如下
Dubbo源码解析-Provider端监听注册中心动态配置原理-CSDN博客
本文主要针Dubbo消费端@Reference服务端引用流程原理,从dubbo源码角度进行解析。
大家可以好好仔细读一下本文。有疑问欢迎留言。
接着说明,读Dubbo源码最好是先对Spring源码有一定的了解。如果大家需要,我也可以针对Spring框架做一系列源码的解读专栏。
不过不用担心,如果需要Spring的源码知识,文章中也会进行Spring源码铺垫介绍的。
如果内容中有没描述清楚的,或者大家在阅读源代码有疑问的,欢迎留言,看到就会及时回复。
消费端@Reference依赖注入服务端流程
Dubbo消费端引用依赖注入服务端,整个细节过程是比较复杂的。因为好多同学为了应付面试或者觉得细节流程太繁琐或者复杂,只想弄清楚相对简练的过程。所以对细节流程做了一个相对笼统的总结,方便大家理解大概过程,以及应对面试。
流程概述:
其实就是注册节点到consumers节点下,然后订阅了providers/configurators/routers节点事件,创建Invoker代理。
- ReferenceAnnotationBeanPostProcessor。负责@Reference属性的收集和依赖注入
- postProcessPropertyValues()负责对收集好的@refer注解进行依赖注入。
- AnnotatedFieldElement和.AnnotatedMethodElement。inject()负责方法和属性上的依赖注入。下面以字段依赖注入为例
- 接下来创建依赖bean。会使用双重代理。
- JDK代理bean。JDK->ReferenceBeanInvocationHandler->bean
- javassis创建invoker代理,复制给bean。Javassis->InvokerInvocationHandler->MockClusterInvoker
- 创建Invoke代理
- 封装配置属性到map
- 获取所有注册协议,进行遍历urls=loadRegistries(false);registry协议
- 将map变为String绑定到注册协议的URL上,key为“refer”。:regiestry协议
- 调用Protocol包装链.referr()
- QosProtocol 启动QosServer
- RegistyProtocol.referr()
- 创建RegistryDirectory服务列表集合:该类非常重要。用来存储服务列表
- 实现NotifyListener监听zk节点变化。
- 注册节点到zookeeper中的consumers节:./dubbo/com.*.AsyncService/consumers
- 注册节点监听事件。:providers,configurators,routers节点的变化代码和@Servcie流程一样。
- 返回MockClusterInvoker对象。持有RegistryDirectory和FailbackClusterInvoker
- 返回mockCluserInvoker代理。javassisProxy创建mockCluserInvoker代理
- JDK创建代理bean代理
- 创建InvokerHandler:ReferenceBeanInvocationHandler,持有Bean就是5中生成的invoke代理。
总结:
- 依赖注入的对象创建了两层代理
- 核心RegistryProtocol.doRefer()
- 构建服务列表缓存类RegistryDirectory。实现NotifyListener,监听节点事件。
- 注册consumers节点
- 注册监听节点事件。节点:providers,configurators,routers