← 返回首页
一、Dubbo 架构与核心概念
- 整体架构:Provider(服务提供者)→ Registry(注册中心)→ Consumer(服务消费者)→ Monitor(监控中心)
- 调用流程:Provider 启动注册服务 → Consumer 订阅服务列表 → Consumer 本地缓存地址 → 直接调用 Provider → Monitor 统计调用数据
- 核心特性:面向接口的 RPC 调用、智能负载均衡、服务自动注册与发现、高度可扩展(SPI)
- 协议支持:dubbo(默认,单一长连接+NIO)/ triple(兼容 gRPC)/ rest / hessian2
- 注册中心:Zookeeper(推荐)/ Nacos / Redis / Consul,服务地址的存储与通知
二、服务调用原理
- 代理层:Consumer 通过动态代理(Javassist/JDK)生成接口代理对象,调用透明化
- 序列化:Hessian2(默认)/ Protobuf / Kryo / JSON,影响传输效率和兼容性
- 网络通信:基于 Netty 的 NIO 异步通信,默认单一长连接复用
- 调用方式:同步调用(默认)/ 异步调用(CompletableFuture)/ 单向调用(oneway)
- 线程模型:IO 线程(Netty Worker)接收请求 → 业务线程池处理逻辑 → IO 线程返回结果
三、集群容错与负载均衡
集群容错策略
- Failover(默认):失败自动切换,重试其他节点,适合读操作,默认重试 2 次
- Failfast:快速失败,只调用一次,适合写操作(非幂等)
- Failsafe:失败安全,异常直接忽略,适合日志记录等
- Failback:失败自动恢复,后台定时重发,适合消息通知
- Forking:并行调用多个节点,一个成功即返回,实时性要求高的场景
负载均衡策略
- Random(默认):加权随机,权重越大被选中概率越高
- RoundRobin:加权轮询,按权重分配请求
- LeastActive:最少活跃调用数,慢节点收到更少请求
- ConsistentHash:一致性哈希,相同参数请求路由到同一节点
- ShortestResponse:最短响应时间优先
四、Dubbo SPI 扩展机制
- Java SPI vs Dubbo SPI:Java SPI 一次加载所有实现;Dubbo SPI 按需加载(Key-Value),支持 AOP 和 IoC
- @SPI 注解:标记扩展点接口,指定默认实现
- @Adaptive 注解:自适应扩展,运行时根据 URL 参数动态选择实现
- @Activate 注解:条件激活,根据条件自动激活扩展(如 Filter 链)
- Wrapper 机制:AOP 包装,自动包装扩展实现,实现功能增强
- 扩展目录:
META-INF/dubbo/、META-INF/dubbo/internal/、META-INF/services/
五、服务治理
- 服务降级:
mock=force:return null(强制降级)/ mock=fail:return null(失败降级)
- 服务限流:
executes(Provider 端并发限制)/ actives(Consumer 端并发限制)
- 超时控制:Consumer 优先级高于 Provider,方法级 > 接口级 > 全局,默认 1000ms
- 版本控制:
version 属性实现灰度发布,不同版本服务隔离
- 分组路由:
group 属性将同一接口的不同实现分组
- 动态配置:通过配置中心(Nacos/Zookeeper)动态修改路由规则、权重、降级策略
六、性能调优
- 线程池:fixed(默认 200 线程)/ cached / limited,根据业务调整大小
- 连接数:
connections 控制长连接数,高并发场景可增加
- 序列化选择:Protobuf/Kryo 性能优于 Hessian2,但兼容性需评估
- 异步调用:非阻塞调用提升吞吐量,
CompletableFuture 编排
- 本地缓存:Consumer 缓存服务地址列表,注册中心宕机不影响已有调用
- 直连模式:开发测试时绕过注册中心,
url 属性直接指定 Provider 地址