本文基于 Dubbo 2.6.1 版本,望知悉。
友情提示,【配置】这块的内容,会相对比较枯燥。所以,如果看到一些很难懂的地方,建议先跳过。
对于 Dubbo ,重点是要去理解,多协议、RPC、容错等等模块,而不是【配置】。
😈 估计好多胖友被【配置】这章劝退了把???
1. 概述
本文接 《API 配置(二)之服务提供者》 ,分享服务消费者相关的配置。
- 红框部分,consumer-side
还是老样子,我们先来看一段 《Dubbo 用户指南 —— API 配置》 ,服务消费者的初始化代码:
// 当前应用配置 |
2. AbstractReferenceConfig
com.alibaba.dubbo.config.AbstractReferenceConfig
,实现 AbstractInterfaceConfig ,抽象引用配置类。
- 具体属性的解释,需要寻找在 《Dubbo 用户指南 —— dubbo:reference》 或 《Dubbo 用户指南 —— dubbo:consumer》 文档。
3. ConsumerConfig
com.alibaba.dubbo.config.ConsumerConfig
,实现 AbstractReferenceConfig ,服务消费者缺省值配置。
- 具体属性的解释,参见 《Dubbo 用户指南 —— dubbo:consumer》 文档。
4. ReferenceConfig
com.alibaba.dubbo.config.ReferenceConfig
,服务消费者引用服务配置类。
- 具体属性的解释,参见 《Dubbo 用户指南 —— dubbo:consumer》 文档。
下面,我们进入正戏。
在文初的 ReferenceConfig 的初始化示例代码中,最后调用的是 ServiceConfig#get()
方法。从方法的命名,我们可以看出,获取引用服务。该方法主要做了如下几件事情:
- 进一步初始化 ReferenceConfig 对象。
- 校验 ReferenceConfig 对象的配置项。
- 使用 ReferenceConfig 对象,生成 Dubbo URL 对象数组。
- 使用 Dubbo URL 对象,应用服务。
😈 本文重点在服务提供者相关的配置,因此只解析 1+2+3 部分( 不包括 4 )。代码如下:
1: public synchronized T get() { |
- 第 2 至 5 行:若已经销毁(
destroyed = true
),抛出异常。 - 第 7 至 9 行:若未初始化,调用
#init()
方法,进行初始化。 - 第 10 行:返回引用服务。
#init()
方法,代码如下:
友情提示,该方法并未拆分更多的小方法,所以超级长,近 200+ 行。
1: private void init() { |
- 第 2 至 6 行:若已经初始化(
initialized = true
) 时,直接返回。否则,标记已经初始化。 - 第 7 至 10 行:校验接口名
interfaceName
非空。 - 第 13 行:调用
#checkDefault()
方法,读取属性配置( 环境变量 + properties 属性 )到 ConsumerConfig 对象。- 关于“属性配置” ,在 《精尽 Dubbo 源码解析 —— 属性配置》 详细解析。
- 🙂 直接点击方法查看,较为简单,已经添加详细注释。
- 第 15 行:调用
#appendProperties(config)
方法,读取属性配置( 环境变量 + properties 属性 )到 ReferenceConfig 对象(自己) - 第 16 至 19 行:若未设置
generic
属性,使用ConsumerConfig.generic
属性。 - 第 20 至 22 行:泛化接口的实现。
- 第 23 至 32 行:普通接口的实现。
- 第 60 至 64 行:根据
interfaceName
,获得对应的接口类,并赋值给interfaceClass
。 - 第 31 行:调用
#checkInterfaceAndMethods(interfaceClass, methods)
方法,检查接口和方法。- 🙂 直接点击方法查看,较为简单,已经添加详细注释。
- 第 60 至 64 行:根据
- 第 33 至 76 行:直连提供者。
- 《Dubbo 用户指南 —— 直连提供者》
- 🙂 中间有一些逻辑处理,胖友看下代码的注释。结合文档。
- 第 77 至 109 行:从 ConsumerConfig、ModuleConfig、ApplicationConfig 配置对象,复制
application
module
registries
monitor
给 ReferenceConfig ( 自己 )。 - 第 111 行:调用
#checkApplication()
方法,校验 ApplicationConfig 配置。- 🙂 直接点击方法查看,较为简单,已经添加详细注释。
- 第 113 行:调用
#checkStubAndMock(interfaceClass)
方法,校验 Stub 和 Mock 相关的配置。 - 第 115 行:创建参数集合
map
,用于下面创建 Dubbo URL 的parameters
属性。 - 第 116 至 122 行:将
side
dubbo
timestamp
timestamp
pid
添加到map
中。 - 第 123 至 137 行:将
interface
methods
revision
到map
中。 - 第 139 至 143 行:调用
#appendParameters(map, config)
方法,将各种配置对象添加到map
中。- 🙂
#appendParameters(map, config)
方法,在 《API 配置(一)之应用》 有详细解析。
- 🙂
- 第 146 至 164 行:调用 MethodConfig 对象数组,添加到
map
中。- 目的是将每个 MethodConfig 和其对应的 ArgumentConfig 对象数组,添加到
map
中。 - 第 160 行:调用
#appendAttributes(parameters, config, prefix)
方法,将@Parameter(attribute = true)
配置对象的属性,添加到参数集合。在 《API 配置(一)之应用》 有详细解析。 - 第 162 行:调用
#checkAndConvertImplicitConfig(method, map, attributes)
方法,检查属性集合中的事件通知方法是否正确。若正确,进行转换。- 🙂 直接点击方法查看,较为简单,已经添加详细注释。
- 目的是将每个 MethodConfig 和其对应的 ArgumentConfig 对象数组,添加到
- 第 166 至 173 行:以系统换将变量 ( DUBBO_IP_TO_REGISTRY ) 作为服务注册地址,参见 dubbo-docker-sample 项目。
- 第 177 行:添加到
com.alibaba.dubbo.rpc.StaticContext
进行缓存。- 目的是 《Dubbo 用户指南 —— 事件通知》 。
- 第 179 行:省略【服务引用】逻辑。
666. 彩蛋
一本正经的水更
和 《API 配置(二)之服务提供者》 大体类似。