SpringCloudAlibaba微服务实战系列(五)Sentinel1.8.5+Nacos持久化

Sentinel数据持久化

前面介绍Sentinel的流控、熔断降级等功能,同时Sentinel应用也在面临着一个问题:我们在Sentinel后台管理界面中配置了一堆流控、降级规则,但是Sentinel一重启,这些规则全部消失了。那么我们就要考虑Sentinel的持久化问题。

Sentinel为我们提供了几种持久化的解决方案:

  • 存储到文件
  • 使用Redis存储
  • 使用Nacos存储
  • 使用Zookeeper存储
  • 使用Apollo存储

我们这里采用Nacos的方式进行存储这些数据。

Tip:既然使用Nacos进行持久化这些Sentinel规则数据,那么你的Nacos首先肯定是已经具备了持久化的环境的~~

实现持久化

pom.xml文件加入Nacos数据源的依赖

xml 复制代码
<!-- sentinel持久化访问Nacos的数据源依赖 -->
<dependency>
    <groupId>com.alibaba.csp</groupId>
    <artifactId>sentinel-datasource-nacos</artifactId>
</dependency>

修改bootstrap.yml文件,增加datasource的配置

yml 复制代码
server:
  port: 9001
spring:
  application:
    name: consumer # 应用名

  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848 # nacos服务地址
    sentinel:
      transport:
        port: 8719 # 启动http server,并且该服务与Sentinel仪表板进行交互,使sentinel可以控制应用,若端口占用则8719+1依次扫描
        dashboard: 127.0.0.1:8080 # 仪表版访问地址
      datasource: # sentinel数据源
        ds1:	# 自定义连接名
          nacos:
            server-addr: localhost:8848 # nacos服务地址
            dataId: sentinel-consumer-ds1 # nacos的dataId
            groupId: DEFAULT_GROUP # 默认分组
            data-type: json # 数据类型 json类型
            rule-type: flow # flow表示流控规则

rule-type中的值,可以参考RuleType枚举类

五种规则持久化到Nacos中

  • authority(授权规则)
  • degrade(降级规则)
  • flow(流控规则)
  • param(热点规则)
  • system(系统规则)

当你的rule-type没设置时,程序启动时会报空指针异常

在Nacos的控制面板新建sentinel-consumer-ds1的DataId,具体配置内容如下:

json 复制代码
[
    {
        "resource":"/sentinelTestB",
        "limitApp":"default",
        "grade": 1,
        "count": 1,
        "strategy": 0,
        "controlBehavior": 0,
        "clusterMode": false
    }
]

首先在Nacos后台管理界面上配置DataId和GroupId一定是和配置文件中一一对应的,json中[]表示可以配置多个

  • resource:表示资源名称
  • limitApp:表示要限制哪些来源的调用
  • grade:阈值类型,取值参考RuleConstant类(0--线程数限流 1--QPS限流)
  • count:表示限流阈值
  • strategy:表示流控模式,0表示直接,1表示关联,2表示链路
  • controlBehavior:流控效果(0表示快速失败,1表示Warm Up,2表示排队等待)

那么这些参数,不同的规则该设置哪些参数呢,可以去参考某些规则类查看

  • 流控规则:FlowRule

  • 熔断降级:DegradeRule

    字段 说明 默认值
    resource 资源名,即规则的作用对象
    grade 熔断策略,支持慢调用比例/异常比例/异常数策略 慢调用比例
    count 慢调用比例模式下为慢调用临界 RT(超出该值计为慢调用);异常比例/异常数模式下为对应的阈值
    timeWindow 熔断时长,单位为 s
    minRequestAmount 熔断触发的最小请求数,请求数小于该值时即使异常比率超出阈值也不会熔断(1.7.0 引入) 5
    statIntervalMs 统计时长(单位为 ms),如 60*1000 代表分钟级(1.8.0 引入) 1000 ms
    slowRatioThreshold 慢调用比例阈值,仅慢调用比例模式有效(1.8.0 引入)
  • 热点规则:ParamFlowRule

    字段 说明 默认值
    resource 资源名,即规则的作用对象
    grade 限流模式 QPS 模式
    count 限流阈值,必填
    durationInSec 统计窗口时间长度(单位为秒),1.6.0 版本开始支持 1s
    controlBehavior 流控效果(支持快速失败和匀速排队模式),1.6.0 版本开始支持 快速失败
    maxQueueingTimeMs 最大排队等待时长(仅在匀速排队模式生效),1.6.0 版本开始支持 0
    paramIdx 热点参数的索引,必填,对应 SphU.entry(xxx, args) 中的参数索引位置
    paramFlowItemList 参数例外项,可以针对指定的参数值单独设置限流阈值,不受前面 count 阈值的限制。仅支持基本类型和字符串类型

这些json的规则除了可以在Sentinel控制面板控制之外,还可以用Java代码的方式,但是不够灵活。

配置好上面的属性后,使用Jmeter请求/sentinelTestB接口,测试流控效果。

可以看到,流控已经生效了。再到sentinel仪表板中看下:

已经生成好了一个流控规则。

再来试试降级规则

bootstrap.yml中增加ds2数据源

yml 复制代码
server:
  port: 9001
spring:
  application:
    name: consumer # 应用名

  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848 # nacos服务地址
    sentinel:
      transport:
        port: 8719 # 启动http server,并且该服务与Sentinel仪表板进行交互,使sentinel可以控制应用,若端口占用则8719+1依次扫描
        dashboard: 127.0.0.1:8080 # 仪表版访问地址
      datasource: # sentinel数据源
        ds1:
          nacos:
            server-addr: localhost:8848 # nacos服务地址
            dataId: sentinel-consumer-ds1 # nacos的dataId
            groupId: DEFAULT_GROUP # 默认分组
            data-type: json # 数据类型 json类型
            rule-type: flow # flow表示流控规则
        ds2:
          nacos:
            server-addr: localhost:8848 # nacos服务地址
            dataId: sentinel-consumer-ds2 # nacos的dataId
            groupId: DEFAULT_GROUP # 默认分组
            data-type: json # 数据类型 json类型
            rule-type: degrade # degrade表示降级规则

nacos面板中添加sentinel-consumer-ds2文件

json 复制代码
[
    {
        "resource":"/sentinelTest",
        "count":1,
        "grade":2,
        "timeWindow":5,
        "minRequestAmount":1
    }
]
  • timeWindow:表示时间窗口,熔断的时间数。
  • count:阈值
  • grade:降级策略,参考RuleConstant类(0-RT 1-异常比例 2-异常数)

以上配置,我们的/sentinelTest模拟一个异常,然后用Jmeter多次请求

进入熔断降级。

最后再来看下系统规则的一个实例

bootstrap.yml中

yml 复制代码
server:
  port: 9001
spring:
  application:
    name: consumer # 应用名

  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848 # nacos服务地址
    sentinel:
      transport:
        port: 8719 # 启动http server,并且该服务与Sentinel仪表板进行交互,使sentinel可以控制应用,若端口占用则8719+1依次扫描
        dashboard: 127.0.0.1:8080 # 仪表版访问地址
      datasource: # sentinel数据源
        ds1:
          nacos:
            server-addr: localhost:8848 # nacos服务地址
            dataId: sentinel-consumer-ds1 # nacos的dataId
            groupId: DEFAULT_GROUP # 默认分组
            data-type: json # 数据类型 json类型
            rule-type: flow # flow表示流控规则
        ds2:
          nacos:
            server-addr: localhost:8848 # nacos服务地址
            dataId: sentinel-consumer-ds2 # nacos的dataId
            groupId: DEFAULT_GROUP # 默认分组
            data-type: json # 数据类型 json类型
            rule-type: degrade # degrade表示降级规则

        ds3:
          nacos:
            server-addr: localhost:8848 # nacos服务地址
            dataId: sentinel-consumer-ds3 # nacos的dataId
            groupId: DEFAULT_GROUP # 默认分组
            data-type: json # 数据类型 json类型
            rule-type: system # system表示系统规则

在nacos中新增 ds3的,sentinel-consumer-ds3文件

json 复制代码
[
    {
        "qps":1
    }
]

系统规则对应的是SystemRule类,有以下几个属性:

  • avgRt:系统平均响应时间
  • highestCpuUsage:CPU使用率
  • highestSystemLoad:负载
  • maxThread:最大线程数
  • qps:每秒处理的请求数量

新增一个/sentinelTestC的资源,然后使用Jmeter压测一下,系统规则是系统级别的,即相对于资源的流控是比较粗粒度的了。

同样地,其他的规则,可以找到它对应的Java配置方法,找到那个类,举一反三,将对应的配置修改一下就可以了。

有两个点需要注意下:

  • 在Nacos控制台修改规则,Sentinel这边的规则会即时生效,重启服务后依然是有效的,毕竟已经做好持久化了
  • 在Sentinel控制台修改的规则,不会被修改到nacos中,重启后还会变为nacos设置的值
相关推荐
oMcLin6 小时前
如何在 Ubuntu 22.10 上通过 Kubernetes 和 Helm 管理微服务应用,简化跨平台电商平台的自动化部署?
ubuntu·微服务·kubernetes
qq_3181215913 小时前
互联网大厂Java面试故事:支付与金融服务微服务架构、消息队列与AI风控全流程解析
java·spring boot·redis·微服务·kafka·支付系统·金融服务
vivo互联网技术17 小时前
vivo 微服务架构实践之 Dubbo 性能优化
java·后端·微服务·中间件·dubbo
用户21903265273518 小时前
Spring Boot Admin终极监控方案:从零搭建企业级微服务监控平台,含高可用集群配置
spring boot·微服务·监控
悟道|养家18 小时前
微服务扇出:网络往返时间的影响与优化实践(5)
网络·微服务
智能化咨询19 小时前
(122页PPT)数字化架构演进和治理(附下载方式)
微服务·云原生·架构
老蒋每日coding19 小时前
驾驭并发之力:Go语言构建高可用微服务完全指南
开发语言·微服务·golang
萧曵 丶19 小时前
微服务集成「分布式事务」
分布式·微服务·架构
进击的小菜鸡dd20 小时前
互联网大厂Java面试:微服务、电商场景下的全栈技术问答与解析
java·spring boot·缓存·微服务·消息队列·日志·电商