Sentinel 是阿里巴巴开源的一款面向分布式、微服务架构的流量控制、熔断降级的组件。它以“流量”为切入点,从限流、熔断降级、系统负载保护等多个维度来保护服务的稳定性。
你可以把它想象成一个部署在你服务门口的智能流量哨兵。
1. 为什么需要 Sentinel?(它解决了什么问题)
在微服务架构中,服务之间相互调用。一个请求通常会经过多个服务。如果其中一个服务因为某种原因(如代码 Bug、硬件故障、流量突增)变慢或者崩溃,就会导致调用它的上游服务长时间等待,最终也可能被拖垮。这种故障会像多米诺骨牌一样,在整个系统中蔓延,最终导致整个系统不可用。这就是所谓的“雪崩效应”。
Sentinel 的核心目标就是防止雪崩效应,保障服务的高可用性。
2. Sentinel 的三大核心功能
Sentinel 的能力主要体现在以下三个方面:
a. 流量控制 (Flow Control) - 限流
这是 Sentinel 最核心的功能。它能精确地控制进入你服务的请求数量,防止服务因瞬间流量过大而被压垮。
-
控制目标:可以针对某个 API 接口(资源名)、某个服务、甚至某个 IP 地址进行限流。
-
控制方式:
-
QPS (Queries Per Second):直接限制每秒可以通过的请求数。比如设置某个接口的 QPS 为 100,那么第 101 个请求就会被直接拒绝或排队等待。
-
线程数 (Thread Count):限制同时处理该请求的线程数。比如设置某个业务的并发线程数为 10,那么第 11 个请求到来时,如果前面 10 个都还没处理完,它就会被拒绝。这对于防止慢SQL拖垮整个服务非常有效。
-
-
流控效果:
-
快速失败:超过阈值,直接拒绝请求,返回错误信息。
-
Warm Up (预热):适用于秒杀等场景。系统启动时,QPS 阈值会从一个较低的值平滑地提升到设定的最大值,避免系统冷启动时被瞬间流量打垮。
-
排队等待:超过阈值,请求不会立即被拒绝,而是在一个队列里排队等待,直到超时。
-
b. 熔断降级 (Circuit Breaking & Degradation)
当 Sentinel 检测到某个依赖的服务(或自身的某个功能)持续出错或响应过慢时,它会像电路中的“保险丝”一样“熔断”,在接下来的指定时间窗口内,不再去调用这个不稳定的服务,而是直接返回一个预设的降级响应(比如一个默认值、一个友好的错误提示、或者一个缓存数据)。
-
熔断策略:
-
慢调用比例 (Slow Request Ratio):当请求的响应时间大于某个阈值(比如 200ms)的比例超过设定值时,触发熔断。
-
异常比例 (Error Ratio):当请求的异常数占总请求数的比例超过设定值时,触发熔断。
-
异常数 (Error Count):在指定时间窗口内,当异常数达到设定值时,触发熔断。
-
-
熔断器状态:熔断器有三个状态:
-
Closed (关闭):正常状态,所有请求都能通过。
-
Open (打开):熔断状态,所有请求都会被快速失败或降级。
-
Half-Open (半开):经过一个设定的熔断时长后,Sentinel 会尝试放行一个请求。如果这个请求成功,则熔断器关闭 (Closed);如果失败,则继续保持打开 (Open) 状态,等待下一个熔断周期。
-
c. 系统自适应保护 (System Adaptive Protection)
这是 Sentinel 的一个特色功能。它不针对某一个具体的接口,而是从整个应用的维度来进行保护。当系统的负载过高时,它会自动限制所有入口的流量,防止整个系统崩溃。
-
保护维度:
-
Load (系统负载):当系统的 load1 (Linux) 超过设定阈值时,触发系统保护。
-
CPU Usage (CPU 使用率):当系统的 CPU 使用率超过设定阈值时,触发系统保护。
-
RT (平均响应时间):当所有入口请求的平均响应时间超过设定阈值时,触发系统保护。
-
QPS (入口 QPS):当所有入口请求的 QPS 超过设定阈值时,触发系统保护。
-
3. Sentinel 的组成部分
Sentinel 主要由两部分组成:
-
核心库 (Core Library):以 Java 客户端库(一个 JAR 包)的形式运行在你的应用中。它负责执行所有的流量控制规则。你需要将它作为依赖引入到你的项目中。
-
控制台 (Dashboard):一个独立的 Web 应用。它提供了一个可视化的界面,让你能够:
-
实时监控:查看应用的实时流量、QPS、响应时间、线程数等。
-
动态配置规则:在界面上直接为你的应用增、删、改、查各种规则(限流、熔断等),规则会实时生效,无需重启应用。
-
在你提供的配置文件中,sentinel.transport.dashboard: 127.0.0.1:9191 就是告诉你的应用(核心库)去和这个地址的控制台进行通信。
4. 规则持久化(结合你的配置)
默认情况下,你在 Sentinel 控制台上配置的规则是存储在应用内存中的。这意味着,如果你的应用重启,所有配置的规则都会丢失。这在生产环境中是不可接受的。
为了解决这个问题,Sentinel 支持规则持久化,即将规则存储在一个外部的、可靠的配置中心里,如 Nacos, ZooKeeper, Apollo 等。
你的配置文件中 sentinel.datasource 部分正是做的这件事:
datasource:ds1:nacos:server-addr: base-nacos:8848dataId: sentinal-joolungroupId: SENTINEL_GROUPdata-type: jsonrule-type: flow
content_copydownload
Use code with caution.Yaml
这部分配置告诉 Sentinel:
-
数据源类型:是 Nacos。
-
Nacos 地址:base-nacos:8848。
-
规则位置:去 Nacos 的 SENTINEL_GROUP 分组下,找一个 Data ID 为 sentinal-joolun 的配置。
-
规则类型:这个配置里存储的是流控规则 (flow)。
工作流程就变成了:
-
你在 Sentinel 控制台上新增或修改一条流控规则。
-
控制台(需要经过改造或使用社区版)会将这条规则推送到 Nacos 的 sentinal-joolun 这个配置项里。
-
你的应用因为监听了这个 Nacos 配置项,会立即收到变更通知。
-
应用从 Nacos 拉取最新的规则,并加载到内存中,使其生效。
-
当应用重启时,它会自动从 Nacos 拉取所有规则,实现了规则的持久化。
5. Sentinel vs. Hystrix (另一个熔断器)
-
隔离策略:Hystrix 主要使用线程池隔离,虽然隔离性好,但会带来线程切换的开销。Sentinel 主要使用信号量隔离,更加轻量级。
-
功能丰富度:Sentinel 的功能更全面,除了熔断降级,还提供了强大的流控、系统自适应保护、热点参数限流等。
-
控制台:Sentinel 的控制台功能强大,支持实时监控和动态规则修改,对运维非常友好。Hystrix 的 Dashboard 主要用于监控,不具备规则动态配置能力。
-
生态:Sentinel 是阿里巴巴开源并主推的组件,与 Spring Cloud Alibaba 生态无缝集成,是目前 Java 微服务生态中的主流选择。
6.Sentinel 的流控规则 (Flow Control Rules) 的具体定义。
这通常就是存储在 Nacos 配置中心里,那个 dataId 为 sentinal-joolun 的配置文件的内容。当你的应用(比如 API Gateway)启动时,它会从 Nacos 读取这段 JSON,并将其解析成内存中的限流规则。
下面,我将为你逐一拆解这些字段的含义,并解释这些规则的作用。
字段含义解析
我们先来理解每个字段代表什么。Sentinel 的流控规则主要由以下几个核心属性构成:
| JSON 字段 | Sentinel 官方术语 | 含义解释 |
| resource | Resource | 资源名。这是你要保护的目标,可以是一个 URL 路径、一个服务名、一个方法名,或任何自定义的字符串。 |
| count | Count | 阈值。在单位时间内允许通过的请求数量。 |
| grade | Grade | 阈值类型。决定 count 字段的单位是什么。它有两个主要值:<br/> 1: QPS 模式 (每秒请求数)。<br/> 0: 线程数模式 (并发线程数)。 |
| limitApp | Limit Application | 流控针对的来源应用。default 表示不区分来源,对所有调用方都生效。你也可以指定某个特定的微服务名,实现只对该服务的调用进行限流。 |
| strategy | Strategy | 流控模式。决定如何应用规则。它有三个值:<br/> 0: 直接模式 (Direct)。直接对当前资源进行限流。<br/> 1: 关联模式 (Relate)。当关联资源达到阈值时,限流当前资源。<br/> 2: 链路模式 (Chain)。只记录从指定链路入口进入的流量。 |
| controlBehavior | Control Behavior | 流控效果。决定当请求达到阈值时,系统该如何处理。它有三个值:<br/> 0: 快速失败 (Fast-Fail)。直接拒绝请求,抛出 FlowException。<br/> 1: 预热 (Warm Up)。平滑地将 QPS 提升到阈值,防止冷启动时系统被冲垮。<br/> 2: 排队等待 (Rate Limiter)。让请求排队,匀速处理,而不是立即拒绝。 |
逐条规则解读
现在我们用上面的知识来翻译你提供的这几条规则:
规则 1:
{"resource": "base-auth","count": 500,"grade": 1,"limitApp": "default","strategy": 0,"controlBehavior": 0
}
content_copydownload
Use code with caution.Json
-
解读:
-
目标 (resource): 针对名为 base-auth 的资源。这很可能是在 API Gateway 中路由到认证中心(base-auth 服务)的流量。
-
规则 (grade & count): 采用 QPS 模式 (grade: 1),阈值为 500 (count: 500)。
-
限制 (limitApp & strategy): 对所有调用方 (limitApp: 'default') 都生效,并且是直接限流 (strategy: 0)。
-
效果 (controlBehavior): 一旦 QPS 超过 500,新的请求将被立即拒绝 (controlBehavior: 0)。
-
-
一句话总结: 限制访问 base-auth 服务的 QPS 不能超过 500。
总结
Sentinel 是一个功能强大、性能卓越、对开发者和运维都非常友好的流量治理组件。它不仅仅是一个熔断器,更是一个全方位的服务稳定性保障方案。在你的配置中,通过与 Nacos 的结合,更是构建了一个健壮、动态、高可用的微服务保护体系。
