文章内容输出来源:拉勾教育Java高薪训练营
1.什么是服务熔断降级
服务熔断:当下游的服务因为某种原因突然变得不可用或响应过慢,上游服务为了保证自己整体服务的可用性,不再继续调用目标服务,直接返回,快速释放资源。如果目标服务情况好转则恢复调用。
服务降级:当服务器压力剧增的情况下,根据当前业务情况及流量对一些服务有策略的降低服务级别,以释放服务器资源,保证核心任务的正常运行。
一般服务的熔断和降级在系统中都是结合着使用的。
2.服务熔断降级方案
(1)dubbo的容错策略和服务动态降级
(2)Hystrix
(3)Sentinel
(1)dubbo的容错策略和服务动态降级
Dubbo的容错: Dubbo的消费者在提供者数据的时候,它timeout=0 代表永不超时,这样就很容易阻塞过多,为了防止这种服务雪崩的情况,Dubbo提供了一些容错处理策略。
Dubbo 主要提供了这样几种容错方式:
Failover,失败自动切换,失败时会重试其它服务器,可以设置重试次数。
Failfast, 快速失败,请求失败后快速返回异常结果,不进行重试。
Failsafe,失败安全,出现异常,直接忽略,会对请求做负载均衡。
Failback, 失败自动恢, 请求失败后,会自动记录请求到失败队列中,通过定时线程扫描该队列,并定时重试。
Forking, 并行调用多个服务提供者,其中有一个返回,则立即返回结果。
Broadcast,广播调用所有可以连接的服务,任意一个服务返回错误,就任务调用失败。
Mock,响应失败时返回伪造的响应结果。
Available,通过遍历的方式查找所有服务列表,找到第一个可以返回结果的节点,并且返回结果。
Mergable,将多个节点请求合并进行返回。
策略名称 | 优点 | 缺点 | 主要应用场景 |
---|---|---|---|
Failover | 对调用者屏蔽调用失败的信息 | 增加RT,额外资源开销,资源浪费 | 对调用RT不敏感的场景 |
Failfast | 业务快速感知失败状态进行自主决策 | 产生较多报错的信息 | 调用非幂等性接口,需要快速感知失败的场景 |
Failsafe | 即使失败了也不会影响核心流程 | 对于失败的信息不敏感,需要额外的监控 | 旁路系统,失败不影响核心流程正确性的场景 |
Failback | 失败自动异步重试 | 重试任务可能堆积 | 对于实时性要求不高,且不需要返回值的一些异步操作 |
Forking | 并行发起多个调用,降低失败概率 | 消耗额外的机器资源,需要确保操作幂等性 | 资源充足,且对于失败的容忍度较低,实时性要求高的场景 |
Broadcast | 支持对所有的服务提供者进行操作 | 资源消耗很大 | 通知所有提供者更新缓存或日志等本地资源信息 |
Dubbo服务动态降级: 在dubbo中提供了多种服务降级方式,其本质并不是对 provider 进行操作,而是告诉consumer,调用服务时要做哪些动作,具体方式如下。
(1)在Dubbo管理控制台配置服务降级(即屏蔽和容错)
mock=force:return+null 表示消费方对该服务的方法调用都直接返回 null 值,不发起远程调用。用来屏蔽不重要服务不可用时对调用方的影响。
mock=fail:return+null 表示消费方对该服务的方法调用在失败后,再返回 null 值,不抛异常。用来容忍不重要服务不稳定时对调用方的影响。
(2)指定返回简单值或者null
<dubbo:reference id="xxService"