配置概述

Dubbo 配置的总体设计和工作原理概述,包括配置组件、配置源、配置方法和配置加载过程。

通过以下链接快速跳转到您关心的内容

配置组件

为了更好地管理各种配置,Dubbo 抽象了一组结构化的配置组件。每个组件通常按用途划分,并控制不同范围的行为。

dubbo-config

组件名称描述范围必需
application指定应用程序级别的信息,例如应用程序名称一个应用程序中只允许有一个 application必需
service将一个公共接口或实现类声明为 Dubbo 服务一个应用程序中可以有 0 个或多个服务至少有一个 service/reference
reference将一个公共接口声明为 Dubbo 服务一个应用程序中可以有 0 个或多个引用至少有一个 service/reference
protocol要公开的 RPC 协议和相关配置,例如端口号等一个应用程序可以配置多个,一个协议可以用于一组 service&reference可选,默认为 dubbo
registry注册中心类型、地址和相关配置一个应用程序中可以进行多个配置,一个注册中心可以应用于一组 service&references必需
config-center配置中心类型、地址和相关配置一个应用程序中可以进行多个配置,所有服务共享可选
metadata-report元数据中心类型、地址和相关配置一个应用程序中可以进行多个配置,所有服务共享可选
Consumer引用之间共享的默认配置一个应用程序中可以配置多个,一个 consumer 可以作用于一组 references可选
Provider服务之间共享的默认配置一个应用程序中可以配置多个,一个 provider 可以用于一组 services可选
monitor监控系统类型和地址一个应用程序中只能配置一个可选
metrics数据采集模块的相关配置一个应用程序中只允许一个配置可选
sslssl/tls 安全链接相关的证书配置一个应用程序中只允许一个配置可选
method指定方法级别的配置service 和 reference 的子配置可选
argument方法的参数配置method 的子配置可选
  1. 从实现原理的角度来看,Dubbo 的所有配置项最终都会被组装成 URL,并在后续的启动和 RPC 调用过程中以 URL 作为载体进行传递,从而控制框架的行为。更多信息请参考 Dubbo 源码分析系列文档或 [博客](/zh-cn/blog/2019/10/17/dubbo-in-url-unified model/#rpc 调用)。
  2. 有关每个组件支持的具体配置项及其含义,请参阅配置项手册

service 和 reference

servicereference 是 Dubbo 最基本的两个配置项,它们用于将指定的接口或实现类注册为 Dubbo 服务,并通过配置项来控制服务的行為。

  • service 用于服务提供方,service 配置的接口和实现类将被定义为标准的 Dubbo 服务,从而对外提供 RPC 请求服务。
  • reference 用于服务消费者,通过 reference 配置的接口将被定义为一个标准的 Dubbo 服务,生成的代理可以发起 RPC 请求到远程端。

在一个应用中可以配置任意多个 servicereference

consumer 和 provider

  • 当应用中存在多个 reference 配置时,consumer 指定这些 reference 共享的默认值,例如共享超时时间等,以简化繁琐的配置,例如在某个 reference 项目中单独设置了配置项值,则以该 reference 中的配置优先。
  • 当应用中存在多个 service 配置时,provider 指定这些 service 共享的默认值,如果在某个 service 中单独设置了配置项值,则以该 service 中的配置优先级更高。

consumer 组件也可以对 reference 进行虚拟分组,不同组的 reference 可以拥有不同的 consumer 默认值设置;例如,在 XML 格式配置中,<dubbo:reference /> 标签可以嵌套在 <dubbo:consumer /> 标签内实现分组。provider 和 service 之间也可以实现同样的效果。

配置方式

按驱动方式,可分为以下五种模式

API 配置

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

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 形式配置各个组件,支持与 Spring 无缝集成,具体请参考 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"/>

注解配置

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

  // AnnotationService service implementation

  @DubboService
  public class AnnotationServiceImpl implements AnnotationService {
      @Override
      public String sayHello(String name) {
          System.out.println("async provider received: " + name);
          return "annotation: hello, " + name;
      }
  }
## dubbo.properties

dubbo.application.name=annotation-provider
dubbo.registry.address=zookeeper://127.0.0.1:2181
dubbo.protocol.name=dubbo
dubbo.protocol.port=20880

Spring Boot

使用 Spring Boot 方式,减少不必要的配置,结合 Annotation 和 application.properties/application.yml 开发 Dubbo 应用,具体请参考 注解配置

## application.properties

# Spring boot application
spring.application.name=dubbo-externalized-configuration-provider-sample

# Base packages to scan Dubbo Component: @com.alibaba.dubbo.config.annotation.Service
dubbo.scan.base-packages=com.alibaba.boot.dubbo.demo.provider.service

# Dubbo Application
## The default value of dubbo.application.name is ${spring.application.name}
## dubbo.application.name=${spring.application.name}

#Dubbo Protocol
dubbo.protocol.name=dubbo
dubbo.protocol.port=12345

## Dubbo Registry
dubbo.registry.address=N/A

## DemoService version
demo.service.version=1.0.0

属性配置

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

属性配置的另一个重要特性是 [属性覆盖](../principle/#32-property override),即使用外部属性的值覆盖已创建的配置组件属性。

如果希望将属性配置放置在外部配置中心,请参考 [外部化配置](../principle/#33-Externalized Configuration)。

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

  1. Dubbo 支持多层级配置,并按预先约定的优先级自动实现配置间的覆盖,最终所有配置汇总到数据总线 URL 中,驱动后续的服务暴露、引用等过程。
  2. 配置格式以 Properties 为主,配置内容遵循约定的 基于路径 的 [命名规范](../principle/#1-configuration format)

配置加载流程

配置规范与来源

Dubbo 遵循 基于路径的配置规范,每个配置组件均可以这种方式表达。从配置来源角度,共支持 6 种配置源,即 Dubbo 会尝试从以下位置加载配置数据

  • JVM 系统属性,JVM -D 参数
  • 系统环境,JVM 进程的环境变量
  • 外部化配置,[外部化配置] (../principle/#33-externalized configuration),从配置中心读取
  • 应用配置,应用属性配置,从 Spring 应用 Environment 中提取以 “dubbo” 开头的属性集合
  • API/XML/注解等编程接口收集的配置,可以理解为一种配置源,是直接面向用户编程的配置收集方式
  • 从 classpath 读取配置文件 dubbo.properties

上次修改时间:2023 年 2 月 9 日: 更新 docsy 至 0.6.0 (#2141) (20081578326)