1.为什么需要持久化

通常情况下,使用sentinel都是sentinel控制台与sentinel核心库(客户端)搭配使用。我们在控制台定义流控。熔断等类别的规则,客户端拉取规则进实现。
但是有一个核心问题,拉取的规则都被存在了内存中。也就是说一旦服务重启,规则就消失了。但是部署到线上这种问题是绝不能出现的,因此就有了规则持久化的需求

2.持久化思路

内存持久化模式(默认)

sentinel默认使用的持久化模式。数据保存在内存中。服务重启后,内容消失

pull模式

pull模式下,我们需要引入一个第三方的存储中心。将规则信息保存到第三方的存储中心,客户端从第三方存储中心拉取数据。
可以使用Apoll,Nacos,Zookeeper等作为第三方存储中心。为了适配spring-cloud-albaba的生态,这里使用nacos的配置中心特性,来作为第三方的存储中心
所有规则的变更都是通过第三方存储中心实现,控制台只做一个查询展示的作用

push模式

image.png

  1. 控制台将规则推送到Nacos或其他远程配置中心。Sentinel客户端链接Nacos,获取规则配置;并监听Nacos配置变化,如发生变化,就更新本地缓存(从而让本地缓存总是和Nacos一致)
  2. 控制台监听Nacos配置变化,如发生变化就更新本地缓存(从而让控制台本地缓存总是和Nacos一致)

所有规则的变更可以通过控制台或第三方存储中心实现。控制台可实现配置变更以及配置的实时查询

3.push模式持久化步骤

点击这里参考

4.pull模式持久化步骤

引入依赖

  1. <!--Sentinel持久化 依赖-->
  2. <dependency>
  3. <groupId>com.alibaba.csp</groupId>
  4. <artifactId>sentinel-datasource-nacos</artifactId>
  5. </dependency>

定义资源

  1. @GetMapping
  2. @SentinelResource(value = "getNoParam",blockHandler = "getHandler")
  3. public String get() {
  4. ServiceInstance choose = loadBalancerClient.choose("service-provider");
  5. String url = "http://" + choose.getHost() + ":" + choose.getPort() + "/api/v1/provider";
  6. return restTemplate.getForObject(url, String.class);
  7. }

Nacos添加配置

具体配置如图
image.png
配置说明

  1. DataID:个人习惯通常用sentinel-{规则类型}-rule
  2. Group:SENTINEL_GROUP(符合命名规范即可)
  3. 描述:对配置进行一个描述说明
  4. 配置内容:配置内容的讲解放在文末

    1. [
    2. {
    3. "resource": "getNoParam",
    4. "limitApp": "default",
    5. "grade": "1",
    6. "count": "1",
    7. "strategy": "0",
    8. "controlBehavior": "0",
    9. "clusterMode": false
    10. }
    11. ]

    修改yml文件

    可通过spring.cloud.sentinel.datasource来配置nacos持久化

    1. spring:
    2. application:
    3. name: service-discover
    4. cloud:
    5. nacos:
    6. discovery:
    7. server-addr: 8.142.132.135:8848 #服务注册到nacos注册中心的地址
    8. sentinel:
    9. eager: true #Sentinel开启饿汉式加载
    10. transport:
    11. dashboard: localhost:2222 #Sentinel控制台地址
    12. port: 8719 #Sentine客户端暴露给控制台的端口。默认8719端口,假如被占用会自动从8719开始依次+1扫描,直至找到未被占用的端口
    13. datasource:
    14. flow-rule: #自定义数据源名称
    15. nacos:
    16. server-addr: ${spring.cloud.nacos.discovery.server-addr} #nacos配置中心地址
    17. dataId: sentinel-flow-rule #nacos配置dataId参数
    18. groupId: SENTINEL_GROUP #nacos配置groupId参数
    19. data-type: json #nacos配置data-type参数
    20. rule_type: flow #定义规则类型为流控规则

    验证

    重启后,配置规则依然存在
    image.png
    请求验证,触发流控逻辑
    image.png

    5.rule_type字段类型说明

    rule_type字段具体可查看:com.alibaba.cloud.sentinel.datasource.RuleType

  5. flow:流控规则

  6. degrade:熔断(降级)规则
  7. param-flow:热点规则
  8. authority:授权规则
  9. system:系统规则

    6.不同规则参数说明

    flow(流控规则)

    流控规则具体参数可参考:com.alibaba.csp.sentinel.slots.block.flow.FlowRule

  10. resource:资源名

  11. limitApp:针对来源,默认default
  12. grade:阈值类型:0-线程数,1-QPS
  13. count:单机阈值
  14. strategy:流控模式,0-直接,1-关联,2-链路
  15. controlBehavior:流控效果,0-快速失败,1-warmup,2-排队等候
  16. clusterMode:是否集群

流控规则示例

  1. [
  2. {
  3. "resource": "getNoParam",
  4. "limitApp": "default",
  5. "grade": "1",
  6. "count": "1",
  7. "strategy": "0",
  8. "controlBehavior": "0",
  9. "clusterMode": false
  10. }
  11. ]

degrade(熔断降级规则)

熔断(降级规则)具体参数可参考:com.alibaba.csp.sentinel.slots.block.degrade.DegradeRule

  1. resource:资源名
  2. statIntervalMs:统计时间(单位为 ms),默认值1000ms
  3. minRequestAmount:最小请求数。在统计时间内,请求数需超过最小请求数才有可能触发熔断
  4. grade:熔断策略 0-慢调用比例,1-异常比例,2-异常数量
  5. count:慢调用比例模式下为慢调用临界 RT(超出该值计为慢调用);异常比例/异常数模式下为对应的阈值
  6. slowRatioThreshold:慢调用比例阈值,仅慢调用比例模式有效
  7. timeWindow:熔断时长,单位为 s

慢调用比例-熔断策略配置-示例

  1. [
  2. {
  3. "resource": "getNoParam",
  4. "statIntervalMs": 1000,
  5. "minRequestAmount": 1,
  6. "grade": 0,
  7. "count": 3000,
  8. "slowRatioThreshold": 0.5,
  9. "timeWindow": 5
  10. }
  11. ]

异常比例-熔断策略配置-示例

  1. [
  2. {
  3. "resource": "getNoParam",
  4. "statIntervalMs": 1000,
  5. "minRequestAmount": 1,
  6. "grade": 1,
  7. "count": 0.5,
  8. "slowRatioThreshold": 0.5,
  9. "timeWindow": 5
  10. }
  11. ]

异常数-熔断策略配置-示例

  1. [
  2. {
  3. "resource": "getNoParam",
  4. "statIntervalMs": 1000,
  5. "minRequestAmount": 1,
  6. "grade": 2,
  7. "count": 100,
  8. "slowRatioThreshold": 0.5,
  9. "timeWindow": 5
  10. }
  11. ]

param-flow(热点规则)

热点规则具体参数可参考:com.alibaba.csp.sentinel.slots.block.flow.param.ParamFlowRule

  1. resource:资源名
  2. durationInSec:统计时长,单位秒,默认为1s
  3. grade:0-线程数 1-QPS(默认)
  4. paramIdx:参数索引,当前参数属于资源的第几个参数,默认从0开始
  5. count:限流阈值
  6. controlBehavior:限流策略 0-直接拒绝(默认)2-匀速
  7. maxQueueingTimeMs:请求队列等待时间,只有当controlBehavior=2时有效
  8. burstCount:应对突发流量额外允许的数量
  9. paramFlowItemList:额外参数项,可制定特殊参数限流
  10. clusterMode:是否为集群模式,默认false
  11. clusterConfig:集群限流配置

格外参数项参数参考

  1. classType:参数类型,包括byte、int、long、float、double、char、java.lang.String
  2. count:限流阈值
  3. object:额外参数项具体值

无参数额外项热点规则示例

  1. [
  2. {
  3. "resource":"getNoParam2",
  4. "durationInSec":1,
  5. "grade":1,
  6. "paramIdx":0,
  7. "count":1,
  8. "controlBehavior":0,
  9. "burstCount":0,
  10. "clusterMode":false
  11. }
  12. ]

有参数额外项热点规则示例

  1. [
  2. {
  3. "resource":"getNoParam2",
  4. "durationInSec":1,
  5. "grade":1,
  6. "paramIdx":0,
  7. "count":1,
  8. "controlBehavior":0,
  9. "burstCount":0,
  10. "clusterMode":false,
  11. "paramFlowItemList":[
  12. {
  13. "classType":"java.lang.String",
  14. "count":10,
  15. "object":"ftc"
  16. }
  17. ]
  18. }
  19. ]

authority(授权规则)

授权规则具体可参考:com.alibaba.csp.sentinel.slots.block.authority.AuthorityRule

  1. resource:资源名
  2. limitApp:请求来源
  3. strategy:授权策略 0-白名单(默认) 1-黑名单

白名单规则示例

  1. [
  2. {
  3. "resource":"getById",
  4. "limitApp":"ftc",
  5. "strategy":"0"
  6. }
  7. ]

黑名单规则示例

  1. [
  2. {
  3. "resource":"getById",
  4. "limitApp":"ftc",
  5. "strategy":"1"
  6. }
  7. ]