服务端开发(9) 基于Sentinel的流控与熔断
2023-08-09 14:53:19 # NJU # 服务端开发

1. Sentinel

Sentinel组成

  • 核心库(Java 客户端):不依赖任何框架/库,能够运行于 Java 8 及以上的版本的运行时环境,同时对 Dubbo / Spring Cloud 等框架也有较好的支持
  • 控制台(Dashboard):Dashboard 主要负责管理推送规则、监控、管理机器信息等

image-20230408151555033

控制台不维护规则,仅会通过端口查看

2. 使用步骤

  1. 定义资源
    • 代码直接定义
    • 使用注解定义
    • 自动定义
  2. 定义规则
    • 流量控制规则
    • 熔断降级规则
    • 系统保护规则
    • 来源访问控制规则
    • 热点参数规则
  3. 查看效果
    • 日志
    • Dashboard

定义资源

  • 资源是 Sentinel 的关键概念。它可以是 Java 应用程序中的任何内容,例如,由应用程序提供的服务,或由应用程序调用的其它应用提供的服务,甚至可以是一段代码

  • 只要通过 Sentinel API 定义的代码,就是资源,能够被 Sentinel 保护起来。大部分情况下,可以使用方法签名,URL,甚至服务名称作为资源名来标示资源

image-20230408152504931

定义规则

  • 围绕资源的实时状态设定的规则,可以包括流量控制规则、熔断降级规则以及系统保护规则。所有规则可以动态实时调整

image-20230408152626363

  • 规则的种类
    • 流量控制规则
    • 熔断降级规则
    • 系统保护规则(CPU、内存占用等)
    • 来源访问控制规则(客户端来源)
    • 热点参数规则(依据请求的某一个参数来做限定)

查看效果

  • QPS一般指每秒查询率。每秒查询率(QPS,Queries-per-second)是对一个特定的查询服务器在规定时间内所处理流量多少的衡量标准
  • 日志路径:C:\Users\14669\logs\csp\com-alibaba-csp-sentinel-demo-flow-FlowQpsDemo-metrics.log.2023-04-08

  • —timestamp-|———date time——|—resource—|p|block|s|e|rt

    • p 代表通过的请求, block 代表被阻止的请求, s 代表成功执行完成的请求个数, e 代表用户自定义的异常, rt 代表平均响应时长

image-20230408155015781

3. 简单的例子

@SentinelResource 注解(基于Spring Boot)

Sentinel 控制台

  • 文档:https://sentinelguard.io/zh-cn/docs/dashboard.html
  • 配置控制台的参数传入

    • java -Dcsp.sentinel.dashboard.server=www.sentinel.com:80 ......
    • mvn spring-boot:run -Dspring-boot.run.jvmArguments="-Dcsp.sentinel.dashboard.server=www.sentinel.com:80"
  • 配置应用的端口号

    • 应用默认端口号:8719
    • csp.sentinel.api.port=8719

4. 限流

  • 限流的直接表现是在执行 Entry nodeA = SphU.entry(资源名字) 的时候抛出 FlowException 异常
  • FlowException 是 BlockException 的子类,您可以捕捉 BlockException 来自定义被限流之后的处理逻辑
  • 一条限流规则主要由下面几个因素组成,我们可以组合这些元素来实现不同的限流效果
    • resource:资源名,即限流规则的作用对象
    • count: 限流阈值
    • grade: 限流阈值类型,QPS 或线程数
    • strategy: 根据调用关系选择策略

并发线程数流量控制

  • 线程数限流用于保护业务线程数不被耗尽
  • Sentinel线程数限流不负责创建和管理线程池,而是简单统计当前请求上下文的线程个数,如果超出阈值,新的请求会被立即拒绝

  • 代码:Sentinel\sentinel-demo\sentinel-demo-basic\..\flow\FlowThreadDemo.java

QPS流量控制

  • 当QPS超过任意规则的阈值后,新的请求就会被立即拒绝,拒绝方式为抛出 FlowException
  • 代码:Sentinel\sentinel-demo\sentinel-demo-basic\..\flow\FlowQpsDemo.java

5. 熔断降级

image-20230408160644672

熔断策略—慢调用比例 (SLOW_REQUEST_RATIO)

  • 代码:Sentinel\sentinel-demo\sentinel-demo-basic\..\degrade\SlowRatioCircuitBreakerDemo.java

  • 设置RT(最大的响应时间),用于判断慢调用

image-20230408160732639

熔断策略—异常比例 (ERROR_RATIO)

  • 代码:Sentinel\sentinel-demo\sentinel-demo-basic\..\degrade\ExceptionRatioCircuitBreakerDemo.java

  • 异常比率的阈值范围是 [0.0, 1.0],代表 0% - 100%。

image-20230408160803154

熔断策略—异常数 (ERROR_COUNT)

image-20230408160814319

6. Spring Cloud Alibaba Sentinel

注册 DataSource

  • 目前支持file、nacos、zk、apollo、redis 这 5 种类型
  • FileRefreshableDataSource 和 NacosDataSource
  • nacos需要添加依赖sentinel-datasource-nacos

image-20230408160946106

服务部署

image-20230408161036130

演示内容