一、Dubbo 配置方式

可以采用不同的方式来配置 Dubbo 应用:配置概述

Dubbo 配置介绍

API 配置:以 API 配置的方式来配置你的 Dubbo 应用

XML 配置:以 XML 配置的方式来配置你的 Dubbo 应用

注解配置:以注解配置的方式来配置你的 Dubbo 应用

属性配置:以属性配置的方式来配置你的 Dubbo 应用

外部化配置:将 Dubbo 应用的配置放到外部集中管理

自动加载环境变量:在 Dubbo 中自动加载环境变量

二、配置组件

Dubbo 框架的配置项比较繁多,为了更好地管理各种配置,将其按照用途划分为不同的组件,最终所有配置项都会汇聚到 URL 中,传递给后续处理模块。

常用配置组件如下:

application: Dubbo应用配置
registry: 注册中心
protocol: 服务提供者RPC协议
config-center: 配置中心
metadata-report: 元数据中心
service: 服务提供者配置
reference: 远程服务引用配置
provider: service的默认配置或分组配置
consumer: reference的默认配置或分组配置
module: 模块配置
monitor: 监控配置
metrics: 指标配置
ssl: SSL/TLS配置

consumer 与 reference 的关系

reference 可以指定具体的 consumer,如果没有指定 consumer 则会自动使用全局默认的 consumer 配置。

consumer 的属性是 reference 属性的默认值,可以体现在两个地方:

  • 在刷新属性(属性覆盖)时,先提取其 consumer 的属性,然后提取 reference 自身的属性覆盖上去,叠加后的属性集合作为配置来源之一。 在组装 reference 的 URL 参数时,先附加其 consumer 的属性,然后附加 reference 自身的属性。

  • 可以将 consumer 组件理解为 reference 组件的虚拟分组,根据需要可以定义多个不同的 consumer,不同的 consumer 设置特定的默认值, 然后在 reference 中指定 consumer 或者将<dubbo:reference /> 标签嵌套在<dubbo:consumer />标签之中。

provider 与 service 的关系

service 可以指定具体的 provider,如果没有指定则会自动使用全局默认的 provider 配置。 provider 的属性是 service 属性的默认值,覆盖规则类似上面的 consumer 与 reference,也可以将 provider 理解为 service 的虚拟分组。

三、配置来源

1、配置来源

从 Dubbo 支持的配置来源说起,默认有 6 种配置来源:

JVM System Properties,JVM -D 参数

System environment,JVM进程的环境变量

Externalized Configuration,外部化配置,从配置中心读取

Application Configuration,应用的属性配置,从Spring应用的Environment中提取"dubbo"打头的属性集

API / XML /注解等编程接口采集的配置可以被理解成配置来源的一种,是直接面向用户编程的配置采集方式

从classpath读取配置文件 dubbo.properties

2、覆盖关系

下图展示了配置覆盖关系的优先级,从上到下优先级依次降低:

  • JVM 启动 -D 参数优先,这样可以使用户在部署和启动时进行参数重写,比如在启动时需改变协议的端口。

  • XML 次之,如果在 XML 中有配置,则 dubbo.properties 中的相应配置项无效。

  • Properties 最后,相当于缺省值,只有 XML 没有配置时,dubbo.properties 的相应配置项才会生效,通常用于共享公共配置,比如应用名。

四、配置方式

按照驱动方式可以分为以下四种方式:

API 配置:以 Java 编码的方式组织配置,包括 Raw API 和 Bootstrap API,具体请参考API 配置

XML 配置:以 XML 方式配置各种组件,支持与 Spring 无缝集成,具体请参考XML 配置

Annotation 配置:以注解方式暴露服务和引用服务接口,支持与 Spring 无缝集成,具体请参考Annotation 配置

属性配置

  • 根据属性 Key-value 生成配置组件,类似 SpringBoot 的 ConfigurationProperties,具体请参考属性配置

  • 属性配置的另外一个重要的功能特性是属性覆盖,使用外部属性的值覆盖已创建的配置组件属性。

  • 如果要将属性配置放到外部的配置中心,请参考外部化配置

除了外围驱动方式上的差异,Dubbo 的配置读取总体上遵循了以下几个原则:

  1. Dubbo 支持了多层级的配置,并按预定优先级自动实现配置间的覆盖,最终所有配置汇总到数据总线 URL 后驱动后续的服务暴露、引用等流程。
  2. 配置格式以 Properties 为主,在配置内容上遵循约定的 path-based命名规范

五、配置加载流程

从上图可以看出,配置加载大概分为两个阶段:

  • 第一阶段为 DubboBootstrap 初始化之前,在 Spring context 启动时解析处理 XML 配置/注解配置/Java-config 或者是执行 API 配置代码,创建 config bean 并且加入到 ConfigManager 中。
  • 第二阶段为 DubboBootstrap 初始化过程,从配置中心读取外部配置,依次处理实例级属性配置和应用级属性配置,最后刷新所有配置实例的属性,也就是属性覆盖

六、dubbo.properties 怎么写

可以将 xml 的 tag 名和属性名组合起来,用 ‘.’ 分隔。每行一个属性。

dubbo.application.name=foo 相当于 <dubbo:application name="foo" />
dubbo.registry.address=10.20.153.10:9090 相当于 <dubbo:registry address="10.20.153.10:9090" />

如果在 xml 配置中有超过一个的 tag,那么你可以使用 ‘id’ 进行区分。如果你不指定 id,它将作用于所有 tag。

dubbo.protocols.rmi.port=1099 相当于 <dubbo:protocol id="rmi" name="rmi" port="1099" />
dubbo.registries.china.address=10.20.153.10:9090 相当于 <dubbo:registry id="china" address="10.20.153.10:9090" />

dubbo.properties 示例:

# Dubbo Protocol
dubbo.protocol.name=dubbo
dubbo.protocol.port=20882
posted on 2022-01-12 22:31  格物致知_Tony  阅读(194)  评论(0编辑  收藏  举报