Sentinel 是一款功能强大的开源流量控制组件。它由阿里巴巴开发,旨在为分布式系统提供流量控制、熔断降级、系统负载保护等功能。
Sentinel 可以有效地应对突发的流量高峰,防止系统因流量过大而崩溃。它通过实时监控系统的流量、并发线程数、响应时间等指标,自动调整系统的流量控制策略,确保系统的稳定性和可用性。
在流量控制方面,Sentinel 提供了多种流量控制策略,如限流、流量整形、热点参数限流等。这些策略可以根据不同的业务场景进行灵活配置,满足不同系统的流量控制需求。
此外,Sentinel 还提供了熔断降级功能。当系统中的某个服务出现故障时,Sentinel 可以自动熔断该服务,防止故障扩散。同时,它还可以根据系统的负载情况自动降级一些非关键服务,以保证关键服务的正常运行。
以下详细介绍你给出的 Sentinel 资源限流配置示例中各个字段的含义,并进一步展开讲解其他可配置的字段,同时给出不同场景下的配置示例。Sentinel 配置:
[ { "resource": "/user/get", "limitApp": "default", "grade": 1, "count": 10, "strategy": 0, "controlBehavior": 0, "clusterMode": false } ]
这个 Sentinel 配置定义了一个流量控制规则,我们可以逐一分析每个字段的含义:
这是资源的名称,代表你要对哪个资源进行限流控制。在代码里,你可以使用 @SentinelResource("yourResourceName") 这样的方式来定义资源。例如,若要对一个名为 getUserInfo 的接口进行限流,那么 resource 就可以设为 "getUserInfo"。
在 Sentinel 中,资源是流量控制、熔断降级等功能的基本单位,通常可以是一个方法名、URL 等。
指定受限流规则影响的调用来源。"default" 表示对所有调用来源都生效。你也可以指定具体的应用名称,例如 "app1",这样就只会对来自 app1 的请求进行限流。
在实际应用中,你可以根据需要设置为特定的应用名,以实现更细粒度的流量控制。
注意:在使用 Sentinel 进行资源保护时,调用者可以通过 ContextUtil.enter 方法来设置调用来源。这个方法允许你在代码里明确指定当前调用的来源名称,从而与限流规则中的 limitApp 进行匹配。
用于指定限流阈值的类型,在 Sentinel 中,grade 的取值通常为 0(线程数)或 1(QPS,即每秒查询率)。
0:表示线程数限流,也就是限制同时处理该资源的线程数量。
1:表示 QPS(每秒查询率)限流,即限制每秒通过的请求数量。
表示限流的阈值。它的具体含义会根据 grade 的值而有所不同。当 grade 为 1(QPS 限流)时,count 代表每秒允许通过的请求数量;当 grade 为 0(线程数限流)时,count 代表允许同时处理该资源的最大线程数量。
指定限流策略。Sentinel 支持多种流量控制模式,包括:
0:直接限流,即对当前资源直接进行限流。
1:关联限流,当关联资源的 QPS 超过阈值时,对当前资源进行限流。
2:链路限流,只对指定链路入口的请求进行限流。
流量控制效果。Sentinel 提供了多种流量控制效果,包括快速失败、Warm Up、排队等待等。取值如下:
0:快速失败,当请求超过阈值时,直接抛出 FlowException 异常。
1:Warm Up(预热),系统初始化时允许通过的请求较少,随着时间推移逐渐增加到阈值。
2:排队等待,请求超过阈值时会进入队列排队等待,直到有可用的配额。
3:Warm Up + 排队等待。
是否开启集群模式,true 表示开启,false 表示关闭。集群模式允许 Sentinel 在多个实例之间进行流量控制规则的共享和协同工作。
[ { "resource": "yourResourceName", "count": 5, "grade": 0, "limitApp": "default" } ]
此配置表示对 yourResourceName 资源进行线程数限流,最多允许 5 个线程同时处理该资源。
[ { "resource": "resourceA", "count": 20, "grade": 1, "limitApp": "default", "strategy": 1, "refResource": "resourceB" } ]
这里当关联资源 resourceB 的 QPS 超过 20 时,会对 resourceA 进行限流。
注意:refResource 用于指定一个关联的资源名称。在不同的限流策略下,它有着不同的意义和用途:
关联限流:当采用关联限流策略时,refResource 所指定的资源的 QPS(每秒查询率)情况会影响当前资源的限流判断。如果关联资源的 QPS 超过了其自身的阈值,那么当前资源就会受到限流控制。
链路限流(虽不直接用 refResource 语义,但有类似关联逻辑):链路限流关注的是请求的调用链路,虽然没有直接依赖 refResource 这个字段来定义,但整体上也是基于资源间的关联关系来进行限流的。
[ { "resource": "yourResourceName", "count": 100, "grade": 1, "limitApp": "default", "controlBehavior": 1, "warmUpPeriodSec": 10 } ]
该配置表示对 yourResourceName 资源采用预热限流策略,初始阶段允许通过的请求较少,在 10 秒的预热期后逐渐增加到每秒 100 个请求。
注意:warmUpPeriodSec 用于指定这个预热过程的持续时间(单位为秒)。在预热期间,系统允许通过的请求数量会逐渐增加,直到达到预设的限流阈值。这样可以让系统有足够的时间进行资源初始化、缓存预热等操作,从而平稳地过渡到高负载运行状态。
[ { "resource": "yourResourceName", "count": 30, "grade": 1, "limitApp": "default", "controlBehavior": 2, "maxQueueingTimeMs": 500 } ]
此配置下,当请求超过每秒 30 个时,会进入队列排队等待,最长等待时间为 500 毫秒。
当 Sentinel 采用 “排队等待”(controlBehavior 值为 2)这种流控效果时,若请求的数量超过了预设的限流阈值,这些超出的请求不会立即被拒绝(像 “快速失败” 策略那样),而是会被放入一个队列中进行排队等待处理。maxQueueingTimeMs 就是用来指定请求在队列中允许等待的最长时间,单位是毫秒(ms)。
如果一个请求在队列中等待的时间超过了 maxQueueingTimeMs 所设定的值,那么这个请求将会被拒绝,Sentinel 会抛出 FlowException 异常。通过设置 maxQueueingTimeMs,可以避免请求在队列中无限期地等待,防止资源长时间被占用,同时也能在一定程度上保证系统的响应性能。