Spring Cloud Alibaba快速入门-Sentinel熔断规则

文章目录


断路器的工作原理

断路器的三个状态:打开、关闭、半开

断路器的基本思想是通过监控服务调用的成功率或平均响应时间等指标,在(被调用的)服务出现异常时 自动切换到"打开 "状态,阻止后续请求继续访问该服务,从而避免引发连锁故障。

一段时间后,断路器会尝试半开 (Half-Open),允许部分请求通过以探测服务是否恢复,如果服务恢复正常,则断路器关闭 ,恢复正常调用;如果服务仍不可用,则继续保持打开状态。

熔断策略

在Sentinel中有三种熔断策略,慢调用比例、异常比例、异常数
慢调用比例

  • 判断逻辑:当单位时间内的请求数超过最小请求数,且其中 "慢调用"(响应时间超过预设阈值的请求)的比例达到阈值时,触发熔断。
  • 如A调用B,设置0.7,当统计时长中有70%的请求为慢请求(设置阈值)时,会把断路器打开,之后A就不会在调用B了。同时会有熔断时长,时长内的调用全部拒绝访问,之后会变为半开状态。半开状态会放行一个探测,如果成功则断路器关闭,失败则打开。

异常比例

  • 判断逻辑:当单位时间内的请求数超过最小请求数,且异常请求(如抛出异常、返回错误码)的比例达到阈值时,触发熔断。
  • 如:规定时间(统计时长)内70%的请求发送异常,则断路器打开

异常数

  • 判断逻辑:当单位时间内的异常请求数直接达到预设阈值时,触发熔断(无需计算比例)。
  • 如:统计时长内100个请求中有15个发送异常,则断路器打开

有无熔断区别

  • 在没有配置熔断规则时,A调用B时,B发生超时或异常都会触发A的兜底回调。
  • 当有熔断规则时,如配置了慢调用比例,当断路器打开时不会在调用B直到熔断时长结束。节约了调用时间和资源

示例

慢调用比例

图中GET:http://qf-service-product/product/{id}为feign调用的接口

设置参数:五秒内有80%的请求响应超过一秒时,发起熔断30秒。需要至少五个以上请求才会触发该规则

被调用服务接口Thread.sleep(3000),让响应时间超过1秒。

设置好的熔断规则

被调用方代码

java 复制代码
import com.qf.entity.Product;
import jakarta.servlet.http.HttpServletRequest;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
import java.math.BigDecimal;

@Slf4j
@RestController
public class ProductController {

    @GetMapping("/product/{id}")
    public Product getProduct(@PathVariable("id") Long id, HttpServletRequest request){
        String header =request.getHeader( "X-Token");
        System.out.println(header);
        Product product = new Product();
        product.setId(id);
        product.setProductName("华为手机");
        product.setPrice(new BigDecimal(5000));
        product.setNum(100);
        log.info("查询商品:{}",product);
        try {
            Thread.sleep(3000);
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
        return product;
    }
}

多次访问http://127.0.0.1:8081/seckill接口,可以发现之后的每次调用都会直接触发兜底回调

java 复制代码
//兜底回调在@FeignClient中设置
@FeignClient(value = "qf-service-product", fallback = ProductFeignClientFallback.class)
public interface ProductFeignClient {
    //mvc注解的两套使用逻辑
    //1、标注在Controller上,是接受这样的请求
    //2、标注在FeignClient上,是发送这样的请求
    @GetMapping("/product/{id}")
    Product getProductById(@PathVariable("id") Long id);
}

@Component
public class ProductFeignClientFallback implements ProductFeignClient {
    @Override
    public Product getProductById(Long id) {
        System.out.println("兜底回调....");
        Product product = new Product();
        product.setId(id);
        product.setPrice(new BigDecimal("0"));
        product.setProductName("feign未知商品");
        product.setNum(0);

        return product;
    }
}

异常比例

五秒内异常比例超过80%,则熔断30秒,最少5个请求时熔断规则生效

这里模拟异常调用,将被调用服务关闭或抛出异常。可以发现多次调用后会直接触发兜底回调。

异常数

五秒内异常数超过10,则熔断30秒,最少5个请求时熔断规则生效

熔断规则与流控规则的区别

维度 熔断规则 流控规则
触发依据 依赖资源的异常指标(错误率、响应时间) 资源的流量指标(QPS、线程数)
目标 保护系统免受不稳定依赖的影响 保护系统不被正常流量压垮
处理方式 熔断期间直接拒绝调用,后期自动恢复 超过阈值时拒绝 / 排队 / 预热处理超额请求
典型场景 服务调用超时、接口频繁报错 秒杀高并发、接口 QPS 超限

相关文章:
Spring Cloud Alibaba快速入门
Spring Cloud Alibaba快速入门-Nacos注册中心(上)
Spring Cloud Alibaba快速入门-Nacos注册中心(下)
Spring Cloud Alibaba快速入门-Nacos配置中心(上)
Spring Cloud Alibaba快速入门-Nacos配置中心(下)
Spring Cloud Alibaba快速入门-OpenFeign
Spring Cloud Alibaba快速入门-OpenFeign进阶用法
Spring Cloud Alibaba快速入门-Sentinel
Spring Cloud Alibaba快速入门-Sentinel流量控制(FlowRule)
Spring Cloud Alibaba快速入门-Sentinel熔断规则

Spring Cloud Netflix快速入门

相关推荐
邂逅星河浪漫2 小时前
【LangChain4j+Redis】会话记忆功能实现
java·spring boot·后端·阿里云·langchain4j·会话记忆
aloha_7892 小时前
新国都面试真题
jvm·spring boot·spring·面试·职场和发展
Gz、3 小时前
Spring Boot 常用注解详解
spring boot·后端·python
麦兜*3 小时前
Redis 7.0 新特性深度解读:迈向生产级的新纪元
java·数据库·spring boot·redis·spring·spring cloud·缓存
龙茶清欢3 小时前
最新版 springdoc-openapi-starter-webmvc-ui 常用注解详解 + 实战示例
java·spring boot·ui·spring cloud
Mr.45674 小时前
MQTT通信实现方案(Spring Boot 3 集成MQTT)
java·spring boot·后端
java水泥工4 小时前
学科竞赛管理系统|基于SpringBoot和Vue的学科竞赛管理系统(源码+数据库+文档)
数据库·vue.js·spring boot
千里码aicood4 小时前
python+vue智慧物业管理系统设计(源码+文档+调试+基础修改+答疑)
vue.js·spring boot·后端