一、什么是 Dubbo?
Dubbo 是阿里开源的分布式 RPC 服务框架,支持高性能远程调用、自动注册与发现、负载均衡、故障容错等功能。
Dubbo 的核心解决问题:
- 服务治理
- 服务注册与发现
- 高性能远程调用(基于 Netty)
- 可插拔的协议和序列化方式
- 健康检查、负载均衡、限流、降级等
二、Dubbo 架构组成
+---------+ +--------------+ +----------+
| Consumer| <----> | Registry(如ZK)| <--> | Provider |
+---------+ +--------------+ +----------+
│ │ │
│ <--- 获取服务 ---- │ <---- 注册服务 ------- │
│ --- 远程调用 ----> │ │
Dubbo 主要角色说明:
组件 | 描述 |
---|---|
Provider | 提供服务的生产者 |
Consumer | 消费服务的调用者 |
Registry | 服务注册中心(如 ZooKeeper) |
Monitor | 监控服务调用情况(可选) |
Container | Dubbo 服务启动容器 |
三、快速入门:使用 Dubbo + SpringBoot
1. 引入依赖
<!-- dubbo -->
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>3.2.0</version>
</dependency>
<!-- zk 注册中心 -->
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-recipes</artifactId>
<version>5.4.0</version>
</dependency>
2. 定义公共接口模块(api)
public interface UserService {
String getUsername(Long id);
}
3. 服务提供者
@DubboService
public class UserServiceImpl implements UserService {
public String getUsername(Long id) {
return "User_" + id;
}
}
4. 服务消费者
@DubboReference
private UserService userService;
public void test() {
System.out.println(userService.getUsername(123L));
}
5. application.yml 配置
dubbo:
application:
name: user-service
registry:
address: zookeeper://127.0.0.1:2181
protocol:
name: dubbo
port: 20880
四、Dubbo 核心原理简析
4.1 服务注册与发现
- 启动时,Provider 向 Registry 注册服务
- Consumer 启动后,从注册中心拉取 Provider 地址
- 调用时通过 Netty 连接远程 Provider 执行方法
4.2 通信协议(Dubbo 协议)
- 默认使用 Dubbo 协议(TCP + 自定义二进制协议)
- 可选:rest、http、rmi、hessian、webservice
4.3 序列化方式
- 默认:Hessian2
- 推荐:FastJson、Kryo、FST、Protobuf(性能更高)
五、Dubbo 调用流程详解
Consumer 调用 -> 代理类 -> Cluster -> LoadBalance -> Invoker -> Netty 客户端 -> Provider 端 NettyServer -> 反射执行服务方法 -> 返回结果
- Proxy:生成接口的代理类(JDK 动态代理)
- Cluster:聚合多个 Invoker,容错逻辑在这
- Invoker:具体的远程调用执行者
- Protocol:协议封装 + 解封装
- NettyClient/Server:底层通信框架
六、Dubbo SPI(插件扩展机制)
Dubbo 全部基于 SPI 架构设计,允许你动态扩展协议、序列化、负载均衡等。
6.1 如何自定义 SPI 扩展?
定义接口
创建实现类
在
META-INF/dubbo
中注册:com.example.MyInterface=impl1,impl2
使用
@SPI
、@Adaptive
注解实现自动注入
七、Dubbo 负载均衡策略
策略名称 | 描述 |
---|---|
Random(默认) | 随机选择一个服务,权重可调 |
RoundRobin | 轮询策略 |
LeastActive | 最少活跃调用数优先 |
ConsistentHash | 一致性哈希,同一参数落到同一提供者上 |
配置方式:
dubbo:
consumer:
loadbalance: roundrobin
八、Dubbo 集群容错策略
策略 | 描述 |
---|---|
Failover | 默认,失败自动重试(适合读操作) |
Failfast | 失败立即报错(适合写操作) |
Failsafe | 忽略异常(适合日志等不敏感操作) |
Failback | 失败后记录,后台重试 |
Forking | 并行调用多个,只取第一个返回的结果 |
Broadcast | 广播调用所有服务(适合通知类服务) |
配置方式:
dubbo:
consumer:
cluster: failfast
九、服务治理功能
- 服务降级:配置熔断策略
- 服务限流:防止雪崩
- 服务灰度发布:灰度路由机制
- 注册中心同步状态监控:可视化管理界面(Dubbo Admin)
- 服务动态配置:支持动态规则(Tag、Routing、Mock)
十、Dubbo 常见问题
问题 | 解决方案 |
---|---|
服务调用报错 no provider | Provider 没有注册,或端口没开放,检查 zk 与服务 |
服务引用失败 | @DubboReference 写法、Spring 扫描路径问题 |
调用慢 | 网络、注册中心堵塞、Provider 内部处理慢 |
多注册中心 | 支持配置多个 registry.address |
参考资源
推荐学习路线:
- 学习基础概念(RPC、注册中心、Netty)
- 实战搭建服务
- 查看源码调试调用流程
- 自定义 SPI 插件
- 部署 Dubbo Admin 做治理