1. 为什么微服务架构需要流量防护组件
1.1 从一次线上故障说起
前两年参与过一个电商促销项目,系统拆成了十几个微服务,平时跑得好好的,一到整点秒杀就出问题。最开始的表现是订单服务响应变慢,然后调用它的商品服务线程池被占满,接着整个调用链路像多米诺骨牌一样全倒了。事后复盘发现,其实只有订单服务的一个下游接口出了问题,但因为没有任何流量防护机制,故障沿着调用链迅速扩散,最终演变成全站不可用。
这个场景在微服务架构里太常见了。服务拆分之后,调用关系从原来的进程内方法调用变成了跨网络的远程调用,不确定性陡然增加。一个服务出问题,调用它的上游服务如果没有任何保护措施,就会被拖垮。这就好比一条高速公路上有一辆车抛锚了,如果没有应急车道和分流机制,后面的车全得堵死。
流量防护要解决的核心问题就是:当系统面临突发流量、依赖服务故障、自身资源不足等情况时,如何保证系统不被冲垮,至少核心功能还能用。具体来说包括几个层面:限制某个接口的并发请求数,防止线程池被耗尽;当某个下游服务错误率飙升时,自动切断对它的调用,避免无谓的资源浪费;当系统负载过高时,主动拒绝部分非核心请求,把资源留给关键业务。
1.2 Sentinel在微服务生态中的定位
Sentinel是面向分布式服务架构的流量防护组件,主要以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度来保障服务的稳定性。它和Hystrix属于同一类产品,但设计理念和功能侧重点有所不同。
Hystrix更侧重于线程隔离和熔断,通过线程池隔离来限制对每个依赖服务的资源占用。Sentinel则更侧重于流量控制和多维度的保护策略,提供了更细粒度的控制能力和更丰富的保护场景。另外Sentinel的控制台功能比较完善,可以实时查看流量情况、动态调整规则,这在生产环境中非常实用。
Sentinel的核心概念有几个需要先搞清楚。资源是Sentinel保护的基本单位,可以是一个HTTP接口、一个RPC方法、一段代码块,甚至是一个数据库操作。规则是作用于资源的保护策略,包括流量控制规则、熔断降级规则、系统保护规则等。Slot Chain是Sentinel的处理链路,每个请求经过一系列Slot的处理,完成统计、规则检查、限流等操作。
理解这几个概念之后,后面的实操就会顺畅很多。资源定义了"保护什么",规则定义了"怎么保护",Slot Chain定义了"保护的执行流程"。
1.3 快速搭建一个可运行的Demo环境
在开始写代码之前,先把环境准备好。这里以Spring Boot项目为例,演示如何快速集成Sentinel。
首先创建一个基础的Spring Boot项目,在pom.xml中加入Sentinel的依赖:
<dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId> <version>2021.0.5.0</version> </dependency>这个依赖会自动引入Sentinel的核心包和Spring Cloud的适配包。版本选择上需要注意,Spring Cloud Alibaba的版本要和Spring Boot、Spring Cloud的版本对应,否则可能出现兼容性问题。我一般会去Spring Cloud Alibaba的官方版本说明里查一下对应关系,避免踩坑。
接下来在application.yml中配置Sentinel控制台的地址:
spring: cloud: sentinel: transport: dashboard: localhost:8080 port: 8719这里的dashboard地址是Sentinel控制台的地址,port是本地启动的HTTP Server端口,用于和控制台通信。这个端口如果被占用,Sentinel会自动往后找可用的端口,但建议还是显式指定一个不常用的端口,避免和其他服务冲突。
然后写一个简单的Controller来测试:
@RestController public class TestController { @GetMapping("/hello") public String hello() { return "Hello Sentinel"; } }启动项目,访问几次/hello接口,然后打开Sentinel控制台,就能看到这个接口的流量统计了。控制台默认的登录账号密码都是sentinel,这个在后续接入生产环境时需要修改。
注意:Sentinel控制台的规则默认是保存在内存中的,应用重启后规则会丢失。生产环境需要配置规则持久化,这个后面会详细说。
2. 流量控制规则的核心参数与实操配置
2.1 流控规则的几个关键维度
流量控制是Sentinel最基础也最常用的功能。它的核心思想是:当请求量超过某个阈值时,采取一定的策略来处理多余的请求。这里的"处理"可以是直接拒绝、排队等待、或者匀速通过。
配置一条流控规则,需要理解几个关键参数。资源名指定要保护的资源,可以是接口路径、方法名或者自定义的资源名。阈值类型分为QPS和线程数两种,QPS表示每秒请求数,线程数表示同时处理的请求数量。流控模式有直接、关联、链路三种,决定了规则的作用方式。流控效果包括快速失败、Warm Up、排队等待,决定了超过阈值后的处理策略。
这几个参数组合起来,可以覆盖大部分流量控制场景。比如限制某个接口的QPS不超过100,超过就直接拒绝;或者当A接口的流量过大时,限制B接口的流量,保护整体稳定性。
2.2 QPS限流与线程数限流的区别
QPS限流和线程数限流是两种不同的保护思路,适用的场景也不一样。
QPS限流控制的是单位时间内的请求数量。比如设置阈值为100,表示每秒最多处理100个请求,第101个请求就会被拒绝。这种模式适合处理突发流量,防止瞬间大量请求涌入。但QPS限流有个问题:如果每个请求的处理时间很长,即使QPS没超过阈值,线程池也可能被占满。
线程数限流控制的是同时处理的请求数量。比如设置阈值为50,表示最多同时有50个线程在处理请求,第51个请求会被拒绝。这种模式适合保护那些处理时间较长的接口,防止线程池被耗尽。
实际使用中,我一般会这样选择:对于快速返回的查询接口,用QPS限流;对于处理时间较长、涉及外部调用的接口,用线程数限流。当然也可以两者结合,但配置会复杂一些,需要根据实际压测结果来调整。
2.3 流控模式:直接、关联、链路的适用场景
流控模式决定了规则的作用方式,理解这三种模式的区别很重要。
直接模式是最简单的,规则直接作用于当前资源。比如给/order接口配置一条直接模式的流控规则,就是限制/order接口本身的流量。
关联模式是当关联资源达到阈值时,限制当前资源的流量。举个例子:有两个接口,一个是"下单"接口,一个是"查询订单"接口。当"下单"接口的流量过大时,可以限制"查询订单"接口的流量,把资源留给更重要的下单操作。这种模式适合有优先级区分的业务场景。
链路模式是只统计从某个入口资源进来的流量,限制这部分流量。比如一个Service方法可能被多个Controller调用,链路模式可以只限制从某个特定Controller进来的调用,不影响其他入口。
这三种模式中,直接模式最常用,关联模式适合有资源竞争的场景,链路模式适合需要精细化控制的场景。刚开始用的时候,建议先从直接模式入手,熟悉之后再尝试其他模式。
2.4 流控效果:快速失败、Warm Up、排队等待
流控效果决定了超过阈值后的处理策略,三种效果各有用途。
快速失败是默认策略,超过阈值直接抛出FlowException,请求被拒绝。这种策略简单直接,适合大多数场景。
Warm Up也叫预热模式,阈值会从一个较小的值逐渐增加到设定值。比如设置阈值为100,预热时间为10秒,那么刚开始阈值可能是10,然后在10秒内逐渐增加到100。这种模式适合那些刚启动时性能还不稳定的服务,给系统一个预热的过程。
排队等待是让请求匀速通过,而不是直接拒绝。比如设置阈值为10,超时时间为500毫秒,那么请求会以每100毫秒一个的速度通过,如果等待时间超过500毫秒还没被处理,才会被拒绝。这种模式适合处理间隔性突发流量,用削峰填谷的方式保护系统。
选择哪种效果,取决于业务对请求被拒绝的容忍度。如果请求被拒绝影响不大,用快速失败;如果希望尽量不丢请求,用排队等待;如果服务启动后需要预热,用Warm Up。
2.5 在控制台配置一条完整的流控规则
理论说完了,来实际操作一下。启动项目和控制台,在控制台左侧菜单找到"簇点链路",可以看到所有被Sentinel统计的资源。找到/hello这个资源,点击右侧的"流控"按钮,弹出规则配置窗口。
按照下面的参数配置一条规则:
| 参数 | 值 | 说明 |
|---|---|---|
| 资源名 | /hello | 要保护的接口 |
| 阈值类型 | QPS | 按每秒请求数限流 |
| 单机阈值 | 2 | 每秒最多2个请求 |
| 流控模式 | 直接 | 直接限制当前资源 |
| 流控效果 | 快速失败 | 超过阈值直接拒绝 |
配置完成后,快速刷新/hello接口,当每秒请求超过2次时,就会看到Sentinel返回的限流提示。这说明规则已经生效了。
提示:控制台配置的规则默认只保存在内存中,应用重启后会丢失。如果需要持久化,可以配置Nacos、ZooKeeper等数据源,这个在后续进阶篇里会详细讲。
3. 熔断降级规则的原理与实战
3.1 熔断降级要解决的核心问题
熔断降级是微服务架构中另一个重要的保护机制。它要解决的问题是:当某个下游服务出现故障时,如何避免调用方被拖垮。
举个实际例子:订单服务需要调用库存服务来扣减库存。如果库存服务响应变慢,每次调用都要等好几秒才超时,那么订单服务的线程就会被大量占用,最终导致订单服务也不可用。这就是典型的雪崩效应。
熔断降级的思想是:当发现某个下游服务的错误率或响应时间超过阈值时,自动切断对它的调用,直接返回一个降级结果。等过一段时间后再尝试恢复调用,如果下游服务恢复正常,就重新建立连接。
这个过程很像电路中的保险丝:电流过大时保险丝熔断,保护整个电路不被烧毁。等故障排除后,更换保险丝,电路恢复工作。Sentinel的熔断降级就是软件层面的保险丝。
3.2 熔断策略:慢调用比例、异常比例、异常数
Sentinel支持三种熔断策略,分别针对不同的故障场景。
慢调用比例策略关注的是响应时间。当请求的响应时间超过设定的RT阈值时,被统计为慢调用。如果慢调用比例超过阈值,且请求数达到最小请求数,就触发熔断。这种策略适合保护那些对响应时间敏感的服务。
异常比例策略关注的是异常数量。当请求的异常比例超过阈值时触发熔断。这种策略适合保护那些异常率能反映服务健康状态的场景。
异常数策略是异常比例的简化版,直接统计异常数量,超过阈值就熔断。这种策略适合请求量不大、但异常比较敏感的场景。
三种策略的选择取决于业务特点。如果下游服务的故障表现为响应变慢,用慢调用比例;如果表现为抛出异常,用异常比例或异常数。实际使用中,慢调用比例和异常比例用得比较多。
3.3 熔断器的状态机与恢复机制
理解熔断器的状态机,对正确使用熔断降级很重要。Sentinel的熔断器有三个状态:关闭、打开、半开。
关闭状态是正常状态,所有请求都会放行,同时统计慢调用和异常情况。当统计指标超过阈值时,熔断器切换到打开状态。
打开状态下,所有请求都会被拒绝,直接走降级逻辑。同时启动一个时间窗口,经过设定的熔断时长后,熔断器切换到半开状态。
半开状态下,会放行一个探测请求。如果这个请求成功,说明下游服务恢复了,熔断器切换到关闭状态;如果失败,说明还没恢复,熔断器重新回到打开状态,继续等待下一个时间窗口。
这个状态机的设计很巧妙,既能在故障时快速切断调用,又能在恢复后自动重新建立连接,不需要人工干预。熔断时长和探测请求的数量需要根据实际场景调整,设置得太短可能导致频繁切换,设置得太长可能导致恢复延迟。
3.4 配置熔断规则并验证效果
来配置一条熔断规则验证一下。先写一个会随机超时的接口:
@GetMapping("/slow") public String slow() throws InterruptedException { long sleepTime = new Random().nextInt(2000); Thread.sleep(sleepTime); return "slow response: " + sleepTime + "ms"; }这个接口会随机休眠0到2秒,模拟响应时间不稳定的情况。然后在控制台配置熔断规则:
| 参数 | 值 | 说明 |
|---|---|---|
| 资源名 | /slow | 要保护的接口 |
| 熔断策略 | 慢调用比例 | 按响应时间熔断 |
| 最大RT | 500ms | 超过500ms算慢调用 |
| 比例阈值 | 0.5 | 慢调用比例超过50%触发熔断 |
| 熔断时长 | 10s | 熔断后10秒进入半开状态 |
| 最小请求数 | 5 | 至少5个请求才开始统计 |
配置完成后,快速访问/slow接口多次,当慢调用比例超过50%时,后续请求会直接返回降级信息,不再执行实际逻辑。等待10秒后,熔断器进入半开状态,放行一个请求探测,如果成功则恢复正常。
注意:熔断规则的统计是基于滑动时间窗口的,不是固定时间窗口。这意味着统计是连续滚动的,不会出现固定窗口边界处的流量突刺问题。
3.5 熔断降级的异常处理与兜底逻辑
熔断触发后,请求会被拒绝并抛出DegradeException。如果不处理这个异常,用户会看到错误页面。所以需要配置降级逻辑,给用户一个友好的返回。
Sentinel提供了几种处理降级的方式。一种是使用@SentinelResource注解的blockHandler属性,指定一个方法来处理被限流或降级的请求:
@SentinelResource(value = "orderService", blockHandler = "handleBlock", fallback = "handleFallback") public String getOrder(String orderId) { // 业务逻辑 } public String handleBlock(String orderId, BlockException ex) { return "请求被限流或降级: " + ex.getClass().getSimpleName(); } public String handleFallback(String orderId, Throwable t) { return "业务异常降级: " + t.getMessage(); }blockHandler处理的是BlockException,包括流控、熔断、系统保护等规则触发的异常。fallback处理的是业务异常,比如下游服务调用失败抛出的异常。两者的区别在于:blockHandler处理的是Sentinel规则导致的拒绝,fallback处理的是业务逻辑本身的异常。
实际使用中,建议两个都配置,这样无论是规则拒绝还是业务异常,都能给用户一个合理的返回。降级逻辑的设计原则是:尽量返回缓存数据或默认值,保证核心功能可用,同时记录日志便于排查问题。
4. 系统保护规则与热点参数限流
4.1 系统保护规则的作用与配置
系统保护规则是从整体维度保护系统的可用性,它不针对某个具体资源,而是监控系统的整体负载情况。当系统负载达到阈值时,自动拒绝部分请求,保证系统不被压垮。
系统保护规则有几个关键的监控指标。Load是系统负载,反映CPU的繁忙程度。RT是所有请求的平均响应时间。线程数是当前活跃的线程数量。入口QPS是所有入口流量的总和。CPU使用率是当前CPU的使用百分比。
配置系统保护规则时,需要根据系统的实际承载能力来设定阈值。比如一个4核的机器,Load阈值可以设置为4左右;CPU使用率阈值可以设置为80%左右。这些值不是固定的,需要通过压测来确定。
系统保护规则的一个特点是:它作用于所有入口流量,而不是某个具体资源。当触发系统保护时,Sentinel会拒绝新的请求,直到系统负载降下来。这种机制适合作为最后一道防线,防止系统在极端情况下完全崩溃。
4.2 热点参数限流的应用场景
热点参数限流是一种更细粒度的流控方式,它针对资源中的某个具体参数值进行限流。比如一个查询商品详情的接口,大部分请求集中在少数几个热门商品上,如果只做整体QPS限流,热门商品的请求会挤占其他商品的资源。热点参数限流可以单独限制某个热门商品的访问频率。
配置热点参数限流需要指定参数索引和阈值。参数索引从0开始,对应方法参数的顺序。比如:
@SentinelResource(value = "getProduct") public String getProduct(String productId, String userId) { // productId是第0个参数,userId是第1个参数 }如果要对productId做热点限流,参数索引设为0。然后可以配置通用的阈值,也可以针对特定的参数值配置单独的阈值。比如通用阈值是100,但productId为"hot123"的阈值是10,这样热门商品的访问频率就被单独限制了。
热点参数限流适合那些请求分布不均匀的场景,比如秒杀、热门内容访问等。它可以在不增加整体资源的情况下,更公平地分配访问机会。
4.3 规则持久化的必要性与实现思路
前面提到过,Sentinel控制台配置的规则默认保存在内存中,应用重启后规则会丢失。这在生产环境中是不可接受的,所以需要配置规则持久化。
Sentinel支持多种持久化方式,包括Nacos、ZooKeeper、Apollo等配置中心,也支持本地文件持久化。其中Nacos是最常用的方案,因为Nacos本身也是Spring Cloud Alibaba生态的组件,集成起来比较方便。
持久化的原理是:Sentinel的DataSource会从配置中心读取规则,当配置中心的规则发生变化时,Sentinel会收到通知并更新本地规则。这样规则就保存在配置中心,应用重启后会自动拉取,不会丢失。
配置Nacos持久化的步骤大致是:引入sentinel-datasource-nacos依赖,在application.yml中配置Nacos的地址和规则所在的dataId,然后在Nacos中创建对应的配置。具体的配置格式可以参考Sentinel的官方文档,这里不展开。
提示:规则持久化是生产环境必须配置的,建议在项目初期就规划好,不要等到上线后再补。
4.4 注解方式与代码方式的对比
Sentinel提供了两种定义资源的方式:注解方式和代码方式。
注解方式使用@SentinelResource注解,直接在方法上标注资源名和降级处理方法。这种方式代码简洁,适合大多数场景。但注解方式有一个限制:它只能作用于Spring管理的Bean方法,对于非Spring管理的对象或者静态方法,注解不生效。
代码方式使用SphU.entry()和SphU.exit()手动定义资源,适合需要精细控制或者注解不生效的场景。代码方式更灵活,但需要手动处理异常和资源释放,代码量会多一些。
// 代码方式示例 public String queryData(String id) { Entry entry = null; try { entry = SphU.entry("queryData"); // 业务逻辑 return "data"; } catch (BlockException e) { // 处理被限流的情况 return "blocked"; } finally { if (entry != null) { entry.exit(); } } }实际使用中,我一般优先用注解方式,代码简洁易维护。只有在注解不生效或者需要更细粒度控制时,才用代码方式。两种方式可以混用,根据具体场景选择。
5. 常见问题排查与避坑经验
5.1 规则不生效的几种原因
规则配置了但不生效,是新手最常遇到的问题。根据我的经验,原因通常有几种。
第一种是资源名不对。Sentinel的资源名默认是接口路径,但如果有context-path或者servlet前缀,资源名会包含这些前缀。可以在控制台的"簇点链路"里查看实际的资源名,确保配置的资源名和实际的一致。
第二种是规则没有推送到客户端。控制台配置规则后,需要等待几秒钟推送到客户端。如果一直不生效,可以检查控制台和客户端的连接是否正常,客户端的transport端口是否被防火墙拦截。
第三种是规则被覆盖了。如果同时配置了注解和URL资源,可能会出现规则冲突。建议统一使用一种方式定义资源,避免混淆。
第四种是Sentinel没有拦截到请求。如果请求没有经过Sentinel的拦截器,就不会被统计和保护。比如直接调用Service方法而不是通过Controller,或者使用了自定义的过滤器绕过了Sentinel。
排查这类问题时,我一般会先看控制台的"簇点链路"里有没有对应的资源,再看"实时监控"里有没有流量数据,逐步缩小范围。
5.2 熔断降级不触发的排查思路
熔断降级不触发,通常是因为统计指标没有达到阈值。排查时可以从几个方面入手。
先确认最小请求数是否达到。Sentinel的熔断规则有一个最小请求数的限制,只有请求数达到这个值才会开始统计。如果请求量太小,熔断永远不会触发。
再确认统计窗口是否正确。熔断规则的统计是基于滑动窗口的,窗口大小和熔断时长是两个不同的概念。窗口大小决定了统计的时间范围,熔断时长决定了熔断后多久进入半开状态。这两个参数需要分别配置。
然后确认异常是否被正确统计。如果业务代码捕获了异常没有抛出,Sentinel就统计不到异常。对于异常比例和异常数策略,需要确保异常能传播到Sentinel的统计逻辑中。
最后确认熔断策略是否匹配。慢调用比例策略统计的是响应时间,如果接口响应时间没有超过RT阈值,就不会被统计为慢调用。需要根据实际响应时间来调整RT阈值。
5.3 控制台连接失败的常见原因
控制台连接失败也是常见问题,表现是控制台看不到应用或者规则推送失败。
最常见的原因是网络不通。控制台和客户端需要双向通信,客户端会主动连接控制台,控制台也会主动连接客户端的transport端口。如果客户端在容器或虚拟机中,需要确保transport端口对外暴露。
另一个原因是版本不兼容。Sentinel控制台和客户端的版本需要匹配,版本差异过大可能导致通信协议不兼容。建议使用相同版本的客户端和控制台。
还有可能是配置错误。dashboard地址配置错误、端口被占用、防火墙拦截等都可能导致连接失败。可以查看客户端的日志,通常会有连接失败的详细原因。
经验:如果控制台一直连不上,可以先在客户端机器上telnet控制台的端口,确认网络是否通。然后再检查配置和版本,逐步排查。
5.4 生产环境使用的注意事项
生产环境使用Sentinel,有几个点需要特别注意。
规则持久化是必须的,前面已经说过。另外建议配置规则推送的监听器,当规则变化时能及时感知并记录日志,便于追溯问题。
控制台的账号密码一定要修改,默认的sentinel/sentinel在生产环境是不安全的。控制台的访问也应该限制在内网,不要暴露到公网。
流控和熔断的阈值需要根据压测结果来设定,不要拍脑袋决定。阈值设得太松起不到保护作用,设得太紧会影响正常业务。建议在预发环境充分压测,找到合适的阈值后再上生产。
监控告警也要配置好。Sentinel本身提供了实时监控,但生产环境还需要接入统一的监控系统,当触发限流或熔断时能及时告警,便于快速响应。
最后,降级逻辑要设计好。降级不是简单的返回错误,而是要给用户一个合理的响应。比如返回缓存数据、默认值、或者友好的提示信息。降级逻辑的质量直接影响用户体验,需要认真设计。
5.5 常见问题速查表
| 问题现象 | 可能原因 | 排查方向 |
|---|---|---|
| 规则不生效 | 资源名不对 | 查看簇点链路中的实际资源名 |
| 规则不生效 | 规则未推送 | 检查控制台和客户端连接 |
| 熔断不触发 | 请求数不足 | 确认是否达到最小请求数 |
| 熔断不触发 | 异常被捕获 | 检查异常是否传播到Sentinel |
| 控制台连不上 | 网络不通 | telnet测试端口连通性 |
| 控制台连不上 | 版本不兼容 | 统一客户端和控制台版本 |
| 规则丢失 | 未持久化 | 配置Nacos等数据源 |
| 降级不执行 | 方法签名不对 | 检查blockHandler参数是否匹配 |
这张表覆盖了大部分常见问题,遇到问题时可以按表排查。当然实际场景可能更复杂,需要结合日志和监控具体分析。
6. 从入门到进阶的学习路径
6.1 掌握核心概念后的下一步
把流控、熔断、系统保护这几个核心功能跑通之后,算是入了门。接下来可以从几个方向深入。
源码层面,可以看看Sentinel的Slot Chain是怎么设计的,各个Slot的执行顺序和职责是什么。理解源码之后,对规则的处理流程会有更清晰的认识,排查问题时也更有方向。
规则持久化是生产必备的技能,建议尽早掌握。Nacos、ZooKeeper、Apollo这几种数据源的配置方式大同小异,学会一种之后其他的很容易上手。
集群流控是另一个进阶方向。单机流控只能控制单个实例的流量,集群流控可以控制整个集群的总流量。这在实例数量较多、流量分布不均匀的场景下很有用。集群流控需要部署Token Server,配置会复杂一些,但效果更好。
6.2 与其他组件的配合使用
Sentinel不是孤立使用的,它需要和微服务生态中的其他组件配合。
和OpenFeign配合时,需要引入sentinel-openfeign依赖,这样Feign调用会被Sentinel保护。和RestTemplate配合时,需要用@SentinelRestTemplate注解。和Gateway配合时,需要引入sentinel-gateway依赖,配置网关层的流控规则。
这些集成的配置方式各有不同,但核心思想是一样的:把远程调用包装成Sentinel资源,然后配置规则进行保护。理解了这一点,各种集成的配置就很容易理解了。
6.3 实际项目中的落地建议
最后分享几个实际项目中的落地建议。
不要一开始就配置很多规则,先从核心接口开始,配置基本的流控和熔断规则,观察一段时间后再逐步完善。规则太多反而会增加维护成本,而且可能互相影响。
阈值设定要保守一些,宁可先设宽松一点,观察实际流量后再收紧。设得太紧导致正常业务被限流,影响比不设规则还大。
降级逻辑要提前设计好,不要等到出问题了才临时加。降级逻辑的质量直接影响用户体验,需要和业务方一起讨论确定。
监控告警要配置好,触发限流或熔断时能及时收到通知。Sentinel控制台提供了实时监控,但生产环境还需要接入统一的监控系统。
我在实际项目中的体会是,Sentinel这类流量防护组件,配置不难,难的是阈值的确定和降级逻辑的设计。这需要结合业务特点、压测数据和线上监控来不断调整。工具只是手段,真正的稳定性保障还是要靠对业务的深入理解和持续的优化。