一、Dubbo
Apache Dubbo 是一款高性能的Java RPC框架。其前身是阿里巴巴公司开源的一个高性能、轻量级开源Java RPC框架,可以和Spring框架无缝集成
Doubbo提供了三大核心能力:面向接口的远程方法调用,智能容错和负载均衡,以及服务自动注册和发现
RPC
RPC全称Remote Procedure Call,即远程调用。
远程调用:比如两台服务器A和B,A服务器上部署一个应用,B服务器上部署一个应用,A服务上的应用想调用B服务上的应用提供的方法,由于两个应用不在一个内存空间,不能直接调用,所有,需要通过网络来表达调用的语义和传达调用的数据
RPC是一个泛化的概念,一个来说一切远程调用手动都属于RPC范畴。个体值开发语义都有直接的RPC框架。java中的RPC框架比较多,广泛使用的有RMI、Hessian、Dubbo等
==需要注意的是RPC并不是一个具体的技术,不是协议,而是指整个网络远程调用过程 ==

1、 节点角色说明:
| 节点 | 角色名称 |
|---|---|
| Provider | 暴露服务的服务提供方 |
| Consumer | 调用远程服务的服务消费方 |
| Registry | 服务注册与发现的注册中心 |
| Monitor | 统计服务的调用次数和调用时间的监控中心 |
| Container | 服务运行容器 |
虚线都是异步访问,实线都是同步访问
2、调用关系说明
- 服务容器启动,加载,运行服务提供者
- 服务提供者在启动时,向注册中心注册自己提供服务。
- 服务消费者在启动时,向注册中心订阅自己所需要的服务。
- 注册中心返回服务提供者地址列表个消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者
- 服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另外一台调用。
- 服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心。
二、Dubbo负载均衡,容错
1、负载均衡
1.1概述:
LoadBalance 中文意思为负载均衡,它的职责是将网络请求,或者其他形式的负载“均摊”到不同的机器上。避 免集群中部分服务器压力过大,而另一些服务器比较空闲的情况。通过负载均衡,可以让每台服务器获取到适合自 己处理能力的负载。在为高负载服务器分流的同时,还可以避免资源浪费,一举两得。
负载均衡可分为软件负载均衡和硬件负载均衡。在我们日常开发中,一般很难接触到硬件负载均衡。但软件负 载均衡还是可以接触到的,比如 Nginx。在 Dubbo 中,也有负载均衡的概念和相应的实现。Dubbo 需要对服务消 费者的调用请求进行分配,避免少数服务提供者负载过大。服务提供者负载过大,会导致部分请求超时。因此将负 载均衡到每个服务提供者上,是非常必要的.
1.2 Dubbo中负载均衡策略

-
Random LoadBalance(默认)
随机,按权重设置随机概率
在一个截面上碰撞的概率高,但调用量越大分布越均匀,而且按概率使用权重后比较均匀,有利于动态调整提供者权重。
-
RoundRobin LoadBalance
轮询,按公约后的权重设置轮询比率。
存在慢的提供者累积请求的问题,比如:第二台机器很慢,但没挂,当请求调到第二台就卡在那,久而久之,所有请求都卡在调到第二台上。
-
LeastActive LoadBalance
最少活跃调用数,相同活跃数的随机,活跃数指调用前后计数差。
使慢的提供者收到更少请求,因为越慢的提供者的调用前后计数差会越大。
-
ConsistentHash LoadBalance
一致性 Hash,相同参数的请求总是发到同一提供者。
当某一台提供者挂时,原本发往该提供者的请求,基于虚拟点,平摊到其它提供者,不会引起剧烈变动。
缺省只对第一个参数 Hash,如果要修改,请配置
缺省用 160 份虚拟节点,如果要修改,请配置
1.3配置
xml配置方式
- 服务端服务级别
<dubbo:service interface="..." loadbalance="roundrobin" />
- 服务端方法级别
<dubbo:service interface="...">
<dubbo:method name="..." loadbalance="roundrobin"/>
</dubbo:service>
- 客户端服务级别
<dubbo:reference interface="..."loadbalance="roundrobin" />
- 客户端方法级别
<dubbo:reference interface="...">
<dubbo:method name="..." loadbalance="roundrobin"/> </dubbo:reference>
注解方式
- 提供者配置
@Service(loadbalance = "")
public class UserServiceImpl implements UserService {}
- 消费者配置,通过loadbalance属性
@Reference(loadbalance = "roundrobin ")
private UserService userService{};
2.集群容错
2.1容错概述
在集群调用失利时,Dubbo提供了多种容错方案,缺省为failover重试

各节点关系:
-
这里的
Invoker是Provider的一个可调用Service的抽象,Invoker封装了Provider地址 及Service接口信息 -
Directory代表多个Invoker,可以把它看成List,但与List不同的是,它的值可能是动态变化的, 比如注册中心推送变更 -
Cluster将Directory中的多个Invoker伪装成一个Invoker,对上层透明,伪装过程包含了容错逻 辑,调用失败后,重试另一个 -
Router负责从多个Invoker中按路由规则选出子集,比如读写分离,应用隔离等 -
LoadBalance负责从多个Invoker中选出具体的一个用于本次调用,选的过程包含了负载均衡算法,调用失 败后,需要重选"
2.2 Dubbo中容错策略
-
Failover Cluster
失败自动切换,当出现失败,重试其它服务器。通常用于读操作,但重试会带来更长的延迟。可通过
retries='2'来设置重试次数(不含第一次)。可以在提供方配置也可以在消费方配置。
//提供方配置 <dubbo:service retries="2" />
//消费方配置 <dubbo:reference retries="2" />
-
Failfast Cluster
快速失败,只发起一次调用,失败立即报错。通常用于幂等性的写操作,比如更新
-
Failsafe Cluster
失败安全,出现异常时直接忽略。通常用于写入审计日志等操作。
-
Failback Cluster
失败自动恢复,后台记录失败请求,重定向发。通常用于消息通知操作。
-
Forking Cluster
并行调用多个服务,只要一个成功即返回。通常用于实时性要求较高的读操作,但需要浪费过多服务资源。(可以通过forks='2’来设置最大并行数)
-
Broadcast Cluster
广播调用所有提供者,逐个调用,任意一台报错则报错 [2]。通常用于通知所有提供者更新缓存或日志等本地 资源信息。
2.3 配置
xml方式
- 服务提供方
<dubbo:service cluster="failsafe" />
- 服务消费方
<dubbo:reference cluster="failsafe" />
注解方式
- 服务提供方
@Service(cluster = "failsafe")
- 服务消费方
@Reference(cluster = "failsafe")
本文深入解析Dubbo,一款高性能的Java RPC框架,介绍其核心功能包括远程方法调用、智能容错、负载均衡及服务自动注册和发现。同时,详细阐述Dubbo的负载均衡策略与集群容错机制,为开发者提供全面的使用指导。

51万+

被折叠的 条评论
为什么被折叠?



