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设置的值
相关推荐
攸攸太上3 小时前
JMeter学习
java·后端·学习·jmeter·微服务
妍妍的宝贝4 小时前
k8s 中微服务之 MetailLB 搭配 ingress-nginx 实现七层负载
nginx·微服务·kubernetes
架构师吕师傅6 小时前
性能优化实战(三):缓存为王-面向缓存的设计
后端·微服务·架构
王彬泽8 小时前
【微服务】服务注册与发现、分布式配置管理 - Nacos
微服务·服务注册与发现·分布式配置管理
攸攸太上18 小时前
Spring Gateway学习
java·后端·学习·spring·微服务·gateway
一直在进步的派大星21 小时前
Docker 从安装到实战
java·运维·docker·微服务·容器
Gogeof1 天前
云原生化 - 基础镜像(简约版)
微服务·云原生·基础镜像
Gogeof1 天前
云原生化 - 旅程(简约版)
微服务·云原生
王彬泽1 天前
【微服务】负载均衡 - LoadBalance(day4)
微服务·负载均衡
编程老船长1 天前
第24章 Spring Boot RESTful API安全防护:JWT认证实战
spring boot·后端·微服务