Spring Cloud 微服务实战(三):一个服务挂了,凭什么拖垮整个系统?Sentinel 限流熔断实战

Spring Cloud 微服务实战(三):一个服务挂了,凭什么拖垮整个系统?Sentinel 限流熔断实战


个人主页:夏天拐跑了西瓜

专栏传送门:《大模型应用开发》《Spring 生态全家桶体系化实战》

学习方向:Java 后端|AI‑Agent 大模型应用开发爱好者

⭐人生格言:路虽远,行则将至


本文是「Spring Cloud 微服务实战」系列的第三篇。微服务架构中,某一个服务出现故障可能拖垮整个调用链,这就是"服务雪崩"。本文引入 Sentinel 解决这一问题,内容涵盖控制台安装、流控规则(QPS/线程数、直接/关联/链路)、熔断降级(blockHandler/fallback)、热点规则、授权规则、系统规则、规则持久化到 Nacos,以及 OpenFeign 整合 Sentinel 的完整实战。
系列文章导航

  • 《Spring Cloud 微服务实战(一):还在硬编码服务地址?Nacos 注册中心从零搭建》
  • 《Spring Cloud 微服务实战(二):改个配置还要重启服务?Nacos 配置中心 + OpenFeign 实战》
  • 《Spring Cloud 微服务实战(三):一个服务挂了,凭什么拖垮整个系统?Sentinel 限流熔断实战》(本篇)
  • 《Spring Cloud 微服务实战(四):每个请求都直连服务?你的集群缺一个 Gateway 门卫》

文章目录

  • [Spring Cloud 微服务实战(三):一个服务挂了,凭什么拖垮整个系统?Sentinel 限流熔断实战](#Spring Cloud 微服务实战(三):一个服务挂了,凭什么拖垮整个系统?Sentinel 限流熔断实战)
  • 一、Sentinel
    • [1.1 Sentinel介绍](#1.1 Sentinel介绍)
    • [1.2 Sentinel安装](#1.2 Sentinel安装)
    • [1.3 Sentinel初体验](#1.3 Sentinel初体验)
    • [1.4 流控规则](#1.4 流控规则)
      • [1.4.1 QPS限制](#1.4.1 QPS限制)
        • [1.4.1.1 直接-快速失败](#1.4.1.1 直接-快速失败)
        • [1.4.1.2 直接-WarmUp](#1.4.1.2 直接-WarmUp)
        • [1.4.1.3 直接-排队等待](#1.4.1.3 直接-排队等待)
        • [1.4.1.4 关联-快速失败](#1.4.1.4 关联-快速失败)
        • [1.4.1.5 链路-快速失败](#1.4.1.5 链路-快速失败)
      • [1.4.2 并发线程数](#1.4.2 并发线程数)
    • [1.5 熔断降级](#1.5 熔断降级)
      • [1.5.1 熔断降级介绍](#1.5.1 熔断降级介绍)
      • [1.5.2 熔断规则](#1.5.2 熔断规则)
      • [1.5.3 降级方法](#1.5.3 降级方法)
        • [1.5.3.1 blockHandler](#1.5.3.1 blockHandler)
        • [1.5.3.2 fallback](#1.5.3.2 fallback)
        • [1.5.3.3 defaultFallback&exceptionsToIgnore](#1.5.3.3 defaultFallback&exceptionsToIgnore)
    • [1.6 什么是热点规则](#1.6 什么是热点规则)
    • [1.7 授权规则如何配置](#1.7 授权规则如何配置)
    • [1.8 系统规则应用场景](#1.8 系统规则应用场景)
    • [1.9 动态规则与持久化的方式](#1.9 动态规则与持久化的方式)
    • [1.10 OpenFeign整合Sentinel](#1.10 OpenFeign整合Sentinel)
  • 二、总结

一、Sentinel

1.1 Sentinel介绍

Sentinel 的核心能力可以归纳为两个方向:

  • 流量控制:提供丰富的限流机制,并支持在请求达到阈值后,自定义后续请求的处理策略(拒绝、排队、预热等);
  • 断路器与熔断 :用于解决服务雪崩问题,支持主动指定降级方法,在资源异常时快速失败并返回托底数据。

相关资料:

1.2 Sentinel安装

Sentinel 是阿里巴巴开源的一款面向分布式服务架构的流量防卫兵,诞生于双十一大促场景,历经多年高并发实战检验,现已成为 Spring Cloud Alibaba 生态的核心组件之一。它从流量控制、熔断降级、系统负载保护等多个维度保障微服务的稳定性,并提供直观的图形化控制台,让运维人员可以实时监控和动态调整规则。

在微服务架构中,一个请求往往串联着多个服务,一旦链路中某个节点出现故障,故障会像雪崩一样向上游蔓延,最终拖垮整个系统。Sentinel 正是为解决这类问题而生,核心能力可以归纳为两个方向:

  • 流量控制:提供丰富的限流机制,支持 QPS 和并发线程数两种阈值类型,以及直接、关联、链路三种流控模式,配合快速失败、WarmUp(预热)、排队等待三种流控效果,灵活应对秒杀、突发流量等场景;
  • 熔断降级 :内置断路器,支持慢调用比例、异常比例、异常数三种熔断策略。当资源被限流或熔断时,可通过 blockHandler / fallback 机制执行降级逻辑,返回托底数据,保证用户体验不中断。

此外,Sentinel 还提供热点参数限流、黑白名单授权、系统自适应保护等高级能力,并支持将规则持久化到 Nacos 等配置中心,实现服务重启后规则不丢失。

相关资料:

安装前需要确认三点:

  1. JDK 环境:建议使用 JDK 8,最高兼容 JDK 11,不建议使用 JDK 17/21;
  2. 端口占用:Sentinel 控制台默认占用 8080 端口,启动前需确认该端口未被其他服务占用;
  3. 版本选择:本文使用 1.8.7 版本。

在终端中执行以下命令启动控制台:

powershell 复制代码
java -jar sentinel-dashboard-1.8.7

提示:Windows 环境下启动脚本偶有小问题,如果启动后控制台无法访问,可以尝试按一次 Ctrl + C 让程序继续加载,之后再访问。

启动后浏览器访问:http://localhost:8080/

默认用户名和密码均为 sentinel(小写)。

登录后看到如下界面即表示安装成功:

1.3 Sentinel初体验

1、在业务服务中导入依赖:

xml 复制代码
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>

2、配置连接 Sentinel 控制台:

yml 复制代码
spring:
  cloud:
    sentinel:
      transport:
        port: 8719
        dashboard: localhost:8080

3、启动项目后需要实际访问一次任意接口,服务才会上报到控制台(Sentinel 采用懒加载机制,无流量时控制台不可见):

4、此时在控制台左侧即可看到已接入的服务:

1.4 流控规则

流控规则的核心操作都在控制台完成,主要涉及资源的圈定与规则的参数设置。

配置流控规则时需要指定资源名,获取资源名有两种方式:

  • 默认情况下,资源名就是接口地址;

  • 在 Controller 方法上追加 @SentinelResource 注解自定义资源名:

    java 复制代码
    @GetMapping("/order/info")
    @SentinelResource(value = "info")
    public String info() {
        return info;
    }

1.4.1 QPS限制

1.4.1.1 直接-快速失败

阈值类型:QPS 单体阈值:1

流控模式:直接

流控效果:快速失败

当每秒请求数超过阈值 1 时,超出的请求立即触发快速失败,直接抛出异常:

1.4.1.2 直接-WarmUp

阈值类型:QPS 单体阈值:10

流控模式:直接

流控效果:WarmUp

WarmUp(预热)模式下,接口不会一开始就承受 10 QPS 的压力,而是经过一段预热时间后逐步放开到目标阈值,适合冷启动场景:

1.4.1.3 直接-排队等待

阈值类型:QPS 单体阈值:2

流控模式:直接

流控效果:排队等待

排队等待(匀速排队)模式下,请求不会被立即拒绝,而是进入队列匀速通过------QPS 为 2 时,每 500ms 放行一个请求:

1.4.1.4 关联-快速失败

阈值类型:QPS 单体阈值:2

流控模式:关联

流控效果:快速失败

关联模式需要先准备两个资源来观察效果:

java 复制代码
@GetMapping("/order/info")
@SentinelResource(value = "info")
public String info() {
    return info;
}

@GetMapping("/order/add")
@SentinelResource(value = "add")
public String add() {
    return "add";
}

为 info 资源设置 QPS 限制,并关联 add 资源:当 add 资源的访问量达到阈值时,被限流的却是 info 资源。该模式适合"读写分离"场景------优先保障读接口的可用性:

1.4.1.5 链路-快速失败

阈值类型:QPS 单体阈值:1

流控模式:链路

流控效果:快速失败

链路模式需要准备三个资源:两个作为入口,一个作为公共资源被两个入口共同调用。

说明 :Controller 中的方法默认就是资源;而由 Spring 管理的其他方法(如 Service 方法)也可以作为资源,但必须追加 @SentinelResource 注解。

java 复制代码
@Autowired
private OrderService orderService;

@GetMapping("/order/aaa")
@SentinelResource(value = "aaa")
public String aaa() {
    orderService.common();
    return "aaa";
}
@GetMapping("/order/bbb")
@SentinelResource(value = "bbb")
public String bbb() {
    orderService.common();
    return "bbb";
}

公共资源 common 定义在 Service 层:

java 复制代码
package com.study.service.impl;

import com.alibaba.csp.sentinel.annotation.SentinelResource;
import com.study.service.OrderService;
import org.springframework.stereotype.Service;

@Service
public class OrderServiceImpl implements OrderService {

    @Override
    @SentinelResource("common")
    public void common() {

    }
}

配置完成后会发现,簇点链路中所有资源的入口统一为 sentinel_spring_web_context,导致无法针对某个入口单独做链路限制:

解决方法是关闭统一入口模式,让每个 Controller 资源各自成为独立入口:

yml 复制代码
spring:
  cloud:
    sentinel:
      web-context-unify: false

配置后重启项目,簇点链路中可以看到入口已经分开:

此时即可正常配置链路流控规则:

该问题的讨论见官方 issue:

https://github.com/alibaba/Sentinel/issues/1213

1.4.2 并发线程数

QPS 限流的三种效果前文已全部覆盖,并发线程数限制的原理类似,这里验证一下效果即可。

阈值类型:并发线程数 单体阈值:1

流控模式:直接

该规则约束资源内部同时处理的线程数:阈值为 1 时,同一时刻只有一个线程能处理请求,其他线程需要排队等待。

为了放大观察效果,将接口处理时间延长到 3 秒:

java 复制代码
@GetMapping("/order/info")
@SentinelResource(value = "info")
public String info() {
    // ============并发线程数==============
    try {
        Thread.sleep(3000);
    } catch (InterruptedException e) {
        throw new RuntimeException(e);
    }
    return info;
}

1.5 熔断降级

1.5.1 熔断降级介绍

服务雪崩:某一个服务出现故障,进而拖垮调用它的服务,最终导致整个系统不可用,这种现象称为服务雪崩。

针对服务雪崩,可以通过熔断与降级两种手段进行防护。

降级:为指定资源提供一个降级方法,当该资源出现问题时快速失败,转而执行降级方法,返回托底数据。

熔断:为指定资源提供断路器,断路器包含 Closed、Open、Half Open 三种状态。

注意:熔断和降级不是同一概念------熔断是触发降级的手段之一。

1.5.2 熔断规则

Sentinel 提供三种熔断规则:

  • 慢调用比例

    • 请求响应时间大于阈值(如 500ms)即被统计为慢调用;
    • 统计窗口(如 10s)内请求数达到最小请求数(如 4 个)时,开始统计熔断阈值;
    • 当慢调用占比达到设定比例(如 50%)时,断路器切换为 Open 状态并持续指定时长(如 10s);
    • 熔断时间结束后,断路器进入 Half Open 状态,放行一个探测请求:
      • 该请求仍为慢调用,则回到 Open 状态;
      • 该请求正常,则恢复为 Closed 状态。
  • 异常比例

    • 资源访问抛出异常即计入异常统计;
    • 统计窗口(如 10s)内请求数达到最小请求数(如 4 个)时,开始统计熔断阈值;
    • 当异常占比达到设定比例(如 50%)时,断路器切换为 Open 状态并持续指定时长(如 10s);
    • 熔断时间结束后进入 Half Open 状态,放行一个探测请求:
      • 该请求抛出异常,则回到 Open 状态;
      • 该请求正常,则恢复为 Closed 状态。
  • 异常数

    • 资源访问抛出异常即计入异常统计;
    • 统计窗口(如 10s)内请求数达到最小请求数(如 4 个)时,开始统计熔断阈值;
    • 当异常数达到设定值(如 2 个)时,断路器切换为 Open 状态并持续指定时长(如 10s);
    • 熔断时间结束后进入 Half Open 状态,放行一个探测请求:
      • 该请求抛出异常,则回到 Open 状态;
      • 该请求正常,则恢复为 Closed 状态。

1、编写一个用于测试熔断效果的接口:

java 复制代码
// =================================熔断降级===========================
@GetMapping("/order/circuitbreaker")
@SentinelResource(value = "circuitbreaker")
public String circuitbreaker(String value) throws InterruptedException {
    switch (value){
        case "1":
            Thread.sleep(1000);
            break;
        case "2":
            int i = 1 / 0;
    }

    return "circuitbreaker - success!";
}

2、启动项目开始测试。

快速连续发起不同 value 的请求,即可观察到慢调用统计、断路器打开与恢复的完整过程。

1.5.3 降级方法

1.5.3.1 blockHandler

Sentinel 的降级处理基于 @SentinelResource 注解实现。该注解底层基于 AOP,因此被标注方法的访问修饰符必须是 public。

@SentinelResource 的属性较多,逐个来看。

  • blockHandler:

    • 用于指定处理 BlockException 的降级方法名;

    • 降级方法必须由 public 修饰;

    • 返回类型与方法参数需与原方法匹配,参数列表最后可追加一个 BlockException;

    • 默认要求降级方法与原方法在同一个类中:

      java 复制代码
      @GetMapping("/order/sentinel")
      @SentinelResource(value = "sentinel",blockHandler = "sentinelBlock")
      public String sentinel(@RequestParam String value) throws InterruptedException {
          // 业务代码..................
          return "sentinel - success!";
      }
      
      // 是sentinel方法的降级方法,可以在方法逻辑中返回托底数据
      public String sentinelBlock(String value, BlockException exception){
          String message = null;
          if (exception instanceof FlowException){
              message = "流量控制!";
          }else if (exception instanceof DegradeException){
              message = "熔断控制";
          }
      
          return "failed  msg = " + message.toString();
      }
  • blockHandlerClass:

    • 与 blockHandler 配合使用,可将降级方法声明在其他类中(此时降级方法必须为 static):

      java 复制代码
      @GetMapping("/order/sentinel")
      @SentinelResource(value = "sentinel",blockHandlerClass = OrderControllerBlock.class,blockHandler = "sentinelBlock")
      public String sentinel(@RequestParam String value) throws InterruptedException {
          // 业务代码..................
          return "sentinel - success!";
      }
      // ========================================================
      public class OrderControllerBlock {
      
          public static String sentinelBlock(String value, BlockException exception){
              String message = null;
              if (exception instanceof FlowException){
                  message = "流量控制!";
              }else if (exception instanceof DegradeException){
                  message = "熔断控制";
              }
      
              return "failed  msg = " + message.toString();
          }
      
      }

BlockException 对应 Sentinel 中的几种限制类型:

  • FlowException:流控
  • DegradeException:熔断
  • ParamFlowException:热点
  • SystemBlockException:系统
  • AuthorityException:权限

1.5.3.2 fallback

fallback 的用法与 blockHandler 基本一致,区别在于:blockHandler 只处理 BlockException,而 fallback 处理所有 Throwable(即业务异常也会进入降级)。

  • fallback:指定降级方法名称;
  • fallbackClass:指定降级方法所在的 Class。

注意 :若 blockHandler 和 fallback 同时配置,被限流/熔断抛出的 BlockException 只会进入 blockHandler 的处理逻辑。

java 复制代码
@GetMapping("/order/sentinel")
@SentinelResource(value = "sentinel",fallback = "sentinelFallback",blockHandler = "sentinelBlock")
public String sentinel(@RequestParam String value) throws InterruptedException {
    switch (value){
        case "1":
            Thread.sleep(1000);
            break;
        case "2":
            int i = 1 / 0;
    }

    return "sentinel - success!";
}

public String sentinelFallback(String value,Throwable ex){
    return "failed";
}

// 是sentinel方法的降级方法,可以在方法逻辑中返回托底数据
public String sentinelBlock(String value, BlockException exception){
    String message = null;
    if (exception instanceof FlowException){
        message = "流量控制!";
    }else if (exception instanceof DegradeException){
        message = "熔断控制";
    }

    return "failed  msg = " + message.toString();
}

1.5.3.3 defaultFallback&exceptionsToIgnore

fallback 只能作用于单个资源,defaultFallback 则可以作用于全局,作为类级别的默认降级方法。

  • defaultFallback:指定默认降级方法名称
    • 返回类型需与原方法一致;
    • 参数列表为空,最多可追加一个 Throwable 参数;
  • fallbackClass:指定降级方法所在的 Class。

exceptionsToIgnore 针对 fallback 生效,可以指定部分异常跳过降级逻辑,直接向上抛出:

java 复制代码
@GetMapping("/order/sentinel")
@SentinelResource(value = "sentinel",defaultFallback = "defaultFallback",exceptionsToIgnore = {ArithmeticException.class})
public String sentinel(@RequestParam String value) throws InterruptedException {
    switch (value){
        case "1":
            Thread.sleep(1000);
            break;
        case "2":
            int i = 1 / 0;
    }

    return "sentinel - success!";
}
//==================默认的fallback=======================
public String defaultFallback(Throwable ex){
    return "failed msg = " + ex.getMessage();
}

1.6 什么是热点规则

热点规则属于流控的范畴,但粒度更细:流控规则针对整个资源做限制,而热点规则可以针对资源参数中的某个具体取值做限流。

实现原理:Sentinel 根据资源传入的指定参数统计单位时间内的请求次数(底层基于 LRU + 滑动时间窗口 ),再通过令牌桶算法执行限流。

准备一个接收两个参数的资源用于测试:

java 复制代码
//==================热点规则=======================
@GetMapping("/order/hot")
@SentinelResource(value = "hot")
public String hot(String userId,Integer type){
    return "userId:" + userId + ",type:" + type;
}

以 userId 作为热点参数配置规则:当相同 userId 的请求次数超过阈值时触发限流。

规则含义为:在统计窗口时长 内,热点参数值 最多可以请求单机阈值次,超过即触发限流。


还可以针对参数的具体值做更细粒度的例外项配置:


实测总结热点规则对参数接收形式的支持情况:

  • 单个类型参数接收(包括 @RequestParam@PathVariable)可以正常生效;
  • 以对象形式接收参数时,热点规则无法生效。

1.7 授权规则如何配置

授权规则用于校验调用方身份:可以为某个资源配置黑、白名单(二者选其一),只有满足条件的请求才会放行。

先准备一个测试资源:

java 复制代码
//==================授权规则=======================
@GetMapping("/order/author")
@SentinelResource(value = "author")
public String author(){
    return "author!";
}

配置好黑白名单后会发现规则不生效。原因是:Sentinel 执行黑白名单校验时,会通过拦截器调用 RequestOriginParser 的实现类解析请求来源身份,而框架没有提供默认实现,此时解析结果为空串。

解决办法是自行实现 RequestOriginParser,这里从请求头的 origin 字段中获取调用方身份:

java 复制代码
package com.study.author;

import com.alibaba.csp.sentinel.adapter.spring.webmvc.callback.RequestOriginParser;
import org.springframework.stereotype.Component;

import javax.servlet.http.HttpServletRequest;

@Component
public class SentinelOriginParser implements RequestOriginParser {

    @Override
    public String parseOrigin(HttpServletRequest request) {
        String origin = request.getHeader("origin");
        return origin;
    }
}

实现后,使用 Postman 发送请求并在请求头中携带 origin 字段,授权规则即可正常校验。

校验逻辑:Sentinel 将 SentinelOriginParser 解析出的身份信息与黑白名单进行匹配(基于 indexOf 判断名单字符串是否包含该身份),命中黑名单或未命中白名单的请求将被拦截。

1.8 系统规则应用场景

系统规则不针对单个资源,而是对整个服务的所有入口流量做统一限制,目的是让系统整体保持可用,避免个别资源的流量激增拖垮整个系统。

系统规则支持以下指标:

  • Load 自适应 (仅对 Linux/Unix-like 机器生效):系统的 load1 作为启发指标,进行自适应系统保护。当系统 load1 超过设定的启发值,且系统当前的并发线程数超过估算的系统容量时才会触发系统保护(BBR 阶段)。系统容量由系统的 maxQps * minRt 估算得出。设定参考值一般是 CPU cores * 2.5
  • CPU usage(1.5.0+ 版本):当系统 CPU 使用率超过阈值即触发系统保护(取值范围 0.0-1.0),比较灵敏。
  • 平均 RT:当单台机器上所有入口流量的平均 RT 达到阈值即触发系统保护,单位是毫秒。
  • 并发线程数:当单台机器上所有入口流量的并发线程数达到阈值即触发系统保护。
  • 入口 QPS:当单台机器上所有入口流量的 QPS 达到阈值即触发系统保护。

1.9 动态规则与持久化的方式

在 Sentinel 控制台中配置的规则默认存储在内存中,服务重启后规则全部丢失。生产环境中不可能每次重启后手工重建规则,因此需要将规则持久化到 DataSource。

Sentinel 的数据源分为两种模式:

  • 拉模式:客户端定时轮询数据源查询变更,缺点是无法及时感知变更;
  • 推模式:数据源主动推送变更内容给客户端,实时性和一致性更好。

Nacos 是推模式的典型实现,下面将流控与熔断规则持久化到 Nacos。


流控规则持久化步骤:

1、导入依赖:

xml 复制代码
<dependency>
    <groupId>com.alibaba.csp</groupId>
    <artifactId>sentinel-datasource-nacos</artifactId>
</dependency>

2、在配置文件中声明 Nacos 数据源:

yml 复制代码
spring:
  cloud:
    sentinel:
      datasource:
        flow:
          nacos:
            server-addr: ${spring.cloud.nacos.config.server-addr}
            group-id: SENTINEL_GROUP
            data-id: ${spring.application.name}-flow.json
            data-type: json
            rule-type: flow

3、在 Nacos 中创建对应的配置项,内容为 JSON 格式的规则:

Nacos 配置示例:

json 复制代码
[
    {
        "resource": "info",
        "limitApp": "default",
        "grade": 1,
        "count": 1,
        "strategy": 0,
        "controlBehavior": 0
    }
]

熔断规则持久化步骤与流控规则完全一致,仅配置项不同:

1、依赖同上;

2、yml 配置:

yml 复制代码
spring:
  cloud:
    sentinel:
      datasource:
        degrade:
          nacos:
            server-addr: ${spring.cloud.nacos.config.server-addr}
            group-id: SENTINEL_GROUP
            data-id: ${spring.application.name}-degrade.json
            data-type: json
            rule-type: degrade

3、在 Nacos 中创建对应配置:

json 复制代码
[
    {
        "resource": "info",
        "grade": 2,
        "count": 2,
        "timeWindow": 10,
        "minRequestAmount": 5,
        "statIntervalMs": 10000
    }
]

1.10 OpenFeign整合Sentinel

OpenFeign 整合 Sentinel 的目标:当基于 OpenFeign 调用其他服务出现任何问题时,不再向上抛出异常,而是执行降级方法,返回托底数据。

1、在配置文件中开启 OpenFeign 与 Sentinel 的整合:

yml 复制代码
feign:
  circuitbreaker:
    enabled: true

2、为 Feign 接口编写实现类,重写的方法即为降级方法:

java 复制代码
package com.study.client.fallback;

import com.study.client.StockClient;
import org.springframework.stereotype.Component;

@Component
public class StockClientFallback implements StockClient {

    @Override
    public String test() {
        return "test的降级方法,服务器正忙,请稍后再试!!";
    }
}

3、在 Feign 接口的 @FeignClient 中指定 fallback 属性:

java 复制代码
@FeignClient(value = "stock",fallback = StockClientFallback.class)
public interface StockClient {

这里可能产生一个疑问:Feign 接口现在有两个实现类在 Spring 容器中,注入时该如何选择?实际上 OpenFeign 借助 @FeignClient 的 primary 属性,将 Feign 接口的代理对象标记为主要注入对象,因此默认注入的是代理而非 Fallback 实现类。

此外还有 FallbackFactory 的形式(可以在降级时获取异常信息),本文不再展开------两种方式本质都是基于 Feign 接口实现类完成的。

二、总结

本文系统讲解了微服务稳定性保障的核心组件 Sentinel,核心收获如下:

  • 流控规则支持 QPS 与并发线程数两种阈值,直接、关联、链路三种模式,快速失败、WarmUp、排队等待三种流控效果。
  • 熔断规则覆盖慢调用比例、异常比例、异常数三种策略,断路器在 Closed、Open、Half Open 之间自动流转。
  • 降级方法支持 blockHandler、fallback、defaultFallback 三种形式,可为被限流或熔断的资源返回托底数据。
  • 热点规则与授权规则实现更细粒度的参数限流与黑白名单控制。
  • 规则持久化到 Nacos(推模式)后,服务重启规则不丢失。
  • OpenFeign 整合 Sentinel 后,远程调用失败自动走 fallback 实现类返回托底数据。

下一篇预告:Spring Cloud Gateway 网关,为微服务集群打造统一入口。

感兴趣的同学记得 点赞 + 关注,第一时间获取更新通知!

相关推荐
2601_967264281 小时前
Jetpack Compose 实践指南:从入门到进阶
java·学习
成为你的宁宁2 小时前
【APISIX:部署、路由与 Nacos 集成】
微服务·nacos·apisix·api网关
m0_587383002 小时前
社区家政系统开发实战:从需求分析到上线部署全指南
java·spring boot·spring·需求分析
凤山老林2 小时前
动态 i18n 体系落地:Spring Boot 多租户热加载与前后端协同实践
java·spring boot·后端·i18n
白露与泡影3 小时前
解密 Pi 的 Harness 工程:Agent 会话如何实现持久化与恢复
java·人工智能·算法
Zane19943 小时前
HashMap 为什么要在长度16、容量必须是2的幂这些细节上较劲
java·后端
长谷深风1114 小时前
为什么你的 Tool 总被模型选错?
java·大数据·ai·llm·ai agent·工具设计·agent设计
莫得感情 o5 小时前
并发 14 · 收官:虚拟线程与结构化并发
java·并发
聚美智数5 小时前
图片水印-图片剪裁-图片缩放API接口介绍
java·服务器·数据库