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 的核心能力可以归纳为两个方向:
- 流量控制:提供丰富的限流机制,并支持在请求达到阈值后,自定义后续请求的处理策略(拒绝、排队、预热等);
- 断路器与熔断 :用于解决服务雪崩问题,支持主动指定降级方法,在资源异常时快速失败并返回托底数据。

相关资料:
- 官网:https://sentinelguard.io/zh-cn/index.html
- 官方文档:https://sentinelguard.io/zh-cn/docs/introduction.html
1.2 Sentinel安装
Sentinel 是阿里巴巴开源的一款面向分布式服务架构的流量防卫兵,诞生于双十一大促场景,历经多年高并发实战检验,现已成为 Spring Cloud Alibaba 生态的核心组件之一。它从流量控制、熔断降级、系统负载保护等多个维度保障微服务的稳定性,并提供直观的图形化控制台,让运维人员可以实时监控和动态调整规则。
在微服务架构中,一个请求往往串联着多个服务,一旦链路中某个节点出现故障,故障会像雪崩一样向上游蔓延,最终拖垮整个系统。Sentinel 正是为解决这类问题而生,核心能力可以归纳为两个方向:
- 流量控制:提供丰富的限流机制,支持 QPS 和并发线程数两种阈值类型,以及直接、关联、链路三种流控模式,配合快速失败、WarmUp(预热)、排队等待三种流控效果,灵活应对秒杀、突发流量等场景;
- 熔断降级 :内置断路器,支持慢调用比例、异常比例、异常数三种熔断策略。当资源被限流或熔断时,可通过
blockHandler/fallback机制执行降级逻辑,返回托底数据,保证用户体验不中断。
此外,Sentinel 还提供热点参数限流、黑白名单授权、系统自适应保护等高级能力,并支持将规则持久化到 Nacos 等配置中心,实现服务重启后规则不丢失。
相关资料:
- 官网:https://sentinelguard.io/zh-cn/index.html
- 官方文档:https://sentinelguard.io/zh-cn/docs/introduction.html
- GitHub:https://github.com/alibaba/Sentinel
安装前需要确认三点:
- JDK 环境:建议使用 JDK 8,最高兼容 JDK 11,不建议使用 JDK 17/21;
- 端口占用:Sentinel 控制台默认占用 8080 端口,启动前需确认该端口未被其他服务占用;
- 版本选择:本文使用 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 网关,为微服务集群打造统一入口。
感兴趣的同学记得 点赞 + 关注,第一时间获取更新通知!