You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@dubbo.apache.org by al...@apache.org on 2022/07/13 09:40:50 UTC
[dubbo-website] branch master updated: [fix] 优化配置指南 (#1225)
This is an automated email from the ASF dual-hosted git repository.
albumenj pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/dubbo-website.git
The following commit(s) were added to refs/heads/master by this push:
new 73468dfb1e [fix] 优化配置指南 (#1225)
73468dfb1e is described below
commit 73468dfb1e6940388421d8e78e86ba47c99ffa46
Author: JIAN ZHONG <11...@qq.com>
AuthorDate: Wed Jul 13 17:40:45 2022 +0800
[fix] 优化配置指南 (#1225)
* [fix] 优化配置指南
* [fix]
---
.../reference-manual/config/overview/_index.md | 214 ++++++++++++---------
1 file changed, 122 insertions(+), 92 deletions(-)
diff --git a/content/zh/docs3-building/java-sdk/reference-manual/config/overview/_index.md b/content/zh/docs3-building/java-sdk/reference-manual/config/overview/_index.md
index 3a2de84a42..ce2cbf9561 100644
--- a/content/zh/docs3-building/java-sdk/reference-manual/config/overview/_index.md
+++ b/content/zh/docs3-building/java-sdk/reference-manual/config/overview/_index.md
@@ -1,100 +1,143 @@
---
type: docs
-title: "配置概述"
-linkTitle: "配置概述"
+title: "配置指南"
+linkTitle: "配置指南"
weight: 1
-description: "对 Dubbo 配置总体设计与工作原理进行了总体概述,包括配置组件、配置来源、配置方式及配置加载流程等。"
+description: "Dubbo配置介绍"
---
-通过以下链接快速跳转到关心的内容:
-* [使用 Spring Boot 快速开发 Dubbo 应用](../../../quick-start/)
-* [配置项参考手册](../properties)
-* [配置加载及覆盖原理](../principle)
-* [运行态地址 URL 及优先级规则](../blog)
+本文主要介绍 Dubbo 配置概况,包括配置组件、配置来源、配置方式及配置加载流程。
## 配置组件
-为了更好地管理各种配置,Dubbo 抽象了一套结构化的配置组件,各组件总体以用途划分,分别控制不同作用域的行为。
+Dubbo 框架的配置项比较繁多,为了更好地管理各种配置,将其按照用途划分为不同的组件,最终所有配置项都会汇聚到URL中,传递给后续处理模块。
-![dubbo-config](/imgs/user/dubbo-config.jpg)
+常用配置组件如下:
+- application: Dubbo应用配置
+- registry: 注册中心
+- protocol: 服务提供者RPC协议
+- config-center: 配置中心
+- metadata-report: 元数据中心
+- service: 服务提供者配置
+- reference: 远程服务引用配置
+- provider: service的默认配置或分组配置
+- consumer: reference的默认配置或分组配置
+- module: 模块配置
+- monitor: 监控配置
+- metrics: 指标配置
+- ssl: SSL/TLS配置
-组件名称 | 描述 | 范围 | 是否必须配置
------- | ------ | ------ | ------
-application | 指定应用名等应用级别相关信息 | 一个应用内只允许出现一个 | 必选
-service | 声明普通接口或实现类为 Dubbo 服务 | 一个应用内可以有 0 到多个 service | service/reference 至少一种
-reference | 声明普通接口为 Dubbo 服务 | 一个应用内可以有 0 到多个 reference | service/reference 至少一种
-protocol | 要暴露的 RPC 协议及相关配置如端口号等 | 一个应用可配置多个,一个 protocol 可作用于一组 service&reference | 可选,默认 dubbo
-registry | 注册中心类型、地址及相关配置 | 一个应用内可配置多个,一个 registry 可作用于一组 service&reference| 必选
-config-center | 配置中心类型、地址及相关配置 | 一个应用内可配置多个,所有服务共享 | 可选
-metadata-report | 元数据中心类型、地址及相关配置 | 一个应用内可配置多个,所有服务共享 | 可选
-consumer | reference 间共享的默认配置 | 一个应用内可配置多个,一个 consumer 可作用于一组 reference | 可选
-provider | service 间共享的默认配置 | 一个应用内可配置多个,一个 provider 可作用于一组 service | 可选
-monitor | 监控系统类型及地址 | 一个应用内只允许配置一个 | 可选
-metrics | 数据采集模块相关配置 | 一个应用内只允许配置一个 | 可选
-ssl | ssl/tls 安全链接相关的证书等配置 | 一个应用内只允许配置一个 | 可选
-method | 指定方法级的配置 | service 和 reference 的子配置 | 可选
-argument | 某个方法的参数配置 | method的子配置 | 可选
+#### consumer 与 reference的关系
+reference可以指定具体的consumer,如果没有指定consumer则会自动使用全局默认的consumer配置。
-> 1. 从实现原理层面,最终 Dubbo 所有的配置项都会被组装到 URL 中,以 URL 为载体在后续的启动、RPC 调用过程中传递,进而控制框架行为。如想了解更多,请参照 Dubbo 源码解析系列文档或 [Blog](/blog/java/codeanalysis/introduction-to-dubbo-url#rpc调用)。
-> 2. 各组件支持的具体配置项及含义请参考 [配置项手册](../properties)
+consumer的属性是reference属性的默认值,可以体现在两个地方:
-### service 与 reference
-`service` 与 `reference` 是 Dubbo 最基础的两个配置项,它们用来将某个指定的接口或实现类注册为 Dubbo 服务,并通过配置项控制服务的行为。
-* `service` 用于服务提供者端,通过 `service` 配置的接口和实现类将被定义为标准的 Dubbo 服务,从而实现对外提供 RPC 请求服务。
-* `reference` 用于服务消费者端,通过 `reference` 配置的接口将被定义为标准的 Dubbo 服务,生成的 proxy 可发起对远端的 RPC 请求。
+1. 在刷新属性(属性覆盖)时,先提取其consumer的属性,然后提取reference自身的属性覆盖上去,叠加后的属性集合作为配置来源之一。
+2. 在组装reference的URL参数时,先附加其consumer的属性,然后附加reference自身的属性。
-一个应用中可以配置任意多个 `service` 与 `reference`。
+> 可以将consumer组件理解为reference组件的虚拟分组,根据需要可以定义多个不同的consumer,不同的consumer设置特定的默认值,
+然后在reference中指定consumer或者将<dubbo:reference /> 标签嵌套在<dubbo:consumer />标签之中。
-### consumer 与 provider
-* 当应用内有多个 `reference` 配置时,`consumer` 指定了这些 `reference` 共享的默认值,如共享的超时时间等以简化繁琐的配置,如某个 `reference` 中单独设置了配置项值则该 `reference` 中的配置优先级更高。
-* 当应用内有多个 `service` 配置时,`provider` 指定了这些 `service` 共享的默认值,如某个 `service` 中单独设置了配置项值则该 `service` 中的配置优先级更高。
+#### provider 与 service的关系
+
+service可以指定具体的provider,如果没有指定则会自动使用全局默认的provider配置。
+provider的属性是service属性的默认值,覆盖规则类似上面的consumer与reference,也可以将provider理解为service的虚拟分组。
+
+
+## 配置来源
+
+从Dubbo支持的配置来源说起,默认有6种配置来源:
+
+- JVM System Properties,JVM -D 参数
+- System environment,JVM进程的环境变量
+- Externalized Configuration,外部化配置,从配置中心读取
+- Application Configuration,应用的属性配置,从Spring应用的Environment中提取"dubbo"打头的属性集
+- API / XML /注解等编程接口采集的配置可以被理解成配置来源的一种,是直接面向用户编程的配置采集方式
+- 从classpath读取配置文件 dubbo.properties
+
+#### 覆盖关系
+
+下图展示了配置覆盖关系的优先级,从上到下优先级依次降低:
+
+![覆盖关系](/imgs/blog/configuration.jpg)
+
+请参考相关内容:[属性覆盖](../properties#属性覆盖)。
-> consumer 组件还可以对 reference 进行虚拟分组,不通分组下的 reference 可有不同的 consumer 默认值设定;如在 XML 格式配置中,<dubbo:reference /> 标签可通过嵌套在 <dubbo:consumer /> 标签之中实现分组。provider 与 service 之间也可以实现相同的效果。
## 配置方式
-按照驱动方式可以分为以下五种方式:
+按照驱动方式可以分为以下四种方式:
-### API配置
+- API 配置
+- XML 配置
+- Annotation 配置
+- 属性配置
+#### API配置
以Java编码的方式组织配置,包括Raw API和Bootstrap API,具体请参考[API配置](../api)。
-```java
-public static void main(String[] args) throws IOException {
- ServiceConfig<GreetingsService> service = new ServiceConfig<>();
- service.setApplication(new ApplicationConfig("first-dubbo-provider"));
- service.setRegistry(new RegistryConfig("multicast://224.5.6.7:1234"));
- service.setInterface(GreetingsService.class);
- service.setRef(new GreetingsServiceImpl());
- service.export();
- System.out.println("first-dubbo-provider is running.");
- System.in.read();
-}
-```
-
-### XML配置
+#### XML配置
以XML方式配置各种组件,支持与Spring无缝集成,具体请参考[XML配置](../xml)。
+#### Annotation配置
+以注解方式暴露服务和引用服务接口,支持与Spring无缝集成,具体请参考[Annotation配置](../annotation)。
+
+#### 属性配置
+根据属性Key-value生成配置组件,类似SpringBoot的ConfigurationProperties,具体请参考[属性配置](../properties)。
+
+属性配置的另外一个重要的功能特性是[属性覆盖](../properties#属性覆盖),使用外部属性的值覆盖已创建的配置组件属性。
+
+如果要将属性配置放到外部的配置中心,请参考[外部化配置](../external-config)。
+
+除了外围驱动方式上的差异,Dubbo的配置读取总体上遵循了以下几个原则:
+
+1. Dubbo 支持了多层级的配置,并按预定优先级自动实现配置间的覆盖,最终所有配置汇总到数据总线URL后驱动后续的服务暴露、引用等流程。
+2. 配置格式以 Properties 为主,在配置内容上遵循约定的 `path-based` 的[命名规范](../properties#配置格式)
+
+
+#### 配置加载流程
+
+![配置加载流程](/imgs/v3/config/config-load.svg)
+
+从上图可以看出,配置加载大概分为两个阶段:
+
+* 第一阶段为DubboBootstrap初始化之前,在Spring context启动时解析处理XML配置/注解配置/Java-config 或者是执行API配置代码,创建config bean并且加入到ConfigManager中。
+* 第二阶段为DubboBootstrap初始化过程,从配置中心读取外部配置,依次处理实例级属性配置和应用级属性配置,最后刷新所有配置实例的属性,也就是[属性覆盖](../properties#属性覆盖)。
+
+
+## 编程配置方式
+
+接下来,我们看一下选择不同的开发方式时,对应到 ServiceConfig、ReferenceConfig 等编程接口采集的配置的变化。
+
+- Spring XML
+- Spring Annotation
+- Spring Boot
+- API
+#### Spring XML
+
+> [示例](https://github.com/apache/dubbo-samples/tree/master/dubbo-samples-basic)
+
```xml
<!-- dubbo-provier.xml -->
-
+
<dubbo:application name="demo-provider"/>
<dubbo:config-center address="zookeeper://127.0.0.1:2181"/>
-
+
<dubbo:registry address="zookeeper://127.0.0.1:2181" simplified="true"/>
<dubbo:metadata-report address="redis://127.0.0.1:6379"/>
<dubbo:protocol name="dubbo" port="20880"/>
-
+
<bean id="demoService" class="org.apache.dubbo.samples.basic.impl.DemoServiceImpl"/>
<dubbo:service interface="org.apache.dubbo.samples.basic.api.DemoService" ref="demoService"/>
```
-### Annotation 配置
-以注解方式暴露服务和引用服务接口,支持与Spring无缝集成,具体请参考[Annotation配置](../annotation)。
+#### Spring Annotation
+
+> [示例](https://github.com/apache/dubbo-samples/tree/master/dubbo-samples-annotation)
```java
// AnnotationService服务实现
-
- @DubboService
+
+ @Service
public class AnnotationServiceImpl implements AnnotationService {
@Override
public String sayHello(String name) {
@@ -105,7 +148,7 @@ public static void main(String[] args) throws IOException {
```
```properties
-## dubbo.properties
+ ## dubbo.properties
dubbo.application.name=annotation-provider
dubbo.registry.address=zookeeper://127.0.0.1:2181
@@ -113,11 +156,12 @@ dubbo.protocol.name=dubbo
dubbo.protocol.port=20880
```
-### Spring Boot
-使用 Spring Boot 减少非必要配置,结合 Annotation 与 application.properties/application.yml 开发 Dubbo 应用,具体请参考[Annotation 配置](../annotation)。
+#### Spring Boot
+
+> [示例](https://github.com/apache/dubbo-spring-boot-project/tree/master/dubbo-spring-boot-samples)
```properties
-## application.properties
+ ## application.properties
# Spring boot application
spring.application.name=dubbo-externalized-configuration-provider-sample
@@ -140,33 +184,19 @@ dubbo.registry.address=N/A
demo.service.version=1.0.0
```
-### 属性配置
-根据属性Key-value生成配置组件,类似SpringBoot的ConfigurationProperties,具体请参考[属性配置](../properties)。
-
-属性配置的另外一个重要的功能特性是[属性覆盖](../properties#属性覆盖),使用外部属性的值覆盖已创建的配置组件属性。
-
-如果要将属性配置放到外部的配置中心,请参考[外部化配置](../external-config)。
-
-除了外围驱动方式上的差异,Dubbo 的配置读取总体上遵循了以下几个原则:
-
-1. Dubbo 支持了多层级的配置,并按预定优先级自动实现配置间的覆盖,最终所有配置汇总到数据总线URL后驱动后续的服务暴露、引用等流程。
-2. 配置格式以 Properties 为主,在配置内容上遵循约定的 `path-based` 的[命名规范](../properties#配置格式)
-
-
-## 配置加载流程
-
-### 配置规范与来源
-
-Dubbo 遵循一种 [path-based 的配置规范](../principle/),每一个配置组件都可以通过这种方式进行表达。而在配置的来源上,总共支持 6 种配置来源,即 Dubbo 会分别尝试从以下几个位置尝试加载配置数据:
-
-- JVM System Properties,JVM -D 参数
-- System environment,JVM进程的环境变量
-- Externalized Configuration,[外部化配置](../properties#3.3-外部化配置),从配置中心读取
-- Application Configuration,应用的属性配置,从Spring应用的Environment中提取"dubbo"打头的属性集
-- API / XML /注解等编程接口采集的配置可以被理解成配置来源的一种,是直接面向用户编程的配置采集方式
-- 从classpath读取配置文件 dubbo.properties
-
-### 覆盖关系
-不通配置来源之间的属性会互相覆盖,它们的覆盖关系或优先级如下(从上到下优先级依次降低):
+#### API
+> [示例](https://github.com/apache/dubbo-samples/tree/master/dubbo-samples-api)
+```java
+public static void main(String[] args) throws IOException {
+ ServiceConfig<GreetingsService> service = new ServiceConfig<>();
+ service.setApplication(new ApplicationConfig("first-dubbo-provider"));
+ service.setRegistry(new RegistryConfig("multicast://224.5.6.7:1234"));
+ service.setInterface(GreetingsService.class);
+ service.setRef(new GreetingsServiceImpl());
+ service.export();
+ System.out.println("first-dubbo-provider is running.");
+ System.in.read();
+ }
+```