avatar

SpringCloud Alibaba 之 Sentinel(二)
**Sentinel是面向分布式服务架构的轻量级流量控制组件,主要以流量为切入点,从限流、流量整形、服务降级、系统负载保护等多个维度来帮助我们保障微服务的稳定性。**

1、Sentinel的特性

  • 丰富的应用场景
  • 实时监控
  • 开源生态支持
  • SPI扩展点支持

2、Sentinel的组成

  • 核心库:不依赖任何框架/库,能够运行于所有JAVA运行时环境,同时对Dubbo、Spring Cloud 等框架也有较好的支持。
  • 控制台:基于Spring Boot开发,打包后可以直接运行,不需要额外的Tomcat等应用容器。

3、Sentinel Dashboard的部署

4、Sentinel的基本应用

4.1、实现限流的简单demo

引入Sentinel核心库

1
2
3
4
5
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-core</artifactId>
<version>1.7.1</version>
</dependency>

示例代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
private static void doSomeThing(){
try(Entry entry = SphU.entry("doSomething")){ //定义一个资源来实现流控的逻辑,当请求进入 doSomething方法时,需要进行限流判断
// 业务逻辑处理
System.out.println("hello world");
} catch (BlockException e) {
e.printStackTrace();
}
}

private static void initFlowRules(){ // 制定限流规则
List<FlowRule> rulesList = new ArrayList<>();
FlowRule flowRule = new FlowRule();
flowRule.setResource("doSomething"); // 设置需要保护的资源
flowRule.setGrade(RuleConstant.FLOW_GRADE_QPS); //限流阈值类型 QPS模式或并发线程数模式
flowRule.setCount(20); //限流阈值
rulesList.add(flowRule);
FlowRuleManager.loadRules(rulesList);
}

public static void main(String[] args) {
initFlowRules();
while (true){
doSomeThing();
}
}
4.2、资源的定义方式
  • // 通过抛出异常的方式来定义一个资源,会抛出一个BlockException异常
    try(Entry entry = SphU.entry("resourceName")){ // resourceName可以定义为方法名称、接口名称或其他唯一标识
        // 被保护的业务逻辑
    }catch(BlockException e){
        // 被限流
    }
    <!--2-->
  •  // 注意: blockHandler所配置的值blockHandlerForUser会在触发限流之后调用,这个方法必须和原始方法getUserById的返回值、参数保持一致,而且需要增加BlockException参数
    @SentinelResource(value = "resourceName",blockHandler = "blockHandlerForUser")     
    public void getUserById(String id){
       // 业务逻辑
    }
    
    public void blockHandlerForUser(String id, BlockException e){
      // 被限流后的处理方法
    }
    <!--3-->
    
4.3.1、基于并发数和QPS的流量控制
  • 并发线程数(FLOW_GRADE_THREAD)
  • QPS (FLOW_GRADE_QPS)

并发线程数:并发线程数限流用来保护业务线程不被耗尽;Sentinel并发线程数限流就是统计当前请求的上下文线程数量,如果超出阈值,新的请求就会被拒绝。

QPS:QPS表示每秒的查询数,也就是一台服务器每秒能够响应的查询次数,当QPS达到限流的阈值时,就会触发限流策略。

4.3.2、QPS流量控制行为
  • 直接拒绝 (CONTROL_BEHAVIOR_DEFAULT);

    默认的流量控制方式,也就是请求流量超出阈值时,直接抛出一个FlowException

  • Warm Up(CONTROL_BEHAVIOR_WARM_UP);

    是一种冷启动方式,请求处理的数量逐步递增,并在一个预期时间之后达到允许处理请求的最大值。

  • 匀速排队 (CONTROL_BEHAVIOR_RATE_LIMITER);

    严格控制请求通过的间隔时间,让请求以匀速的速度通过,相当于前面讲的漏桶限流算法。

  • 冷启动 + 匀速排毒 (CONTROL_BEHAVIOR_WARM_UP_RATE_LIMITER);

4.3.3、调用关系流量策略

调用关系包括调用方和被调用方,调用关系流量策略就是根据不同的维度来触发流量控制。

  • 根据调用方限流

    根据请求来源进行流量控制,我们需要设置limitApp属性来设置来源信息,他有三个选项

    1. default:表示不区分调用者,也就是任何访问调用者的请求都会进行限流统计。
    2. {some_origin_name}:设置特定的调用者,只有来自这个调用者的请求才会进行流量统计和控制。
    3. other:表示针对除{some_origin_name}外的调用者进行流量控制。

    由于同一个资源可以设置多个规则,规则的生效顺序为:{some_origin_name} →other→default

  • 根据调用链路入口限流

    只根据某个路口来进行流量统计

  • 具有关系的资源流量控制关联流量控制

    当两个资源之间存在依赖关系,我们就说这两个资源存在关联,关联流量控制就是限制其中一个资源的执行流量。

4.4、Sentinel实现服务熔断
1
2
3
4
5
6
7
8
9
10
11
private static void initDegradeRule(){
List<DegradeRule> rules = new ArrayList<>();
DegradeRule degradeRule = new DegradeRule();
degradeRule.setResource("KEY");
degradeRule.setCount(10);
degradeRule.setGrade(RuleConstant.DEGRADE_GRADE_RT); // 熔断策略,支持秒级RT、秒级异常比例、分钟级异常数。默认是秒级RT。
degradeRule.setTimeWindow(10); // 熔断降级的时间窗口,单位为s。也就是触发熔断降级后多长时间内自动熔断。
degradeRule.setMinRequestAmount(5); // 触发的异常熔断最小请求数,请求数小于该值时即使异常比例超出阈值也不会触发熔断,默认值为5。
degradeRule.setRtSlowRequestAmount(5); // 在RT模式下,1s内持续多少个请求的平均RT超出阈值后触发熔断,默认值为5。
rules.add(degradeRule);
}

Sentinel提供三种熔断策略,对于不同策略,参数的含有也不相同。

  • 平均相应时间(RuleConstant.DEGRADE_GRADE_RT):

    如果1s内持续进入了5个请求,对应的平均响应时间都超过了阈值(count,单位ms),那么在接下来的时间窗口内(timeWindow,单位为s)内,对这个方法的调用都会自动熔断,抛出DegradeException

  • 异常比列(RuleConstant.DEGRADE_GRADE_EXCEPTION_RATIO):

    如果每秒资源数 ≥ minRequestAmount,并且每秒的异常总数占总通过量的比例超过阈值,则资源将进入降级状态。同样,在接下来的时间窗口内(timeWindow,单位为s)内,对这个方法的调用都会自动熔断

  • 异常数(RuleConstant.DEGRADE_GRADE_EXCEPTION_COUNT):

    当资源最近一分钟的异常数目超过阈值之后,会触发熔断。需要注意的是,如果timeWindow小于60s,则结束熔断状态后仍然可能再进入熔断状态

文章作者: Frosro
文章链接: https://frosro.github.io/2022/02/10/SpringCloudAlibaba%E4%B9%8BSentinel-2/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 BETTER LATE THAN NEVER
打赏
  • 微信
    微信
  • 支付宝
    支付宝

评论