【005】Dubbo3从0到1系列之Springboot配置dubbo3
五、Springboot配置dubbo3
5.1 软件版本
注册中心: nacos-server-2.3.2 【环境自行准备】
Java 17+
SpringBoot 3.5.6
Maven 3.9.9
dubbo 3.3.5
✅ dubbo-spring-boot-starter
5.2 依赖说明
✅ 对于spring boot
应用程序,可以引入如下的依赖
- 经过测试,使用3.3.5版本也可以注册.
<!-- 管理 dubbo 核心依赖,用于识别 application.properties 或 application.yml 中 dubbo. 开头的配置项,扫描 @DubboService 等注解。-->
<dependency><groupId>org.apache.dubbo</groupId><artifactId>dubbo-spring-boot-starter</artifactId><version>3.3.5</version>
</dependency><!-- 管理 nacos-client 等依赖,使用 Nacos 作为注册中心、配置中心时引入。-->
<dependency><groupId>org.apache.dubbo</groupId><artifactId>dubbo-nacos-spring-boot-starter</artifactId><version>3.3.5</version>
</dependency>
✅ 对于非spring boot应用,需要引入如下的组件
<dependencies><dependency><groupId>org.apache.dubbo</groupId><artifactId>dubbo</artifactId><version>3.3.0</version></dependency><dependency><groupId>com.alibaba.nacos</groupId><artifactId>nacos-client</artifactId><version>2.1.0</version></dependency>
</dependencies>
5.3 搭建工程
✅ 操作步骤
创建父工程
公共模块
- 接口定义
- 实体类定义
- 通用配置、工具类
dubbo3服务提供方
- 对外提供服务
dubbo3服务的消费方
- 消费服务
5.3.1 目录结构如下所示
├───tc-dubbo3-interface
│ ├───src
│ │ ├───main
│ │ │ ├───java
│ │ │ │ └───cn
│ │ │ │ └───tcmeta
│ │ │ │ └───service
│ │ │ │ └───interfaces
│ │ │ └───resources
│ │ └───test
│ │ └───java
│ └───target
│ ├───classes
│ │ └───cn
│ │ └───tcmeta
│ │ └───service
│ │ └───interfaces
│ └───generated-sources
│ └───annotations
├───tc-dubbo3-service-consumer
│ ├───src
│ │ ├───main
│ │ │ ├───java
│ │ │ │ └───cn
│ │ │ │ └───tcmeta
│ │ │ │ └───controller
│ │ │ └───resources
│ │ └───test
│ │ └───java
│ └───target
│ ├───classes
│ │ └───cn
│ │ └───tcmeta
│ │ └───controller
│ └───generated-sources
│ └───annotations
└───tc-dubbo3-service-provider├───src│ ├───main│ │ ├───java│ │ │ └───cn│ │ │ └───tcmeta│ │ │ └───service│ │ │ └───impl│ │ └───resources│ └───test│ └───java└───target├───classes│ └───cn│ └───tcmeta│ └───service│ └───impl└───generated-sources└───annotations
5.3.2 父模块创建
创建一个普通的Maven工程即可,并删除掉src目录.在
pom.xml
文件引入依赖
<properties><maven.compiler.source>17</maven.compiler.source><maven.compiler.target>17</maven.compiler.target><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties><dependencies><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.40</version></dependency>
</dependencies><dependencyManagement><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-dependencies</artifactId><version>3.5.6</version><type>pom</type><scope>import</scope></dependency></dependencies>
</dependencyManagement>
5.3.3 创建公共模块
定义公共接口, 其它公共功能暂不需要
package cn.tcmeta.service.interfaces;public interface IUserService {String sayHi(String otherName);
}
5.3.4 创建dubbo3的provider
[!tip]
- 创建模块,引入如下的依赖
✅ 1. 引入依赖
<properties><maven.compiler.source>17</maven.compiler.source><maven.compiler.target>17</maven.compiler.target><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><dubbo3.version>3.3.5</dubbo3.version>
</properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId></dependency><dependency><groupId>cn.tcmeta</groupId><artifactId>tc-dubbo3-interface</artifactId><version>1.0-SNAPSHOT</version></dependency><dependency><groupId>org.apache.dubbo</groupId><artifactId>dubbo-nacos-spring-boot-starter</artifactId><version>${dubbo3.version}</version></dependency><dependency><groupId>org.apache.dubbo</groupId><artifactId>dubbo-spring-boot-starter</artifactId><version>${dubbo3.version}</version></dependency>
</dependencies>
✅ 2. 配置文件application.yml
直接复制即可
# Spring 应用的基本配置
spring:application:name: tc-dubbo-service-provider # Spring Boot 应用名称,用于服务识别和日志等# 内嵌 Web 服务器端口配置(虽然 Dubbo 服务通常不依赖 HTTP,但 Spring Boot 默认会启动 Web 容器)
server:port: 8082 # Spring Boot 内嵌服务器监听端口(如 Tomcat)# Dubbo 框架相关配置
dubbo:application:name: tc-dubbo-provider # Dubbo 应用名称,用于注册中心中标识该服务提供者id: tc-dubbo-provider # Dubbo 应用的唯一 ID(可选,通常与 name 一致)# 监控中心配置(用于收集服务调用统计信息)# monitor:# protocol: dubbo-registry # 使用注册中心作为监控协议(Dubbo 3 中通常通过注册中心上报监控数据)# 注册中心配置registry:address: nacos://localhost:8848 # 注册中心地址,使用 Nacos,地址为本地 8848 端口register-mode: instance # 注册模式:# - instance:仅注册应用实例(Dubbo 3 推荐的默认模式)# - all:同时注册应用实例和接口(兼容 Dubbo 2 的行为)# - interface:仅注册接口(已废弃,不推荐)# 配置中心配置(用于动态配置管理)config-center:address: nacos://localhost:8848 # 配置中心地址,同样使用本地 Nacos# 元数据中心配置(用于存储服务元数据,如接口、方法、参数等信息)metadata-report:address: nacos://localhost:8848 # 元数据中心地址,也使用 Nacos 存储# 服务提供方(Provider)的默认行为配置provider:threadpool: fixed # 线程池类型:fixed 表示固定大小线程池(也可选 cached、limited 等)threads: 10 # 固定线程池的线程数量loadbalance: roundrobin # 负载均衡策略(此处为提供者端配置,但实际生效于消费者端;# 常见值:roundrobin, random, leastactive, consistenthash)timeout: 5000 # 默认服务调用超时时间(单位:毫秒),即消费者等待响应的最大时间retries: 3 # 失败重试次数(不包括首次调用),仅对幂等操作安全;设为 0 表示不重试# 通信协议配置protocol:name: dubbo # 使用的协议名称,dubbo 表示使用 Dubbo 协议(基于 TCP + 二进制序列化)port: -1 # 服务监听端口:# -1 表示由系统自动分配可用端口(推荐,避免端口冲突)# 也可指定具体端口如 20880
✅ 3. 创建启动类
package cn.tcmeta.service;import org.apache.dubbo.config.spring.context.annotation.EnableDubbo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;/*** @author: laoren* @description: 启动类* @version: 1.0.0*/
@SpringBootApplication
@EnableDubbo // 启动dubbo3
public class TCDubbo3ProviderApplication {public static void main(String[] args) {SpringApplication.run(TCDubbo3ProviderApplication.class, args);}
}
5.3.5 创建dubbo3的consumer
✅ 1. 引入依赖
<properties><maven.compiler.source>17</maven.compiler.source><maven.compiler.target>17</maven.compiler.target><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><dubbo3.version>3.3.5</dubbo3.version>
</properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId></dependency><dependency><groupId>cn.tcmeta</groupId><artifactId>tc-dubbo3-interface</artifactId><version>1.0-SNAPSHOT</version></dependency><dependency><groupId>org.apache.dubbo</groupId><artifactId>dubbo-nacos-spring-boot-starter</artifactId><version>${dubbo3.version}</version></dependency><dependency><groupId>org.apache.dubbo</groupId><artifactId>dubbo-spring-boot-starter</artifactId><version>${dubbo3.version}</version></dependency>
</dependencies>
✅ 2. application.yml配置文件
spring:application:name: tc-dubbo3-service-consumerserver:port: 8088# 配置dubbo
dubbo:application:name: tc-dubbo3-consumerid: tc-dubbo3-consumerqos-enable: trueqos-port: 33333#monitor:# protocol: dubbo-registryregistry:address: nacos://localhost:8848register-mode: allconfig-center:address: nacos://localhost:8848metadata-report:address: nacos://localhost:8848protocol:name: dubboport: -1 # 端口不能与dubbo-provider重复, 直接写-1,表示由dubbo启动一个端口consumer:check: falsetimeout: 3000 # 默认调用超时(毫秒),应与提供者协商一致retries: 0 # 【关键】非幂等操作必须为 0!幂等操作可设为 1loadbalance: random # 负载均衡策略:random(默认)比 roundrobin 更均匀lazy: true # 【可选】懒加载连接,首次调用才建立连接(减少启动开销)
✅ 3. controller定义
@RestController
@RequestMapping("/api/pub/v1/")
public class UserController {@DubboReferenceprivate IUserService userService;@GetMapping("/hello")public String hello(@RequestParam("name") String name) {return userService.sayHi(name);}
}
✅ 4. 启动类
package cn.tcmeta;import org.apache.dubbo.config.spring.context.annotation.EnableDubbo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;/*** @author: laoren* @description: TCDubbo3ConsumerApplication* @version: 1.0.0*/
@EnableDubbo
@SpringBootApplication
public class TCDubbo3ConsumerApplication {public static void main(String[] args) {SpringApplication.run(TCDubbo3ConsumerApplication.class, args);}
}
5.4 测试
✅ 1. 启动nacos 2.3.2 版本【测试3.1.0无法注册上服务,可能是操作姿势不对,原因待查】
打开nacos后台管理页面: localhost:8848/nacos/index.html
- 默认用户名称和密码都是: nacos
- 3.x默认强制鉴权,2.x版本不强制
✅ 2. 启动provider服务
✅ 3. 启动consumer服务
✅ 4. 请求接口
http://localhost:8088/api/pub/v1/hello?name=想不想看花海盛开,想不想等燕子归来
至此,整合成功!
5.5 答疑
5.5.1 为什么服务的消费者没有注册为服务实例?
✅ 根本原因:Dubbo 3 默认 不注册消费者.
从 Dubbo 3.0 开始,为了优化注册中心压力、支持 Service Mesh 架构,默认只注册服务提供者(Provider),消费者(Consumer)不再注册为“服务实例”。
📌 Nacos 控制台的“服务列表”只显示“服务提供者”,消费者不会出现在这里. 这是 设计行为,不是 bug。
⚠️ 注意:如果要强制进行注册
- 这会增加 Nacos 的注册压力(每个消费者都注册一个实例)。
- 在 Dubbo 3 的“应用级服务发现”模式下,不推荐开启。
- 仅在需要通过 Nacos 直接监控消费者(如某些旧版运维工具依赖)时才启用。
✅ 总结
Dubbo 3 消费者不在 Nacos 服务列表中是正常现象,因为默认只注册提供者。
- 只要消费者能成功调用服务,且在 Nacos 的“订阅者列表”中可见,就说明一切正常。
- 如非特殊需求,不要开启
register-consumer: true
。
5.5.2 关于启动中出现qos端口号冲突问题
✅ qos详细信息参数4.5章节
配置:
dubbo:application:name: tc-dubbo-providerid: tc-dubbo-provider# 【生产关键】开启 QoS(运维调试端口),但建议限制访问 IP 或关闭qos-enable: false # 默认 true,生产环境建议关闭,防止未授权访问# qos-accept-foreign-ip: false # 若开启 QoS,必须设为 false,禁止外网访问# qos-port: 33333 # QoS 端口(仅当 qos-enable=true 时生效)
5.5.3 配置项
结合spring boot 3.5.6 的配置项.
✅ 1. Spring与Server配置
spring:application:name: your-app-name # Spring 应用名(用于 Actuator、日志等)server:port: 8080 # 若仅 Dubbo 服务,可设为 -1 禁用 Web 容器
✅ 2. Dubbo 应用级配置(dubbo.application)
配置项 | 默认值 | 说明 |
---|---|---|
name | - | 必填。Dubbo 应用名,注册到注册中心的标识 |
id | 同 name | 应用唯一 ID(通常与 name 一致) |
owner | - | 应用负责人(用于治理) |
organization | - | 所属组织 |
qos-enable | true | 是否启用 QoS(运维调试端口) |
qos-port | 33333 | QoS 端口 |
qos-accept-foreign-ip | false | 是否接受外网 IP 访问 QoS(生产务必 false) |
register-consumer | false | 消费者是否注册到注册中心(Dubbo 3 默认不注册) |
service-discovery.migration | APPLICATION_FIRST | 服务发现模式(APPLICATION_FIRST/ INTERFACE_FIRST) |
💡 Dubbo 3 默认使用“应用级服务发现”(Application-Level Service Discovery),更轻量、兼容 Service Mesh。
✅ 3. 注册中心(dubbo.registry)
dubbo:registry:address: nacos://nacos.example.com:8848username: ${NACOS_USERNAME}password: ${NACOS_PASSWORD}group: DUBBO_GROUPtimeout: 10000parameters:namespace: prodregister-mode: instance # instance / all / interface
配置项 | 说明 |
---|---|
address | 注册中心地址,支持 nacos://、zookeeper:// 等 |
username/password | Nacos 开启鉴权时必需 |
group | 分组隔离(避免不同环境/项目冲突) |
namespace | Nacos 命名空间(用于多环境隔离) |
register-mode | instance(推荐:仅注册应用实例) all:兼容 Dubbo 2 |
✅ 4. 配置中心(dubbo.config-center)
dubbo:config-center:address: nacos://nacos.example.com:8848group: DUBBO_GROUPnamespace: prodtimeout: 10000
- 用于动态配置覆盖(如修改超时、权重)。
- 配置 Key 格式:dubbo.properties(全局)或 应用名:dubbo.properties(应用级)。
✅ 5. 元数据中心(dubbo.metadata-report)
dubbo:metadata-report:address: nacos://nacos.example.com:8848group: DUBBO_GROUPnamespace: prod
- 存储服务接口、方法、参数等元数据。
- 消费者通过元数据实现“服务自省”(Service Self-Introspection)。
✅ 6. 协议配置(dubbo.protocol)
dubbo:protocol:name: dubbo # 协议类型(dubbo / tri / rest 等)port: 20880 # 提供者监听端口(消费者可设为 -1)threads: 200 # 协议级线程数(覆盖 provider 配置)payload: 8388608 # 最大请求包大小(8MB)
🔹 tri 协议(Triple)是 Dubbo 3 推荐的下一代协议,兼容 gRPC。
✅ 7. 服务提供者配置(dubbo.provider)
dubbo:provider:timeout: 5000 # 默认超时(ms)retries: 0 # 重试次数(非幂等操作必须为 0)loadbalance: random # 负载均衡策略threadpool: fixed # 线程池类型(fixed / cached / limited)threads: 200 # 线程数queues: 0 # 任务队列大小(0 = 直接拒绝)executes: 1000 # 单方法最大并发执行数serialization: hessian2 # 序列化方式group: my-group # 服务分组version: 1.0.0 # 服务版本
✅ 8. 服务消费者配置(dubbo.consumer)
dubbo:consumer:check: false # 启动时是否检查服务可用性(生产建议 false)timeout: 3000 # 默认调用超时retries: 0 # 重试次数loadbalance: random # 负载均衡策略lazy: true # 懒连接(首次调用才建立连接)actives: 10 # 每个服务最大并发调用数(防雪崩)cluster: failfast # 集群容错策略(failover / failfast / failsafe / forking)serialization: hessian2group: my-group # 必须与提供者一致version: 1.0.0 # 必须与提供者一致
✅ 9. 监控与指标(dubbo.metrics)
dubbo:metrics:protocol: prometheus # 指标协议port: 9090 # 指标暴露端口enable-jvm: true # 是否收集 JVM 指标
- 通过
http://host:9090/metrics
可获取 Prometheus 格式指标。
✅ 10. 日志与调试
dubbo:logger: slf4j # 日志框架(slf4j / log4j / log4j2)
✅ 11. 生产环境关键建议
项目 | 建议 |
---|---|
注册模式 | register-mode: instance |
消费者注册 | register-consumer: false(默认) |
QoS | qos-enable: false |
重试 | 非幂等接口 retries: 0 |
超时 | 根据业务 SLA 设置(通常 1~5 秒) |
Nacos | 使用集群地址 + 命名空间 + 分组隔离 |
安全 | Nacos 开启鉴权,敏感信息通过环境变量注入 |
可观测性 | 开启 Metrics + 链路追踪(SkyWalking/Zipkin) |