配置概述
通过以下链接快速跳转到您关心的内容
配置组件
为了更好地管理各种配置,Dubbo 抽象了一组结构化的配置组件。每个组件通常按用途划分,并控制不同范围的行为。
组件名称 | 描述 | 范围 | 必需 |
---|---|---|---|
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 | 数据采集模块的相关配置 | 一个应用程序中只允许一个配置 | 可选 |
ssl | ssl/tls 安全链接相关的证书配置 | 一个应用程序中只允许一个配置 | 可选 |
method | 指定方法级别的配置 | service 和 reference 的子配置 | 可选 |
argument | 方法的参数配置 | method 的子配置 | 可选 |
- 从实现原理的角度来看,Dubbo 的所有配置项最终都会被组装成 URL,并在后续的启动和 RPC 调用过程中以 URL 作为载体进行传递,从而控制框架的行为。更多信息请参考 Dubbo 源码分析系列文档或 [博客](/zh-cn/blog/2019/10/17/dubbo-in-url-unified model/#rpc 调用)。
- 有关每个组件支持的具体配置项及其含义,请参阅配置项手册
service 和 reference
service
和 reference
是 Dubbo 最基本的两个配置项,它们用于将指定的接口或实现类注册为 Dubbo 服务,并通过配置项来控制服务的行為。
service
用于服务提供方,service
配置的接口和实现类将被定义为标准的 Dubbo 服务,从而对外提供 RPC 请求服务。reference
用于服务消费者,通过reference
配置的接口将被定义为一个标准的 Dubbo 服务,生成的代理可以发起 RPC 请求到远程端。
在一个应用中可以配置任意多个 service
和 reference
。
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 的配置读取总体遵循以下原则
- Dubbo 支持多层级配置,并按预先约定的优先级自动实现配置间的覆盖,最终所有配置汇总到数据总线 URL 中,驱动后续的服务暴露、引用等过程。
- 配置格式以 Properties 为主,配置内容遵循约定的
基于路径
的 [命名规范](../principle/#1-configuration format)
配置加载流程
配置规范与来源
Dubbo 遵循 基于路径的配置规范,每个配置组件均可以这种方式表达。从配置来源角度,共支持 6 种配置源,即 Dubbo 会尝试从以下位置加载配置数据
- JVM 系统属性,JVM -D 参数
- 系统环境,JVM 进程的环境变量
- 外部化配置,[外部化配置] (../principle/#33-externalized configuration),从配置中心读取
- 应用配置,应用属性配置,从 Spring 应用 Environment 中提取以 “dubbo” 开头的属性集合
- API/XML/注解等编程接口收集的配置,可以理解为一种配置源,是直接面向用户编程的配置收集方式
- 从 classpath 读取配置文件 dubbo.properties