Dubbo源码解析(1)概览

2020-03-20 20:41:24 浏览数 (1)

本篇文章是Dubbo源码解析系列文章的第一篇,本系列文章分析基于Dubbo官方代码2.7.5-release版本,本篇文章并不会具体分析某一处的实现细节,只是会以一个宏观的角度来看一下一个服务提供者启动时涉及到的东西

打开Dubbo官方的demo中的这个项目:/dubbo-demo/dubbo-demo-annotation/dubbo-demo-annotation-provider

这个项目是一个简单的基于注解的服务提供者的demo项目,我们核心的东西都在启动类,我们来看一下都是有什么:

内容不是很多,main方法中Spring启动的相关源码之前的文章已经分析过了,就不再详细展开了,我们来看一下ProviderConfiguration里面的东西

注册中心

RegistryConfig这个bean是注册中心相关的配置,包含地址、用户名、密码、集群等等相关的配置,不再详细展开了

配置文件

使用@PropertySource注解加载配置文件,这个原理之前的文章也提到过了,不再展开

EnableDubbo

整个页面上好像也就剩下这个东西了,这个也是咱们的重中之重

属性

这个注解上包含三个属性

  1. 其中scanBasePackages、scanBasePackageClasses这两个属性都是给@DubboComponentScan这个注解的用的,看名字应该就很好理解,这个注解应该是dubbo模仿@ComponentScan实现的一个注解。不熟悉@ComponentScan注解的同学可以参考我之前的文章
  2. multipleConfig属性是给@EnableDubboConfig注解使用的,这个属性的含义为是否支持多配置
注解
EnableDubboLifecycle

这个注解配合@Import注解引入了类DubboLifecycleComponentRegistrar,关于@Import注解可参考我之前的文章,而DubboLifecycleComponentRegistrar这个类干了什么呢? 它主要注册了两个非常重要的监听器

  1. DubboLifecycleComponentApplicationListener,主要负责在Spring完成初始化或者销毁时对Dubbo中Lifecycle接口的实现类的处理
  2. DubboBootstrapApplicationListener,主要负责在Spring完成初始化或者销毁时对Dubbo的启动和销毁,这个是很重要的一块内容,后续会有好几篇文章来分析
EnableDubboConfig

同上一个注解,配合@Import注解引入了类DubboConfigConfigurationRegistrar,而这个类做了这么几个操作:

  1. 注册处理Dubbo中bean的name和别名的两个bean:NamePropertyDefaultValueDubboConfigBeanCustomizerDubboConfigAliasPostProcessor
  2. 根据注解上之前提到的multipleConfig属性来选择注册DubboConfigConfiguration类的两个实现。如下图所示,单配置和多配置使用的处理方式是不同的

注意这里面涉及到了两个注解@EnableConfigurationBeanBindings@EnableConfigurationBeanBinding,举个例子来表示下这两个注解的使用:将dubbo.application下的所有属性值都映射到ApplicationConfig这个类里面

DubboComponentScan

这个注解其实只看名字就可以猜测出来是干啥的,估计是模仿的@ComponentScan注解,接下来我们深入看一下

同前2个注解,配合@Import注解引入了类DubboComponentScanRegistrar,观察核心的方法

代码语言:javascript复制
public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
    Set<String> packagesToScan = getPackagesToScan(importingClassMetadata);
    registerServiceAnnotationBeanPostProcessor(packagesToScan, registry);
    registerReferenceAnnotationBeanPostProcessor(registry);
}
  1. 首先根据注解的属性basePackages、basePackageClasses获取扫描的包路径的集合
  2. 接着根据这个需要扫描的包路径的集合来注册bean:ServiceAnnotationBeanPostProcessor,这个bean其实跟@ComponentScan注解的处理类逻辑是差不多的,之前的文章已经写到过了,扫描@Service等注解,除了这些之外,这个bean还添加了处理Dubbo的com.alibaba.dubbo.config.annotation.Service注解
  3. 接着注册的beanReferenceAnnotationBeanPostProcessor,这个bean是用来给@Reference注解标注的属性中注入值的,后续会有文章专门介绍这个

看到这里,相信你已经发现了,现在已经出现了3个疑问了:

  1. Dubbo的启动和销毁都干了什么?
  2. Dubbo中消费者是如何注入的提供者的实现类的? 除此之外,你可能还会好奇:
  3. Dubbo中的SPI机制是什么呢?
  4. Dubbo是如何向zk等注册中心注册的呢?
  5. Dubbo协议什么时候开启的呢?
  6. Dubbo中的服务调用过程是什么样的?
  7. Dubbo中的服务路由、集群负载均衡等等是怎么做的呢?
  8. Dubbo控制台的原理是什么呢?
  9. 等等

0 人点赞