前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。​​点击跳转到网站。​

上篇文章​​Spring Cloud Alibaba Sentinel 初体验​​介绍了Sentinel 的简单使用。在使用过程中我们发现在Sentinel 控制台中配置了规则之后,随着服务的重启,配置的规则也随之消失。Sentinel 控制台控制台默认是将这些规则保存在内存中,服务没了,规则也没了。试想一下如果我们配置了很多规划或者是因为某种原因服务挂掉了,那我们配置的数据也就丢失了,显然这不是我们想要的。

Sentinel将规则存储在文件、数据库或者配置中心当中,Sentinel默认提供的数据源有file、zookeeper、Redis、consul、apollo、nacos,当然也可以自己自定义数据源。

快速开始

下面就以nacos 做为数据源来演示一下Sentinel的限流规划持久化,项目还是沿用上一篇文章的。

分别启动nacos server 和 Sentinel控制台。

nacos如果没有安装可以查看​​windows系统 安装nacos服务注册与发现中心​

  1. 引入依赖
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>

<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-sentinel-datasource</artifactId>
</dependency>

<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-datasource-nacos</artifactId>
</dependency>

sentinel-datasource-nacos 不需要填写版本号,因为在spring-cloud-alibaba-sentinel-datasource已经配置了。

  1. 修改配置文件
server.port=8085
# 服务名
spring.application.name=SentinelProvider

#
spring.cloud.sentinel.transport.port=8719
# dashboard 地址
spring.cloud.sentinel.transport.dashboard=127.0.0.1:8080

spring.cloud.sentinel.datasource.flow_ds.nacos.server-addr=localhost:8848
spring.cloud.sentinel.datasource.flow_ds.nacos.data-id=sentinel_provider_flow_rule
spring.cloud.sentinel.datasource.flow_ds.nacos.group-id=SENTINEL_PROVIDER_GROUP
spring.cloud.sentinel.datasource.flow_ds.nacos.data-type=json
spring.cloud.sentinel.datasource.flow_ds.nacos.rule-type=flow

欲知配置的作用,请接着往下看

  1. 在nacos中配置规则
    nacos配置中心可以看这篇文章​​​SpringCloud Alibaba 2021版 nacos 配置中心教程​​​ 在nacos配置列表中发布如下配置:
    Spring Cloud Alibaba Sentinel 整合 nacos 进行规则持久化_Sentinel规则持久化

配置内容JSON:

[
{
"resource": "/provider/hello/{name}",
"controlBehavior": 0,
"count": 1,
"grade": 1,
"limitApp": "default",
"strategy": 0
}
]
  1. 测试

启动项目之后就会在访问Sentinel 控制台,在流控规则列表中就能看到我们在nacos中配置的流控规则

Spring Cloud Alibaba Sentinel 整合 nacos 进行规则持久化_限流_02

浏览器访问http://localhost:8085/provider/hello/Sentinel,连续刷新两次就能看到限流提示了。

Spring Cloud Alibaba Sentinel 整合 nacos 进行规则持久化_Sentinel 规则_03

这样Sentinel 整合 nacos进行规则持久化的一个简单示例就完成了。下面将介绍上述配置及一些规则配置的含义。

数据源配置

​SentinelProperties​​​ 内部提供了 ​​TreeMap​​​ 类型的 ​​datasource​​ 属性用于配置数据源信息。

比如配置 4 个数据源:

spring.cloud.sentinel.datasource.ds1.file.file=classpath: degraderule.json
spring.cloud.sentinel.datasource.ds1.file.rule-type=flow

#spring.cloud.sentinel.datasource.ds1.file.file=classpath: flowrule.json
#spring.cloud.sentinel.datasource.ds1.file.data-type=custom
#spring.cloud.sentinel.datasource.ds1.file.converter-class=com.alibaba.cloud.examples.JsonFlowRuleListConverter
#spring.cloud.sentinel.datasource.ds1.file.rule-type=flow

spring.cloud.sentinel.datasource.ds2.nacos.server-addr=localhost:8848
spring.cloud.sentinel.datasource.ds2.nacos.data-id=sentinel
spring.cloud.sentinel.datasource.ds2.nacos.group-id=DEFAULT_GROUP
spring.cloud.sentinel.datasource.ds2.nacos.data-type=json
spring.cloud.sentinel.datasource.ds2.nacos.rule-type=degrade

spring.cloud.sentinel.datasource.ds3.zk.path = /Sentinel-Demo/SYSTEM-CODE-DEMO-FLOW
spring.cloud.sentinel.datasource.ds3.zk.server-addr = localhost:2181
spring.cloud.sentinel.datasource.ds3.zk.rule-type=authority

spring.cloud.sentinel.datasource.ds4.apollo.namespace-name = application
spring.cloud.sentinel.datasource.ds4.apollo.flow-rules-key = sentinel
spring.cloud.sentinel.datasource.ds4.apollo.default-flow-rule-value = test
spring.cloud.sentinel.datasource.ds4.apollo.rule-type=param-flow

这种配置方式参考了 Spring Cloud Stream Binder 的配置,内部使用了 ​​TreeMap​​​ 进行存储,comparator 为 ​​String.CASE_INSENSITIVE_ORDER​​ 。

NOTE: d1, ds2, ds3, ds4 是 ​​ReadableDataSource​​​ 的名字,可随意编写。后面的 ​​file​​​ ,​​zk​​​ ,​​nacos​​​ , ​​apollo​​​ 就是对应具体的数据源,它们后面的配置就是这些具体数据源各自的配置。注意数据源的依赖要单独引入(比如 ​​sentinel-datasource-nacos​​)。

每种数据源都有3个共同的配置项: ​​data-type​​​、 ​​converter-class​​​ 以及 ​​rule-type​​。

​data-type​​​ 配置项表示 ​​Converter​​​ 类型,Spring Cloud Alibaba Sentinel 默认提供两种内置的值,分别是 ​​json​​​ 和 ​​xml​​​ (不填默认是json)。 如果不想使用内置的 ​​json​​​ 或 ​​xml​​​ 这两种 ​​Converter​​​,可以填写 ​​custom​​​ 表示自定义 ​​Converter​​​,然后再配置 ​​converter-class​​​ 配置项,该配置项需要写类的全路径名(比如 ​​spring.cloud.sentinel.datasource.ds1.file.converter-class=com.alibaba.cloud.examples.JsonFlowRuleListConverter​​)。

​rule-type​​​ 配置表示该数据源中的规则属于哪种类型的规则(​​flow​​​, ​​degrade​​​, ​​authority​​​, ​​system​​​, ​​param-flow​​​, ​​gw-flow​​​, ​​gw-api-group​​​)。注意网关流控规则 (GatewayFlowRule) 对应 ​​gw-flow​​。

NOTE: 当某个数据源规则信息加载失败的情况下,不会影响应用的启动,会在日志中打印出错误信息。

NOTE: 默认情况下,xml 格式是不支持的。需要添加 ​​jackson-dataformat-xml​​ 依赖后才会自动生效。

规则的种类

Sentinel 支持以下几种规则:流量控制规则熔断降级规则系统保护规则来源访问控制规则热点参数规则

流量控制规则

重要属性:

Field

说明

默认值

resource

资源名,资源名是限流规则的作用对象

count

限流阈值

grade

限流阈值类型,QPS 模式(1)或并发线程数模式(0)

QPS 模式

limitApp

流控针对的调用来源

​default​​,代表不区分调用来源

strategy

调用关系限流策略:直接(0)、链路(1)、关联(2)

根据资源本身(直接)

controlBehavior

流控效果(直接拒绝(0)/WarmUp(1)/匀速+排队等待(2)),不支持按调用关系限流

直接拒绝

clusterMode

是否集群限流

同一个资源可以同时有多个限流规则,检查规则时会依次检查。

对应Sentinel 控制台流控规则属性:

Spring Cloud Alibaba Sentinel 整合 nacos 进行规则持久化_spring_04

熔断降级规则 (DegradeRule)

熔断降级规则包含下面几个重要的属性:

Field

说明

默认值

resource

资源名,即规则的作用对象

grade

熔断策略,支持慢调用比例/异常比例/异常数策略

慢调用比例

count

慢调用比例模式下为慢调用临界 RT(超出该值计为慢调用);异常比例/异常数模式下为对应的阈值

timeWindow

熔断时长,单位为 s

minRequestAmount

熔断触发的最小请求数,请求数小于该值时即使异常比率超出阈值也不会熔断(1.7.0 引入)

5

statIntervalMs

统计时长(单位为 ms),如 60*1000 代表分钟级(1.8.0 引入)

1000 ms

slowRatioThreshold

慢调用比例阈值,仅慢调用比例模式有效(1.8.0 引入)

同一个资源可以同时有多个降级规则。

系统保护规则 (SystemRule)

Sentinel 系统自适应限流从整体维度对应用入口流量进行控制,结合应用的 Load、CPU 使用率、总体平均 RT、入口 QPS 和并发线程数等几个维度的监控指标,通过自适应的流控策略,让系统的入口流量和系统的负载达到一个平衡,让系统尽可能跑在最大吞吐量的同时保证系统整体的稳定性。

系统规则包含下面几个重要的属性:

Field

说明

默认值

highestSystemLoad

​load1​​ 触发值,用于触发自适应控制阶段

-1 (不生效)

avgRt

所有入口流量的平均响应时间

-1 (不生效)

maxThread

入口流量的最大并发数

-1 (不生效)

qps

所有入口资源的 QPS

-1 (不生效)

highestCpuUsage

当前系统的 CPU 使用率(0.0-1.0)

-1 (不生效)

注意:系统规则只针对入口资源(EntryType=IN)生效。

访问控制规则 (AuthorityRule)

很多时候,我们需要根据调用方来限制资源是否通过,这时候可以使用 Sentinel 的访问控制(黑白名单)的功能。黑白名单根据资源的请求来源(​​origin​​)限制资源是否通过,若配置白名单则只有请求来源位于白名单内时才可通过;若配置黑名单则请求来源位于黑名单时不通过,其余的请求通过。

授权规则,即黑白名单规则(​​AuthorityRule​​)非常简单,主要有以下配置项:

  • ​resource​​:资源名,即规则的作用对象
  • ​limitApp​​​:对应的黑名单/白名单,不同 origin 用​​,​​​ 分隔,如​​appA,appB​
  • ​strategy​​​:限制模式,​​AUTHORITY_WHITE​​​ 为白名单模式,​​AUTHORITY_BLACK​​ 为黑名单模式,默认为白名单模式

热点规则 (ParamFlowRule)

何为热点?热点即经常访问的数据。很多时候我们希望统计某个热点数据中访问频率最高的 Top K 数据,并对其访问进行限制。比如:

  • 商品 ID 为参数,统计一段时间内最常购买的商品 ID 并进行限制
  • 用户 ID 为参数,针对一段时间内频繁访问的用户 ID 进行限制

热点参数规则(​​ParamFlowRule​​​)类似于流量控制规则(​​FlowRule​​):

属性

说明

默认值

resource

资源名,必填

count

限流阈值,必填

grade

限流模式

QPS 模式

durationInSec

统计窗口时间长度(单位为秒),1.6.0 版本开始支持

1s

controlBehavior

流控效果(支持快速失败和匀速排队模式),1.6.0 版本开始支持

快速失败

maxQueueingTimeMs

最大排队等待时长(仅在匀速排队模式生效),1.6.0 版本开始支持

0ms

paramIdx

热点参数的索引,必填,对应 ​​SphU.entry(xxx, args)​​ 中的参数索引位置

paramFlowItemList

参数例外项,可以针对指定的参数值单独设置限流阈值,不受前面 ​​count​​ 阈值的限制。仅支持基本类型和字符串类型

clusterMode

是否是集群参数流控规则

​false​

clusterConfig

集群流控相关配置

参考文章:


​https://github.com/alibaba/spring-cloud-alibaba/wiki/Sentinel​​ https://github.com/alibaba/Sentinel/wiki/


能力一般,水平有限,如有错误,请多指出。如果对你有用点个关注给个赞呗