熔断降级(Sentinel解决)

问题概述

在微服务架构中一定要预防微服务雪崩问题 ,微服务雪崩问题就是指在微服务架构中,当一个服务出现故障时,由于服务之间的依赖关系 ,故障可能会传播到其他服务 ,从而导致了大规模的服务失败,系统无法正常运行。这种情况就像雪崩一样,因为最初的一个小问题最终引发了整个系统的崩溃。

简单来说,微服务雪崩就是微服务之间相互调用,因为调用链中的一个服务故障,引起整个链路都无法访问的情况

熔断:当某个异常条件被触发,直接熔断整个服务,而不是一直等到此服务超时,为了防止防止整个系统的故障,而采用了一些保护措施(过载保护)。比如A服务的X功能依赖B服务的某个接口,当B服务接口响应很慢时,A服务X功能的响应也会被拖慢,进一步导致了A服务的线程都卡在了X功能上,A服务的其它功能也会卡主或拖慢。此时就需要熔断机制,即A服务不在请求B这个接口,而可以直接进行降级处理。

降级: 服务器压力剧增时,根据当前业务情况以及流量,对一些服务和页面 进行有策略的 降级。以此缓解服务器资源的压力,以保证核心业务的正常运行,同时也保证了客户和大部分客户得到正确的响应

解决方案

常用的预防微服务雪崩的方法有:

超时处理 :设定超时时间 ,请求超过一定时间没有响应就返回错误信息,不会无休止的等待

熔断降级 :当服务的异常数异常比例 超过了预设的阈值熔断器 就会进入开启状态,暂时中断 对该服务的请求,此时走降级方法,能够快速响应,确保系统的基本功能能够继续运行

限流限制对服务的请求速率,避免短时间内大量的请求导致系统崩溃

线程池隔离 :给要请求的资源分配一个线程池,线程池去控制请求数量

信号量隔离 :使用计数器模式 ,记录请求资源的并发线程数量,达到信号量上限时,禁止新的请求(信号隔离适合同步请求,控制并发数,比如对文件的下载并发数进行控制)

大多场景都适合使用线程池隔离,对于需要同步操作控制并发数的场景可以使用信号量隔离

Sentinel解决熔断降级

什么是Sentinel:Sentinel (分布式系统的流量防卫兵) 是阿⾥开源的⼀套⽤于服务容错的综合性解决⽅案。它以流量为切⼊点, 从流量控制、熔断降级、系统负载保护等多个维度来保护服务的稳定性

本项目中,使用Sentinel 实现限流、熔断等机制预防微服务雪崩

熔断降级是微服务保护的一种方法,当使用Feign进行远程调用,在客户端通过熔断降级措施进行微服务保护

如:orders-manager订单服务请求customer查询地址簿,在进行feign远程调用过程时出现异常将走降级方法,当异常比例或异常数达到一定的阈值将出发熔断,熔断期间将直接走降级逻辑快速响应

在feign进行远程调用服务的同时,Sentinel会一直对使用@SentinelResource注解标注的资源进行流量控制和熔断降级(SentinelResource注解的属性:value--用于定义资源的名称,Sentinel对其进行流量控制和熔断降级,fallback:降级方法,但是异常不是因为限流和熔断等,blockHandler:出发限流、熔断时执行的降级方法)

实例:

复制代码
@Component
@Slf4j
public class CustomerClient {

    @Resource
    private AddressBookApi addressBookApi;

    @SentinelResource(value = "getAddressBookDetail", fallback = "detailFallback", blockHandler = "detailBlockHandler")
    public AddressBookResDTO getDetail(Long id) {
        log.error("根据id查询地址簿,id:{}", id);
        // 调用其他微服务方法
        AddressBookResDTO detail = addressBookApi.detail(id);
        return detail;
    }

    //执行异常走
    public AddressBookResDTO detailFallback(Long id, Throwable throwable) {
        log.error("非限流、熔断等导致的异常执行的降级方法,id:{},throwable:", id, throwable);
        return null;
    }

    //熔断后的降级逻辑
    public AddressBookResDTO detailBlockHandler(Long id, BlockException blockException) {
        log.error("触发限流、熔断时执行的降级方法,id:{},blockException:", id, blockException);
        return null;
    }
}

当customer服务恢复之后,熔断时间结束此时会再次尝试请求customer,如果成功请求将关闭熔断,恢复原来的链路,否则将再次走降级逻辑

关于Sentinel实现熔断降级还可以看:服务熔断降级 Sentinel(保姆级)_sentinel 熔断降级-CSDN博客

熔断降级貌似还有Hystrix可以实现,之后可以再去了解

相关推荐
老虎062711 分钟前
JavaWeb(苍穹外卖)--学习笔记04(前端:HTML,CSS,JavaScript)
前端·javascript·css·笔记·学习·html
大苏打seven1 小时前
Docker学习笔记:Docker网络
笔记·学习·docker
kikikidult5 小时前
(2025.07)解决——ubuntu20.04系统开机黑屏,左上角光标闪烁
笔记·ubuntu
近津薪荼5 小时前
初学者关于数据在内存中的储存的笔记
笔记
碎叶城李白7 小时前
若依学习笔记1-validated
java·笔记·学习·validated
HuashuiMu花水木9 小时前
PyTorch笔记1----------Tensor(张量):基本概念、创建、属性、算数运算
人工智能·pytorch·笔记
述雾学java10 小时前
Spring Cloud Feign 整合 Sentinel 实现服务降级与熔断保护
java·spring cloud·sentinel
笑衬人心。12 小时前
Ubuntu 22.04 修改默认 Python 版本为 Python3 笔记
笔记·python·ubuntu
金色光环12 小时前
【Modbus学习笔记】stm32实现Modbus
笔记·stm32·学习
zyxzyx66613 小时前
Flyway 介绍以及与 Spring Boot 集成指南
spring boot·笔记