大家好,我是小悟。
一、Dubbo 简介
Dubbo是阿里巴巴开源的一款高性能、轻量级的 Java RPC 框架,主要功能包括:
核心特性:
- 面向接口的远程方法调用- 透明化的远程调用,像调用本地方法一样调用远程方法
- 智能负载均衡- 内置多种负载均衡策略(随机、轮询、最少活跃调用等)
- 服务自动注册与发现- 支持多种注册中心(Zookeeper、Nacos、Consul等)
- 高可用性- 集群容错、失败重试、服务降级
- 运行期流量调度- 可基于路由规则实现灰度发布
- 可视化的服务治理- 提供丰富的监控和管理界面
核心组件:
- Provider:服务提供者,暴露服务
- Consumer:服务消费者,调用远程服务
- Registry:注册中心,负责服务注册与发现
- Monitor:监控中心,统计服务调用次数和调用时间
二、实战步骤
环境准备
- JDK 1.8+
- Maven 3.6+
- Spring Boot 2.7.x
- Dubbo 3.x
- Zookeeper 3.6+(或使用 Nacos)
步骤1:创建父工程(可选)
<!-- pom.xml --> <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0"> <modelVersion>4.0.0</modelVersion> <groupId>com.example</groupId> <artifactId>dubbo-demo</artifactId> <version>1.0.0</version> <packaging>pom</packaging> <modules> <module>dubbo-api</module> <module>dubbo-provider</module> <module>dubbo-consumer</module> </modules> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.7.14</version> </parent> <properties> <dubbo.version>3.2.0</dubbo.version> <zookeeper.version>3.8.0</zookeeper.version> <curator.version>5.3.0</curator.version> </properties> </project>步骤2:创建 API 模块(定义服务接口)
// UserService.java - 服务接口 package com.example.service; public interface UserService { UserDTO getUserById(Long id); List<UserDTO> findAllUsers(); Long createUser(UserDTO user); } // UserDTO.java - 数据传输对象 package com.example.dto; import java.io.Serializable; public class UserDTO implements Serializable { private Long id; private String username; private String email; private Integer age; // 构造器、getter、setter省略 }<!-- dubbo-api/pom.xml --> <dependencies> <dependency> <groupId>org.apache.dubbo</groupId> <artifactId>dubbo</artifactId> <version>${dubbo.version}</version> </dependency> </dependencies>步骤3:创建 Provider(服务提供者)
<!-- dubbo-provider/pom.xml --> <dependencies> <!-- API 模块依赖 --> <dependency> <groupId>com.example</groupId> <artifactId>dubbo-api</artifactId> <version>${project.version}</version> </dependency> <!-- Spring Boot --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency> <!-- Dubbo Spring Boot Starter --> <dependency> <groupId>org.apache.dubbo</groupId> <artifactId>dubbo-spring-boot-starter</artifactId> <version>${dubbo.version}</version> </dependency> <!-- Zookeeper 注册中心 --> <dependency> <groupId>org.apache.dubbo</groupId> <artifactId>dubbo-registry-zookeeper</artifactId> <version>${dubbo.version}</version> </dependency> <!-- Zookeeper 客户端 --> <dependency> <groupId>org.apache.curator</groupId> <artifactId>curator-framework</artifactId> <version>${curator.version}</version> </dependency> <dependency> <groupId>org.apache.curator</groupId> <artifactId>curator-recipes</artifactId> <version>${curator.version}</version> </dependency> <!-- 如果使用 Nacos,替换为: <dependency> <groupId>com.alibaba.nacos</groupId> <artifactId>nacos-client</artifactId> <version>2.1.0</version> </dependency> --> </dependencies># application.yml spring: application: name: dubbo-provider dubbo: application: name: ${spring.application.name} qos-enable: false # 关闭QoS服务,避免端口冲突 protocol: name: dubbo port: 20880 registry: address: zookeeper://localhost:2181 # 如果使用Nacos:nacos://localhost:8848 scan: base-packages: com.example.service.impl # 服务实现类扫描路径 provider: timeout: 5000 retries: 3// UserServiceImpl.java - 服务实现 package com.example.service.impl; import org.apache.dubbo.config.annotation.DubboService; import com.example.service.UserService; import com.example.dto.UserDTO; import java.util.ArrayList; import java.util.List; import java.util.concurrent.ConcurrentHashMap; @DubboService(version = "1.0.0", group = "user-service") public class UserServiceImpl implements UserService { private final ConcurrentHashMap<Long, UserDTO> userStore = new ConcurrentHashMap<>(); private Long idGenerator = 1L; @Override public UserDTO getUserById(Long id) { return userStore.get(id); } @Override public List<UserDTO> findAllUsers() { return new ArrayList<>(userStore.values()); } @Override public Long createUser(UserDTO user) { Long id = idGenerator++; user.setId(id); userStore.put(id, user); return id; } }// ProviderApplication.java - 启动类 package com.example; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.apache.dubbo.config.spring.context.annotation.EnableDubbo; @EnableDubbo // 开启Dubbo注解支持 @SpringBootApplication public class ProviderApplication { public static void main(String[] args) { SpringApplication.run(ProviderApplication.class, args); System.out.println("Dubbo Provider 启动成功!"); } }步骤4:创建 Consumer(服务消费者)
<!-- dubbo-consumer/pom.xml --> <dependencies> <dependency> <groupId>com.example</groupId> <artifactId>dubbo-api</artifactId> <version>${project.version}</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.apache.dubbo</groupId> <artifactId>dubbo-spring-boot-starter</artifactId> <version>${dubbo.version}</version> </dependency> <dependency> <groupId>org.apache.dubbo</groupId> <artifactId>dubbo-registry-zookeeper</artifactId> <version>${dubbo.version}</version> </dependency> <dependency> <groupId>org.apache.curator</groupId> <artifactId>curator-framework</artifactId> <version>${curator.version}</version> </dependency> </dependencies># application.yml spring: application: name: dubbo-consumer dubbo: application: name: ${spring.application.name} registry: address: zookeeper://localhost:2181 consumer: check: false # 启动时不检查提供者是否可用 timeout: 5000// UserController.java - REST控制器 package com.example.controller; import org.apache.dubbo.config.annotation.DubboReference; import org.springframework.web.bind.annotation.*; import com.example.service.UserService; import com.example.dto.UserDTO; import java.util.List; @RestController @RequestMapping("/users") public class UserController { @DubboReference( version = "1.0.0", group = "user-service", check = false, timeout = 3000, retries = 2 ) private UserService userService; @GetMapping("/{id}") public UserDTO getUser(@PathVariable Long id) { return userService.getUserById(id); } @GetMapping public List<UserDTO> getAllUsers() { return userService.findAllUsers(); } @PostMapping public Long createUser(@RequestBody UserDTO user) { return userService.createUser(user); } }// ConsumerApplication.java - 启动类 package com.example; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.apache.dubbo.config.spring.context.annotation.EnableDubbo; @EnableDubbo @SpringBootApplication public class ConsumerApplication { public static void main(String[] args) { SpringApplication.run(ConsumerApplication.class, args); System.out.println("Dubbo Consumer 启动成功!"); System.out.println("访问 http://localhost:8080/users 测试"); } }步骤5:配置注册中心
使用 Docker 启动 Zookeeper:
docker run -d --name zookeeper \ -p 2181:2181 \ -e ZOO_STANDALONE_ENABLED=true \ zookeeper:3.8或使用 Nacos:
docker run -d --name nacos \ -p 8848:8848 \ -e MODE=standalone \ nacos/nacos-server:2.1.0三、高级配置示例
1. 负载均衡配置
@DubboReference( version = "1.0.0", loadbalance = "roundrobin" // 轮询负载均衡 // 可选值:random(随机)、leastactive(最少活跃调用) ) private UserService userService;2. 集群容错配置
@DubboReference( version = "1.0.0", cluster = "failover" // 失败自动切换 // 可选值:failfast(快速失败)、failsafe(失败安全) ) private UserService userService;3. 多版本支持
// Provider端 - 发布多个版本 @DubboService(version = "2.0.0", group = "user-service") public class UserServiceV2Impl implements UserService { // 新版本实现 } // Consumer端 - 引用指定版本 @DubboReference(version = "2.0.0") private UserService userService;4. 服务分组
// Provider端 @DubboService(group = "test", version = "1.0.0") public class UserServiceTestImpl implements UserService { // 测试环境实现 } @DubboService(group = "prod", version = "1.0.0") public class UserServiceProdImpl implements UserService { // 生产环境实现 } // Consumer端 @DubboReference(group = "test") // 引用测试环境服务 private UserService userService;四、Dubbo Admin 监控(可选)
安装 Dubbo Admin:
# 使用 Docker docker run -d \ --name dubbo-admin \ -p 8080:8080 \ -e admin.registry.address=zookeeper://localhost:2181 \ -e admin.config-center=zookeeper://localhost:2181 \ -e admin.metadata-report.address=zookeeper://localhost:2181 \ apache/dubbo-admin:0.5.0访问:http://localhost:8080
- 默认账号:root
- 默认密码:root
五、总结
整合要点:
- 接口共享:通过独立的 API 模块实现接口契约共享
- 注解驱动:使用
@DubboService和@DubboReference简化配置 - 配置分离:Provider 和 Consumer 配置独立管理
- 注册中心:统一使用注册中心进行服务治理
优势:
- 高性能:基于 Netty 的 NIO 通信,序列化效率高
- 透明调用:远程调用像本地调用一样简单
- 服务治理:完整的服务注册、发现、监控体系
- 生态丰富:支持多种注册中心、配置中心、监控系统
- 云原生友好:支持 Dubbo Mesh,与 Kubernetes 集成良好
最佳实践:
- 接口设计:接口应该粒度适中,避免过于复杂的方法签名
- 超时设置:根据业务特点合理设置超时时间
- 版本管理:做好服务版本规划,支持灰度发布
- 监控告警:配置完善的监控和告警机制
- 熔断降级:在 Consumer 端配置合适的容错策略
注意事项:
- 确保网络连通性,特别是注册中心的连接
- 注意序列化兼容性,特别是字段增减的情况
- 生产环境建议开启 Dubbo QoS 进行服务治理
- 合理设置线程池大小,避免资源耗尽
通过以上步骤,可以成功将 Spring Boot 与 Dubbo 集成,构建分布式微服务应用。
谢谢你看我的文章,既然看到这里了,如果觉得不错,随手点个赞、转发、在看三连吧,感谢感谢。那我们,下次再见。
您的一键三连,是我更新的最大动力,谢谢
山水有相逢,来日皆可期,谢谢阅读,我们再会
我手中的金箍棒,上能通天,下能探海