- 服务注册:
- 本地中心注册:方便生产者找到根据消费者的请求找到对应的方法的调用。
- 服务暴露:通过tomcat、netty暴露方法调用. 通过网络请求收到消费者的参数,通过反射的方式调用。
- 注册中心注册:生产者主动暴露服务方便消费者发现服务。
- 心跳机制:保证注册中心的服务信息的。
- 服务运行:反射方式调用。
- 服务发现:
- 本地缓存:拉取注册中心的数据缓存到本地,减少多次请求远程。
- 监听的方式:关注注册中心的配置变更。
- 服务调用:动态代理-生成代理对象。
| 策略名称 | 配置值 | 默认权重 | 适用场景 | 核心思想 |
|---|
| 随机 | random | ✅ 是 | 通用场景,请求量均匀 | 按权重随机选一个 |
| 轮询 | roundrobin | ✅ 是 | 机器性能均匀,追求绝对平均 | 按权重轮询分配 |
| 最少活跃 | leastactive | ✅ 是 | 长连接、慢请求场景 | 选当前处理请求最少的节点 |
| 一致性哈希 | consistenthash | ❌ 否 | 有状态服务(如缓存、会话粘滞) | 根据参数 hash 值固定路由 |
| 自定义负载均衡: | | | | |
// 1. 实现 LoadBalance 接口
public class MyLoadBalance implements LoadBalance {
@Override
public <T> Invoker<T> select(List<Invoker<T>> invokers, URL url, Invocation invocation) {
// 自定义选择逻辑
return invokers.get(0);
}
}
// 2. SPI 扩展文件:META-INF/dubbo/com.alibaba.dubbo.rpc.cluster.LoadBalance
mybalance = com.example.MyLoadBalance
// 3. 使用
@DubboService(loadbalance = "mybalance")
public class UserServiceImpl implements UserService {}
| 协议 | 传输层 | 序列化 | |
|---|
| Dubbo | Netty | Hessian2 | Dubbo 最核心、最常用的协议,默认协议。适合数据少的 |
| Triple | Netty (HTTP/2) | Protobuf | Dubbo 3.0 引入的下一代协议,基于 gRPC 的扩展 |
| gRPC | Netty (HTTP/2) | Protobuf | gRPC 作为底层协议,与原生 gRPC 完全互通 |
| REST | Netty/Tomcat | JSON | HTTP + JSON将服务暴露为 RESTful API |
| Hessian | Netty | Hessian | 基于http协议 |
| Thrift | Netty | Thrif | |
| WebSocket | Netty | | |
Dubbo 协议性能王,纯 Java 调用最优选;
Triple 新星云原生,跨语言流式都擅长;
REST 对外开 API,Hessian 轻量跨语言;
Thrift 兼容老系统,混合协议最灵活。
| 策略名称 | 配置值 | 核心行为 | 适用场景 | 数据一致性风险 |
|---|
| Failover(失败自动切换) | failover | 失败后自动重试其他节点(默认)配合 retries设置重试次数(不包括第一次),默认 2(即最多调用 3 次) | 读操作、幂等写操作 | 低(重试可能重复执行) |
| Failfast( 快速失败) | failfast | 失败立即报错,不重试 | 非幂等写操作(如支付、下单) | 无(只报错,不重试) |
| Failsafe(失败安全) | failsafe | 立即返回 null,同时记录日志 | 审计日志、监控上报 | 无(忽略失败) |
| Failback( 失败自动恢复)将失败请求存入内存队列,后台定时线程(默认每 5 秒)重试,直到成功或达到最大重试次数(默认 3 次) | failback | 立即返回 null,同时将失败后存入队列,定时重试 | 消息通知、非实时任务 | 低(后台补偿) |
| Forking | forking | 并行调用多个节点,谁先返回用谁 | 实时性要求极高的查询 | 无 |
| Broadcast | broadcast | 广播调用所有节点,全部成功才算成功 | 缓存刷新、通知所有节点 | 高(部分失败需回滚) |
- 服务解析:
- springboot解析@DubboService注解生成ServiceBean
- 合并配置ServiceConfig方法级 > 接口级 > 提供者级 > 应用级 > 全局默认。最终生成一个满载配置的
URL 对象(如 dubbo://192.168.1.100:20880/com.example.UserService?timeout=3000&retries=2)
- 服务暴露:ServiceConfig的exprot方法
- 本地暴露:创建一个
Invoker,直接调用服务实现类的本地方法。 - 远程暴露:
- 启动 Netty Server
- 服务注册:将服务 URL 写入 ZK/Nacos注册中心,订阅动态配置
- 创建代理对象(创建壳):这个过程发生在 Spring 注入
@DubboReference 字段时。 - Spring 扫描
@DubboReference 注解。创建 ReferenceBean它实现了 Spring 的 FactoryBean 接口。创建代理对象通使用 ProxyFactory生成一个动态代理对象。此时,代理对象只是一个“空壳”,还没有真正连接注册中心。
- 连接与订阅:在第一次调用时触发(懒加载),或启动时触发(饿加载)触发
- 注册中心:重注册中心获取服务的配置比如:ip,端口。
- 负载均衡:挑选机器。
- 发起送请求:发送调用信息比如:接口全类名、方法名、参数类型列表、参数列表等等信息。