本篇文章是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
整个页面上好像也就剩下这个东西了,这个也是咱们的重中之重
属性
这个注解上包含三个属性
- 其中scanBasePackages、scanBasePackageClasses这两个属性都是给
@DubboComponentScan
这个注解的用的,看名字应该就很好理解,这个注解应该是dubbo模仿@ComponentScan
实现的一个注解。不熟悉@ComponentScan
注解的同学可以参考我之前的文章 - multipleConfig属性是给
@EnableDubboConfig
注解使用的,这个属性的含义为是否支持多配置
注解
EnableDubboLifecycle
这个注解配合@Import
注解引入了类DubboLifecycleComponentRegistrar
,关于@Import
注解可参考我之前的文章,而DubboLifecycleComponentRegistrar
这个类干了什么呢?
它主要注册了两个非常重要的监听器
DubboLifecycleComponentApplicationListener
,主要负责在Spring完成初始化或者销毁时对Dubbo中Lifecycle
接口的实现类的处理DubboBootstrapApplicationListener
,主要负责在Spring完成初始化或者销毁时对Dubbo的启动和销毁,这个是很重要的一块内容,后续会有好几篇文章来分析
EnableDubboConfig
同上一个注解,配合@Import
注解引入了类DubboConfigConfigurationRegistrar
,而这个类做了这么几个操作:
- 注册处理Dubbo中bean的name和别名的两个bean:
NamePropertyDefaultValueDubboConfigBeanCustomizer
、DubboConfigAliasPostProcessor
- 根据注解上之前提到的multipleConfig属性来选择注册
DubboConfigConfiguration
类的两个实现。如下图所示,单配置和多配置使用的处理方式是不同的
注意这里面涉及到了两个注解@EnableConfigurationBeanBindings
和@EnableConfigurationBeanBinding
,举个例子来表示下这两个注解的使用:将dubbo.application下的所有属性值都映射到ApplicationConfig
这个类里面
DubboComponentScan
这个注解其实只看名字就可以猜测出来是干啥的,估计是模仿的@ComponentScan
注解,接下来我们深入看一下
同前2个注解,配合@Import
注解引入了类DubboComponentScanRegistrar
,观察核心的方法
public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
Set<String> packagesToScan = getPackagesToScan(importingClassMetadata);
registerServiceAnnotationBeanPostProcessor(packagesToScan, registry);
registerReferenceAnnotationBeanPostProcessor(registry);
}
- 首先根据注解的属性basePackages、basePackageClasses获取扫描的包路径的集合
- 接着根据这个需要扫描的包路径的集合来注册bean:
ServiceAnnotationBeanPostProcessor
,这个bean其实跟@ComponentScan
注解的处理类逻辑是差不多的,之前的文章已经写到过了,扫描@Service
等注解,除了这些之外,这个bean还添加了处理Dubbo的com.alibaba.dubbo.config.annotation.Service
注解 - 接着注册的bean
ReferenceAnnotationBeanPostProcessor
,这个bean是用来给@Reference
注解标注的属性中注入值的,后续会有文章专门介绍这个
看到这里,相信你已经发现了,现在已经出现了3个疑问了:
- Dubbo的启动和销毁都干了什么?
- Dubbo中消费者是如何注入的提供者的实现类的? 除此之外,你可能还会好奇:
- Dubbo中的SPI机制是什么呢?
- Dubbo是如何向zk等注册中心注册的呢?
- Dubbo协议什么时候开启的呢?
- Dubbo中的服务调用过程是什么样的?
- Dubbo中的服务路由、集群负载均衡等等是怎么做的呢?
- Dubbo控制台的原理是什么呢?
- 等等