配置
配置组件
1、为了更好地管理各种配置,Dubbo 抽象了一套结构化的配置组件,各组件总体以用途划分,分别控制不同作用域的行为
2、从实现原理层面,最终 Dubbo 所有的配置项都会被组装到 URL 中,以 URL 为载体在后续的启动、RPC 调用过程中传递,进而控制框架行为
3、service 与 reference
(1)service 与 reference 是 Dubbo 最基础的两个配置项,它们用来将某个指定的接口或实现类注册为 Dubbo 服务,并通过配置项控制服务的行为
(2)service 用于服务提供者端,通过 service 配置的接口和实现类将被定义为标准的 Dubbo 服务,从而实现对外提供 RPC 请求服务
(3)reference 用于服务消费者端,通过 reference 配置的接口将被定义为标准的 Dubbo 服务,生成的 proxy 可发起对远端的 RPC 请求
(4)一个应用中可以配置任意多个 service 与 reference
4、consumer 与 provider
(1)当应用内有多个 reference 配置时,consumer 指定了这些 reference 共享的默认值,如共享的超时时间等以简化繁琐的配置,如某个 reference 中单独设置了配置项值,则该 reference 中的配置优先级更高
(2)当应用内有多个 service 配置时,provider 指定了这些 service 共享的默认值,如某个 service 中单独设置了配置项值,则该 service 中的配置优先级更高
(3)consumer 组件还可以对 reference 进行虚拟分组,不通分组下的 reference 可有不同的 consumer 默认值设定;如在 XML 格式配置中,<dubbo:reference /> 标签可通过嵌套在 <dubbo:consumer /> 标签之中实现分组。provider 与 service 之间也可以实现相同的效果
组件名称 | 描述 | 范围 | 是否必须配置 |
---|---|---|---|
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的子配置 | 可选 |
配置来源
1、Dubbo 默认支持 6 种配置来源
(1)JVM System Properties,JVM -D 参数
(2)System environment,JVM 进程的环境变量
(3)Externalized Configuration,外部化配置,从配置中心读取
(4)Application Configuration,应用的属性配置,从 Spring 应用的 Environment 中提取 dubbo 打头的属性集
(5)API / XML / 注解等编程接口采集的配置可以被理解成配置来源的一种,是直接面向用户编程的配置采集方式
(6)从 classpath 读取配置文件 dubbo.properties
2、关于 dubbo.properties 属性
(1)如果在 classpath 下有超过一个 dubbo.properties 文件,比如,两个 jar 包都各自包含了 dubbo.properties,dubbo 将随机选择一个加载,并且打印错误日志
(2)Dubbo 可以自动加载 classpath 根目录下的 dubbo.properties,但是你同样可以使用 JVM 参数来指定路径:-Ddubbo.properties.file=xxx.properties
Dubbo 配置加载大概分为两个阶段
1、第一阶段为 DubboBootstrap 初始化之前,在 Spring context 启动时解析处理 XML 配置 / 注解配置 / Java-config 或者是执行 API 配置代码,创建 config bean 并且加入到 ConfigManager 中
2、第二阶段为 DubboBootstrap 初始化过程,从配置中心读取外部配置,依次处理实例级属性配置和应用级属性配置,最后刷新所有配置实例的属性,也就是属性覆盖
发生属性覆盖可能有两种情况,并且二者可能是会同时发生
1、不同配置源配置了相同的配置项
2、相同配置源,但在不同层次指定了相同的配置项
不同配置源
相同配置源
1、属性覆盖是指用配置的属性值覆盖 config bean 实例的属性,类似 Spring PropertyOverrideConfigurer 的作用
2、但与 PropertyOverrideConfigurer 的不同之处是,Dubbo 的属性覆盖有多个匹配格式,优先级从高到低依次是
#1. 指定id的实例级配置
dubbo.{config-type}s.{config-id}.{config-item}={config-item-value}
#2. 指定name的实例级配置
dubbo.{config-type}s.{config-name}.{config-item}={config-item-value}
#3. 应用级配置(单数配置)
dubbo.{config-type}.{config-item}={config-item-value}
3、属性覆盖处理流程
(1)按照优先级从高到低依次查找,如果找到此前缀开头的属性,则选定使用这个前缀提取属性,忽略后面的配置
外部化配置
1、外部化配置目的之一是实现配置的集中式管理,这部分业界已经有很多成熟的专业配置系统如 Apollo, Nacos 等,Dubbo 所做的主要是保证能配合这些系统正常工作
2、外部化配置和其他本地配置在内容和格式上并无区别,可以简单理解为 dubbo.properties 的外部化存储,配置中心更适合将一些公共配置如注册中心、元数据中心配置等抽取以便做集中管理
(1)优先级:外部化配置默认较本地配置有更高的优先级,因此这里配置的内容会覆盖本地配置值
(2)作用域:外部化配置有全局和应用两个级别,全局配置是所有应用共享的,应用级配置是由每个应用自己维护且只对自身可见的。当前已支持的扩展实现有 Zookeeper、Apollo、Nacos
3、使用方式
(1)增加 config-center 配置
<dubbo:config-center address="zookeeper://127.0.0.1:2181"/>
(2)在相应的配置中心(Zookeeper、Nacos 等)增加全局配置项
dubbo.registry.address=zookeeper://127.0.0.1:2181
dubbo.registry.simplified=true
dubbo.metadata-report.address=zookeeper://127.0.0.1:2181
dubbo.protocol.name=dubbo
dubbo.protocol.port=20880
dubbo.application.qos.port=33333
4、开启外部化配置后,registry、metadata-report、protocol、qos 等全局范围的配置理论上都不再需要在应用中配置,应用开发侧专注业务服务配置,一些全局共享的全局配置转而由运维人员统一配置在远端配置中心
dubbo
application
name: demo
config-center
address: nacos://127.0.0.1:8848
5、应用只需要关心
(1)服务暴露、订阅配置
(2)配置中心地址:当部署到不同的环境时,其他配置就能自动的被从对应的配置中心读取到
整合 SpringBoot
1、依赖
<properties>
<spring-boot.version>2.3.0.RELEASE</spring-boot.version>
<dubbo.version>2.7.8</dubbo.version>
</properties>
<dependencyManagement>
<dependencies>
<!-- Spring Boot -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>${spring-boot.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!-- Apache Dubbo -->
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-dependencies-bom</artifactId>
<version>${dubbo.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo</artifactId>
<version>${dubbo.version}</version>
<exclusions>
<exclusion>
<groupId>org.springframework</groupId>
<artifactId>spring</artifactId>
</exclusion>
<exclusion>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
</exclusion>
<exclusion>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<!-- Dubbo Spring Boot Starter -->
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>2.7.8</version>
</dependency>
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo</artifactId>
</dependency>
</dependencies>
2、使用注解方式
(1)导入 dubbo-starter
(2)在 application.properties 配置属性
(3)使用 @DubboService 暴露服务
(4)使用 @DubboReference 引用服务
(5)主类使用 @EnableDubbo 开启注解 Dubbo 功能,或配置包扫描
(6)可以在 @Service、@Reference 注解中配置属性
(7)属于类的配置,无法精确到方法的配置
3、使用 dubbo 的 xml 配置文件
(1)导入 dubbo-starter
(2)主类使用 @ImportResource 导入 dubbo 配置文件
(3)取消 application.properties 中的 dubbo 配置和相关注解
(4)不使用 @DubboService、@DubboReference、@EnableDubbo
(5)可以精确配置方法
4、使用注解 API
(1)将每一个组件手动创建到容器中,将 xml 编写为 API 代码,再使用注解注册到容器中
(2)让 dubbo 扫描其他组件
(3)使用 @DubboService 暴露服务
(4)使用 @DubboReference 引用服务
(5)主类使用 @EnableDubbo 注解
(6)对应配置类
以 API 的方式配置 Dubbo 应用
1、通过 API 编码方式组装配置、启动 Dubbo、发布及订阅服务
2、此方式可以支持动态创建 ReferenceConfig/ServiceConfig,结合泛化调用可以满足 API Gateway 或测试平台的需要
3、通过 DubboBootstrap API 可以减少重复配置,更好控制启动过程,支持批量发布 / 订阅服务接口,还可以更好支持 Dubbo3 的应用级服务发现
(1)基本配置:可以在 DubboBootstrap 中设置全局基本配置,包括应用配置、协议配置、注册中心、配置中心、元数据中心、模块、监控、SSL、provider 配置、consumer 配置等
// 注册中心
RegistryConfig registry = new RegistryConfig();
registry.setAddress("zookeeper://192.168.10.1:2181");
...
// 服务提供者协议配置
ProtocolConfig protocol = new ProtocolConfig();
protocol.setName("dubbo");
protocol.setPort(12345);
protocol.setThreads(200);
...
// 配置中心
ConfigCenterConfig configCenter = new ConfigCenterConfig();
configCenter.setAddress("zookeeper://192.168.10.2:2181");
...
// 元数据中心
MetadataReportConfig metadataReport = new MetadataReportConfig();
metadataReport.setAddress("zookeeper://192.168.10.3:2181");
...
// Metrics
MetricsConfig metrics = new MetricsConfig();
metrics.setProtocol("dubbo");
...
// SSL
SslConfig ssl = new SslConfig();
ssl.setServerKeyCertChainPath("/path/ssl/server-key-cert-chain");
ssl.setServerPrivateKeyPath("/path/ssl/server-private-key");
...
// Provider配置(ServiceConfig默认配置)
ProviderConfig provider = new ProviderConfig();
provider.setGroup("demo");
provider.setVersion("1.0.0");
...
// Consumer配置(ReferenceConfig默认配置)
ConsumerConfig consumer = new ConsumerConfig();
consumer.setGroup("demo");
consumer.setVersion("1.0.0");
consumer.setTimeout(2000);
...
DubboBootstrap.getInstance()
.application("demo-app")
.registry(registry)
.protocol(protocol)
.configCenter(configCenter)
.metadataReport(metadataReport)
.module(new ModuleConfig("module"))
.metrics(metrics)
.ssl(ssl)
.provider(provider)
.consumer(consumer)
...
.start();
(2)方法级设置
...
// 方法级配置
List<MethodConfig> methods = new ArrayList<MethodConfig>();
MethodConfig method = new MethodConfig();
method.setName("sayHello");
method.setTimeout(10000);
method.setRetries(0);
methods.add(method);
// 引用远程服务
ReferenceConfig<DemoService> reference = new ReferenceConfig<DemoService>(); // 此实例很重,封装了与注册中心的连接以及与提供者的连接,请自行缓存,否则可能造成内存和连接泄漏
...
reference.setMethods(methods); // 设置方法级配置
...
(3)点对点直连
...
// 此实例很重,封装了与注册中心的连接以及与提供者的连接,请自行缓存,否则可能造成内存和连接泄漏
ReferenceConfig<DemoService> reference = new ReferenceConfig<DemoService>();
// 如果点对点直连,可以用reference.setUrl()指定目标地址,设置url后将绕过注册中心,
// 其中,协议对应provider.setProtocol()的值,端口对应provider.setPort()的值,
// 路径对应service.setPath()的值,如果未设置path,缺省path为接口名
reference.setUrl("dubbo://10.20.130.230:20880/com.xxx.DemoService");
...
以 Annotation、Spring Boot 开发 Dubbo 应用
1、在 Dubbo Spring Boot 开发中,只需要增加几个注解,并配置 application.properties 或 application.yml 文件即可完成 Dubbo 服务定义
(1)注解有 @DubboService、@DubboReference、@EnableDubbo
(2)其中 @DubboService、@DubboReference 用于标记 Dubbo 服务,@EnableDubbo 启动 Dubbo 相关配置并指定 Spring Boot 扫描包路径
(3)配置文件 application.properties 或 application.yml
2、增加 Maven 依赖
(1)使用 Dubbo Spring Boot Starter 首先引入以下 Maven 依赖
<dependencyManagement>
<dependencies>
<!-- Spring Boot -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>${spring-boot.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!-- Dubbo -->
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-bom</artifactId>
<version>${dubbo.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!-- Zookeeper -->
<!-- NOTICE: Dubbo only provides dependency management module for Zookeeper, add Nacos or other product dependency directly if you want to use them. -->
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-dependencies-zookeeper</artifactId>
<version>${dubbo.version}</version>
<type>pom</type>
</dependency>
</dependencies>
</dependencyManagement>
(2)然后在相应的模块的 pom 中增加
<dependencies>
<!-- dubbo -->
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo</artifactId>
</dependency>
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-dependencies-zookeeper</artifactId>
<type>pom</type>
</dependency>
<!-- dubbo starter -->
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
</dependency>
<!-- spring starter -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-autoconfigure</artifactId>
</dependency>
</dependencies>
3、application.yml 或 application.properties
(1)除 service、reference 之外的组件都可以在 application.yml 文件中设置
(2)如果要扩展 service 或 reference 的注解配置,则需要增加 dubbo.properties 配置文件,或使用其他非注解,如:Java Config 方式
(3)service、reference 组件也可以通过 id 与 application 中的全局组件做关联
4、@DubboService 注解
(1)@Service 注解从 3.0 版本开始就已经废弃,改用 @DubboService,以区别于 Spring 的 @Service 注解
(2)定义好 Dubbo 服务接口后,提供服务接口的实现逻辑,并用 @DubboService 注解标记,就可以实现 Dubbo 的服务暴露
@DubboService
public class DemoServiceImpl implements DemoService {}
(3)如果要设置服务参数,@DubboService 也提供了常用参数的设置方式
@DubboService(version = "1.0.0", group = "dev", timeout = 5000)
public class DemoServiceImpl implements DemoService {}
(4)如果有更复杂的参数设置需求,则可以考虑使用其他设置方式
5、@DubboReference 注解
(1)@Reference 注解从 3.0 版本开始就已经废弃,改用 @DubboReference,以区别于 Spring 的 @Reference 注解
@Component
public class DemoClient {
@DubboReference
private DemoService demoService;
}
(2)@DubboReference 注解将自动注入为 Dubbo 服务代理实例,使用 demoService 即可发起远程服务调用
6、@EnableDubbo 注解
(1)@EnableDubbo 注解必须配置,否则将无法加载 Dubbo 注解定义的服务,@EnableDubbo 可以定义在主类上
@SpringBootApplication
@EnableDubbo
public class ProviderApplication {
public static void main(String[] args) throws Exception {
SpringApplication.run(ProviderApplication.class, args);
}
}
(2)Spring Boot 注解默认只会扫描 main 类所在的 package,如果服务定义在其它 package 中,需要增加配置,如:@EnableDubbo(scanBasePackages = {"org.apache.dubbo.springboot.demo.provider"})
7、扩展注解配置
(1)虽然可以通过 @DubboService 和 DubboReference 调整配置参数,但总体来说注解提供的配置项还是非常有限
(2)如果有更复杂的参数设置需求,可以使用 Java Config 或 dubbo.properties 两种方式
(3)使用 Java Config 代替注解:注意,Java Config 是 DubboService 或 DubboReference 的替代方式,对于有复杂配置需求的服务建议使用这种方式
@Configuration
public class ProviderConfiguration {
@Bean
public ServiceConfig demoService() {
ServiceConfig service = new ServiceConfig();
service.setInterface(DemoService.class);
service.setRef(new DemoServiceImpl());
service.setGroup("dev");
service.setVersion("1.0.0");
Map<String, String> parameters = new HashMap<>();
service.setParameters(parameters);
return service;
}
}
(4)通过 dubbo.properties 补充配置:对于使用 DubboService 或 DubboReference 的场景,可以使用 dubbo.properties 作为配置补充,properties 格式配置目前结构性不太强,比如体现在 key 字段冗余较多,后续会考虑提供对于 yaml 格式的支持
dubbo.service.org.apache.dubbo.springboot.demo.DemoService.timeout=5000
dubbo.service.org.apache.dubbo.springboot.demo.DemoService.parameters=[{myKey:myValue},{anotherKey:anotherValue}]
dubbo.reference.org.apache.dubbo.springboot.demo.DemoService.timeout=6000
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战