Skip to content

Dubbo 架构与原理


┌─────────────────────────────────────────────────────────────────────┐
│ Dubbo 架构 │
├─────────────────────────────────────────────────────────────────────┤
│ │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
│ │ Service │ │ Config │ │ Proxy │ │
│ │ Provider │ │ Layer │ │ Layer │ │
│ └─────────────┘ └─────────────┘ └─────────────┘ │
│ │ │ │ │
│ └───────────────────┼───────────────────┘ │
│ ▼ │
│ ┌─────────────────────────────────────────────────────────┐ │
│ │ Registry │ │
│ │ (注册中心层) │ │
│ └─────────────────────────────────────────────────────────┘ │
│ │ │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
│ │ Cluster │ │ Monitor │ │ Protocol │ │
│ │ Layer │ │ Layer │ │ Layer │ │
│ └─────────────┘ └─────────────┘ └─────────────┘ │
│ │ │
│ ▼ │
│ ┌─────────────────────────────────────────────────────────┐ │
│ │ Exchange │ │
│ │ (信息交换层) │ │
│ └─────────────────────────────────────────────────────────┘ │
│ │ │
│ ▼ │
│ ┌─────────────────────────────────────────────────────────┐ │
│ │ Transport │ │
│ │ (网络传输层) │ │
│ └─────────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────────┘
层级组件职责
BusinessService业务层,即开发者实现的接口
RPCConfig配置层,暴露/引用服务的配置
RPCProxy代理层,生成 Stub 代理
RPCRegistry注册中心,服务注册与发现
RPCCluster集群层,负载均衡、容错
RPCMonitor监控层,统计调用次数、耗时
RPCProtocol协议层,RPC 调用的协议封装
RemotingExchange信息交换层,请求响应模型
RemotingTransport传输层,NIO、Netty、Mina

// 1. 配置服务
@DubboService(version = "1.0.0", group = "prod")
public class UserServiceImpl implements UserService {
@Override
public User getUserById(Long id) {
return userDao.selectById(id);
}
}
<!-- 2. 配置文件 -->
<dubbo:application name="user-service" />
<dubbo:registry address="zookeeper://127.0.0.1:2181" />
<dubbo:protocol name="dubbo" port="20880" />
<dubbo:service interface="com.example.UserService" ref="userService" />
// 1. 引用远程服务
@DubboReference(version = "1.0.0", group = "prod")
private UserService userService;
// 2. 像调用本地方法一样调用
User user = userService.getUserById(1001L);
<!-- XML 配置方式 -->
<dubbo:reference interface="com.example.UserService"
version="1.0.0"
group="prod"
timeout="3000"
retries="2" />

SPI(Service Provider Interface)是 Java 提供的一种服务发现机制,允许在运行时动态加载实现类。

传统 Spring:应用定义接口,Spring 注入实现
SPI:接口定义规范,运行时动态发现实现
META-INF/dubbo/org.apache.dubbo.rpc.cluster.LoadBalance
// Dubbo SPI 示例:LoadBalance 接口
// random = org.apache.dubbo.rpc.cluster.loadbalance.RandomLoadBalance
// roundrobin = org.apache.dubbo.rpc.cluster.loadbalance.RoundRobinLoadBalance
// leastactive = org.apache.dubbo.rpc.cluster.loadbalance.LeastActiveLoadBalance
// consistenthash = org.apache.dubbo.rpc.cluster.loadbalance.ConsistentHashLoadBalance
// 1. 定义接口
@SPI("dubbo")
public interface Protocol {
@Adaptive
Exporter<?> export(Invoker<?> invoker) throws RpcException;
@Adaptive
Invoker<?> refer(Class<?> type, URL url) throws RpcException;
}
// 2. 实现接口
public class CustomProtocol implements Protocol {
@Override
public Exporter<?> export(Invoker<?> invoker) {
// 自定义导出逻辑
return new CustomExporter(invoker);
}
@Override
public Invoker<?> refer(Class<?> type, URL url) {
// 自定义引用逻辑
return new CustomInvoker(type, url);
}
}
// 3. 配置 SPI 文件
// META-INF/dubbo/org.apache.dubbo.rpc.Protocol
// custom = com.example.CustomProtocol

<dubbo:reference cluster="failover" retries="2" />
  • 调用失败时,自动切换其他服务器重试
  • 适用于读操作
  • retries 指定重试次数
<dubbo:reference cluster="failfast" />
  • 调用失败立即报错
  • 适用于非幂等操作(如新增数据)
<dubbo:reference cluster="failsafe" />
  • 调用失败静默处理,返回空结果
  • 适用于日志记录等非核心服务
<dubbo:reference cluster="forking" forks="3" />
  • 并行调用多个服务器,只要一个成功就返回
  • 适用于实时性要求高的场景
<dubbo:reference cluster="broadcast" />
  • 逐个调用所有提供者,任意一台报错则终止
  • 适用于更新缓存等场景

// 随机选择可用服务器
// 权重相同时:每个服务器概率相等
// 权重不同时:按权重分配概率
// 依次选择可用服务器
// 缺点:不考虑服务器性能差异
// 改进:加权轮询

3. LeastActive LoadBalance(最少活跃数)

Section titled “3. LeastActive LoadBalance(最少活跃数)”
// 选择活跃数最少的服务器
// 活跃数 = 正在处理的请求数
// 性能好的服务器处理更快,活跃数更少

4. ConsistentHash LoadBalance(一致性 Hash)

Section titled “4. ConsistentHash LoadBalance(一致性 Hash)”
// 相同参数的请求路由到同一服务器
// 解决分布式缓存问题
// 虚拟节点解决数据倾斜

特性DubboSpring Cloud
定位RPC 框架微服务全家桶
通信协议Dubbo 协议 / HTTPHTTP / Feign
注册中心ZooKeeper / NacosEureka / Nacos
服务发现多种多种
负载均衡多种Ribbon
容错机制多种Sentinel
配置中心Apollo / NacosConfig Server
网关Gateway
性能高(TCP/NIO)较低(HTTP)
学习成本
适合用 Dubbo:
- 对性能要求高
- Java 系技术栈
- 已有 ZooKeeper 基础设施
适合用 Spring Cloud:
- 多语言团队
- 微服务全家桶需求
- Spring 生态深度集成

参考答案

  1. 服务提供者启动时向注册中心注册服务
  2. 服务消费者启动时从注册中心订阅服务
  3. 注册中心返回服务提供者列表给消费者
  4. 消费者根据负载均衡策略选择提供者进行调用
  5. 监控中心统计服务调用情况

参考答案

  • Hessian:默认序列化方式,性能好
  • Java 原生:JDK 自带,不推荐(性能差、安全问题)
  • Kryo:高性能序列化
  • Protobuf:跨语言高性能
  • FST:Java 高性能序列化

参考答案

  • 负载均衡:Random、RoundRobin、LeastActive、ConsistentHash
  • 集群容错:Failover、Failfast、Failsafe、Forking、Broadcast
  • 限流降级:Sentinel 集成
  • 服务路由:条件路由、脚本路由
  • 动态配置:配置中心动态修改参数