Dubbo基础知识
Dubbo
Apache Dubbo 是一款微服务开发框架,可以用于 RPC通信 与 微服务治理 。
六大核心能力
-
面向接口代理的高性能RPC调用:提供高性能的基于代理的远程调用能力,服务以接口为粒度,为开发者屏蔽远程调用底层细节。
-
智能负载均衡:内置多种负载均衡策略,智能感知下游节点健康状况,显著减少调用延迟,提高系统吞吐量。
-
服务自动注册与发现:支持多种注册中心服务,服务实例上下线实时感知。
-
高度可扩展能力:遵循微内核+插件的设计原则,所有核心能力如Protocol、Transport、Serialization被设计为扩展点,平等对待内置实现和第三方实现。
-
运行期流量调度:内置条件、脚本等路由策略,通过配置不同的路由规则,轻松实现灰度发布,同机房优先等功能。
-
可视化的服务治理与运维:提供丰富服务治理、运维工具:随时查询服务元数据、服务健康状态及调用统计,实时下发路由策略、调整配置参数。
服务发现
服务发现,即消费端自动发现服务地址列表的能力。
服务发现的一个核心组件是注册中心,Provider 注册地址到注册中心,Consumer 从注册中心读取和订阅 Provider 地址列表,进而对地址发起通信。
| 节点 | 角色说明 |
|---|---|
| Provider | 暴露服务的服务提供方 |
| Consumer | 调用远程服务的服务消费方 |
| Registry | 服务注册与发现的注册中心 |
| Monitor | 统计服务的调用次数和调用时间的监控中心 |
| Container | 服务运行容器 |
调用关系说明(对应上图的步骤):
0.服务容器负责启动,加载,运行服务提供者。
1.服务提供者在启动时,向注册中心注册自己提供的服务。
2.服务消费者在启动时,向注册中心订阅自己所需的服务。
3.注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者。
4.服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另一台调用。
5.服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心。
协议
| 协议 | 特性 | 缺点 |
|---|---|---|
| Dubbo协议 | 采用NIO复用单一长连接,并使用线程池并发处理请求,减少握手和加大并发效率,性能较好(推荐使用) | 在大文件传输时,单一连接会成为瓶颈 |
| Rmi协议 | 可与原生RMI互操作,基于TCP协议 | 偶尔会连接失败,需重建Stub |
| Hessian协议 | 可与原生Hessian互操作,基于HTTP协议 | 需hessian.jar支持,http短连接的开销大 |
集群容错
| 集群容错模式(策略) | 特性 | 缺点 |
|---|---|---|
| Failover Cluster(失败自动切换) | 当出现失败,重试其它服务器,通常用于读操作(推荐使用) | 重试会带来更长延迟 |
| Failfast Cluster(快速失败) | 只发起一次调用,失败立即报错,通常用于非幂等性的写操作 | 如果有机器正在重启,可能会出现调用失败 |
| Failsafe Cluster(失败安全) | 出现异常时,直接忽略,通常用于写入审计日志等操作 | 调用信息丢失 |
| Failback Cluster(失败自动恢复) | 后台记录失败请求,定时重发,通常用于消息通知操作 | 不可靠,重启丢失 |
| Forking Cluster(并行调用多个服务器) | 只要一个成功即返回,通常用于实时性要求较高的读操作 | 需要浪费更多服务资源 |
| Broadcast Cluster(广播调用所有提供者) | 逐个调用,任意一台报错则报错,通常用于更新提供方本地状态 | 速度慢,任意一台报错则报错 |
负载均衡
dubbo负载均衡的几种方式如下。
| 负载均衡策略 | 特性 | 缺点 |
|---|---|---|
| Random LoadBalance(随机) | 按权重设置随机概率(推荐使用) | 在一个截面上碰撞的概率高,重试时,可能出现瞬间压力不均 |
| RoundRobin LoadBalance(轮询) | 按公约后的权重设置轮询比率 | 存在慢的机器累积请求问题,极端情况可能产生雪崩 |
| LeastActive LoadBalance(最少活跃调用数) | 相同活跃数的随机,活跃数指调用前后计数差,使慢的机器收到更少请求 | 不支持权重,在容量规划时,不能通过权重把压力导向一台机器压测容量 |
| ConsistentHash LoadBalance(一致性Hash) | 相同参数的请求总是发到同一提供者,当某一台提供者挂时,原本发往该提供者的请求,基于虚拟节点,平摊到其它提供者,不会引起剧烈变动 | 压力分摊不均 |
参考资料:
dubbo官方文档
https://dubbo.apache.org/zh/docs/v2.7/user/preface/architecture/
https://dubbo.apache.org/zh/docs/v2.7/user/examples/