1.定义Sentinel资源

1.SphU/SphO手动定义

参考:点击这里

2.@SentinelResource标签定义

通常用在接口层或Service层

  1. @GetMapping
  2. @SentinelResource(value = "get-sentinel-service")
  3. public String get(@RequestParam String param) {
  4. return "sentinel-service查询结果";
  5. }

重启服务并触发对应接口后,控制台点击簇点链路即可查看定义的资源
image.png

2.Sentinel流量控制

通过代码设置流控规则并生效请参考:点击这里

1.流控的概念

任何系统处理请求的能力都是有限的,但任意时间内到达系统的请求量往往是随机且不可控的,如果在某一个瞬时时刻请求量急剧增,那么系统就很有可能被瞬时的流量高峰冲垮。为了避免此类情况发生,我们都需要根据系统的处理能力对请求流量进行控制,这就是我们常说的“流量控制”,简称“流控”。
Sentinel 作为一种轻量级高可用流量控制组件,流量控制是它最主要的工作之一。
我们可以针对资源定义流控规则,Sentinel 会根据这些规则对流量相关的各项指标进行监控。当这些指标当达到或超过流控规则规定的阈值时,Sentinel 会对请求的流量进行限制(即“限流”),以避免系统被瞬时的流量高峰冲垮,保障系统的高可用性。
Sentinel 触发流控限流时,资源会抛出 BlockException 异常,此时我们可以定义blockHandler捕捉 BlockException 来自定义被限流之后的处理逻辑。

2.流控规则定义

详细规则参考:点击这里

属性 说明 默认值
资源名 流控规则的作用对象。 -
阈值 流控的阈值。 -
阈值类型 流控阈值的类型,包括 QPS 或并发线程数。 QPS
针对来源 流控针对的调用来源。 default,表示不区分调用来源
流控模式 调用关系限流策略,包括直接、链路和关联。 直接
流控效果 流控效果(直接拒绝、Warm Up、匀速排队),不支持按调用关系限流。 直接拒绝

3.Sentinel流控参数讲解

1.阈值类型

  1. QPS(默认):定义的资源每秒的请求量达到阈值以后,进行限流
  2. 线程数:请求定义资源的线程数到达阈值以后,进行限流

    2.流控模式

  3. 直接(默认):直接控制当前资源,适用于大多数应用场景。

  4. 关联:当关联的资源达到阈值后,限流当前资源。核心是保护关联资源。例如用于读写分离保护写接口操作。
  5. 链路:设置指定入口资源请求当前资源达到阈值时,限流当前资源。用于限流请求链路。可用于不同服务请求共有服务,限流其中的部分服务。

    3.流控效果

  6. 快速失败(默认):请求到达阈值后,后续请求直接直接拒绝,抛出BlockException异常。可通过设置BlockHandler来进行异常捕获后的友好返回。适用于大多数应用场景

  7. warm up:预热模式。请求阈值会在规定的预热时间内逐步增加到规定的请求阈值,请求到达阈值后,后续请求直接直接拒绝,抛出BlockException异常。初始请求阈值为threshold / coldFactor。例如设置预热时间为5s,QPS(threshold)为10,coldFactor初始值为3,那么也就是在5s内,系统允许的最大请求阈值从3增加到10。通常用于保护冷系统面对瞬时高并发流量来进行一个有预热时间的启动,防止瞬间流量打垮系统。底层是基于令牌桶算法实现。
  8. 排队等待:请求到达阈值后,后续的请求会进入队列中等待,如果等待时间超出了最大等待时间,会抛出异常,请求被拒绝。

    4.Sentinel流控的实现

    1.定义资源

    1. @GetMapping
    2. @SentinelResource(value = "get-sentinel-service")
    3. public String get(@RequestParam String param) {
    4. return "sentinel-service查询结果";
    5. }

    2.控制台配置流控规则

    先模拟配置QPS=1
    image.png

    3.定义资源限流方法

    1. @GetMapping
    2. @SentinelResource(
    3. value = "get-sentinel-service",
    4. blockHandler = "get",
    5. blockHandlerClass = BlockHandlerAll.class
    6. )
    7. public String get(@RequestParam String param) {
    8. return "sentinel-service查询结果";
    9. }
    ```java import com.alibaba.csp.sentinel.slots.block.BlockException;

/**

  • @author 冯铁城 [fengtiecheng@cyou-inc.com]
  • @date 2022-06-07 10:59:12
  • @describe: */ public class BlockHandlerAll {

    /**

    • get方法对应的限流方法 *
    • @param param get方法参数
    • @param e BlockException异常
    • @return 返回值 */ public static String get(String param, BlockException e) { return “服务限流,请稍后尝试”; } } ```

      4.触发请求测试

      多次请求后触发限流方法
      image.png