Dubbo源码解析系列(一)
今天我们开始见一下dubbo的源码,大家都知道,dubbo是一款非常优秀的RPC框架,注册中心可以使用zookeeper、redis、nacos等,支持多种协议,有很强的扩展性,提供了Dubbo的SPI。
dubbo大致结构图如下
在看源码之前我提出几个问题:
- Consumer的bean是一个什么样的bean, 这个bean为什么只有接口就可以访问远程的Service?
- Consumer的bean是怎么注册到Spring的容器的?
- Service的bean是怎么注册到Spring的容器中的?
- Service的bean为什么可以远程访问?
dubbo的结构图看起来很简单,但是做起来就不一样了。现在我们就带着上面四个问题去看源码,只看关键点:
首先声明一下dubbo的版本是2.7.8
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo</artifactId>
<version>2.7.8</version>
</dependency>
1、Service的bean是怎么注册到Spring的容器中的?
如果要想知道Consumer的Bean是怎么注册到Spring容器中?首先我们要弄明白这个注解@EnableDubbo,我们先看一下@EnableDubbo注解中到底藏着什么玄机?
可见是个混合注解,为了解开问题,我们就直接看@DubboComponentScan,这个注解主要是扫描项目中Dubbo的注解的,在@Import中是引用了DubboComponentScanRegistrar类:
registerBeanDefinitions方法是ImportBeanDifinitionRegistar的默认方法
最主要还是看ServiceAnnotationBeanPostProcessor这个类
这个BeanDefinitionRegistryPostProcessor接口其实是继承了BeanFactroyPostProcessor,目的主要用户BeanDefinition的改造,要实现这个方法postProcessBeanDefinitionRegistry
registerServiceBeans方法中跳到registerServiceBean方法中
我们最终跳到buildServiceBeanDefinition方法中看一下
主角终于登场了,ServiceBean类,上述的代码意思就是组装ServiceBean的BeanDefinition,将真实的类的信息填充到Builder中,然后生成BeanDefinition, 我们自己的类会与ref字段进行绑定,ref这个字段很重要,后面会讲到。
Service的bean是怎么注册到Spring的容器中的?这个问题到这里就有答案了,注册到Spring容器的其实是ServiceBean,而不是我们自己的类。
2. Consumer的bean是怎么注册到Spring的容器的?
Consumer的bean跟Provider注入的方式差不多,我们就精简一下步骤:
注入Spring容器的是ReferenceBean,他是个FactoryBean
由于篇幅的问题,我们就先说到这里
- Consumer的bean是一个什么样的bean, 这个bean为什么只有接口就可以访问远程的Service?
- Service的bean为什么可以远程访问?
这两个问题我们下一篇文章重点说明一下,本次讲解只是提供一个看源码的思路,并不能保证通过这篇文章就能对Dubbo了如指掌,若想深入理解,必须是多用多思考,自己给自己提出问题,然后通过源码去得到答案,这才能越走越远。
转载自:https://juejin.cn/post/7226650721986215991