likes
comments
collection
share

Dubbo源码解析系列(一)

作者站长头像
站长
· 阅读数 65

今天我们开始见一下dubbo的源码,大家都知道,dubbo是一款非常优秀的RPC框架,注册中心可以使用zookeeper、redis、nacos等,支持多种协议,有很强的扩展性,提供了Dubbo的SPI。

dubbo大致结构图如下

Dubbo源码解析系列(一)

在看源码之前我提出几个问题:

  1. Consumer的bean是一个什么样的bean, 这个bean为什么只有接口就可以访问远程的Service?
  2. Consumer的bean是怎么注册到Spring的容器的?
  3. Service的bean是怎么注册到Spring的容器中的?
  4. 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注解中到底藏着什么玄机?

Dubbo源码解析系列(一)

可见是个混合注解,为了解开问题,我们就直接看@DubboComponentScan,这个注解主要是扫描项目中Dubbo的注解的,在@Import中是引用了DubboComponentScanRegistrar类:

Dubbo源码解析系列(一)

registerBeanDefinitions方法是ImportBeanDifinitionRegistar的默认方法

Dubbo源码解析系列(一)

最主要还是看ServiceAnnotationBeanPostProcessor这个类

Dubbo源码解析系列(一)

这个BeanDefinitionRegistryPostProcessor接口其实是继承了BeanFactroyPostProcessor,目的主要用户BeanDefinition的改造,要实现这个方法postProcessBeanDefinitionRegistry

Dubbo源码解析系列(一)

Dubbo源码解析系列(一)

registerServiceBeans方法中跳到registerServiceBean方法中

Dubbo源码解析系列(一)

我们最终跳到buildServiceBeanDefinition方法中看一下

Dubbo源码解析系列(一)

主角终于登场了,ServiceBean类,上述的代码意思就是组装ServiceBean的BeanDefinition,将真实的类的信息填充到Builder中,然后生成BeanDefinition, 我们自己的类会与ref字段进行绑定,ref这个字段很重要,后面会讲到。

Service的bean是怎么注册到Spring的容器中的?这个问题到这里就有答案了,注册到Spring容器的其实是ServiceBean,而不是我们自己的类。

2. Consumer的bean是怎么注册到Spring的容器的?

Consumer的bean跟Provider注入的方式差不多,我们就精简一下步骤:

Dubbo源码解析系列(一)

Dubbo源码解析系列(一)

注入Spring容器的是ReferenceBean,他是个FactoryBean

由于篇幅的问题,我们就先说到这里

  1. Consumer的bean是一个什么样的bean, 这个bean为什么只有接口就可以访问远程的Service?
  2. Service的bean为什么可以远程访问?

这两个问题我们下一篇文章重点说明一下,本次讲解只是提供一个看源码的思路,并不能保证通过这篇文章就能对Dubbo了如指掌,若想深入理解,必须是多用多思考,自己给自己提出问题,然后通过源码去得到答案,这才能越走越远。

转载自:https://juejin.cn/post/7226650721986215991
评论
请登录