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

2023-11-07

上篇文章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配置列表中发布如下配置:
    在这里插入图片描述

配置内容JSON:

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

启动项目之后就会在访问Sentinel 控制台,在流控规则列表中就能看到我们在nacos中配置的流控规则
在这里插入图片描述
浏览器访问http://localhost:8085/provider/hello/Sentinel,连续刷新两次就能看到限流提示了。
在这里插入图片描述
这样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 的名字,可随意编写。后面的 filezknacos , apollo 就是对应具体的数据源,它们后面的配置就是这些具体数据源各自的配置。注意数据源的依赖要单独引入(比如 sentinel-datasource-nacos)。

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

data-type 配置项表示 Converter 类型,Spring Cloud Alibaba Sentinel 默认提供两种内置的值,分别是 jsonxml (不填默认是json)。 如果不想使用内置的 jsonxml 这两种 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 控制台流控规则属性:
在这里插入图片描述

熔断降级规则 (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/

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Spring Cloud Alibaba Sentinel 整合 nacos 进行规则持久化 的相关文章

  • 七:微服务调用组件Feign

    目录 JAVA 项目中如何实现接口调用 1 什么是Feign 1 1 优势 1 2 Feign的设计架构 1 3 Ribbon Feign对比 1 4 Feign单独使用 2 Spring Cloud Alibaba快速整合Feign 3
  • 【Nacos源码系列】Nacos心跳机制原理

    文章目录 心跳机制是什么 Nacos心跳机制 客户端心跳 服务端接收心跳 总结 前些天发现了一个巨牛的人工智能学习网站 通俗易懂 风趣幽默 忍不住分享一下给大家 点击跳转到网站 心跳机制是什么 心跳机制是一种用于监测和管理微服务可用性的机制
  • Nacos框架服务主动下线原理及源代码讲解

    原理 Nacos没有想eureka一样 在服务端提供API供调用进行服务下线 Nacos的实现方式是通过在客户端提供方法 我们自己封装API进行调用 然后客户端会进行2个步骤 1 如果是临时服务 客户端会把自己发送续约保活心跳的缓存实例给删
  • 基于Spring Cloud Alibaba 分布式微服务高并发数据平台化(中台)思想+多租户saas企业开发架构技术选型和设计方案

    基于Spring Cloud Alibaba 分布式微服务高并发数据平台化 中台 思想 多租户saas设计的企业开发架构 支持源码二次开发 支持其他业务系统集成 集中式应用权限管理 支持拓展其他任意子项目 架构源码可以加我WX haiwab
  • Nacos startup无反应,启动报错的解决办法

    今天在运行Nacos的时候遇见了点问题 记录一下 我的系统是win11 运行的Nacos版本是 2 0 3 https github com alibaba nacos releases tag 2 0 3 运行startup cmd 无反
  • Spring Cloud Alibaba Dubbo

    Spring Cloud Alibaba Dubbo 为什么 是什么 怎么做 为什么 单体应用 单体服务经过长期的迭代更新 逐渐走向代码臃肿 高耦合 这显然与我们软件开发设计理念高内聚 低耦合背道而驰 从而难以维护 市场需求也在逐渐要求服务
  • 系统架构演变历史及集群、分布式、微服务、SOA的概念区别

    文章目录 1 系统架构演变历史 1 单一应用架构 ORM 2 垂直应用架构 MVC 3 面向服务框架 SOA 4 微服务架构 1 微服务的特点 2 微服务主要解决的问题与场景 3 微服务的缺点 2 集群和分布式 微服务和soa概念和区别理解
  • Nacos入门

    1 简介 Nacos 致力于帮助您发现 配置和管理微服务 Nacos 提供了一组简单易用的特性集 帮助您快速实现动态服务发现 服务配置 服务元数据及流量管理 Nacos 帮助您更敏捷和容易地构建 交付和管理微服务平台 Nacos 是构建以
  • Spring Cloud Alibaba Sentinel 整合 nacos 进行规则持久化

    上篇文章Spring Cloud Alibaba Sentinel 初体验介绍了Sentinel 的简单使用 在使用过程中我们发现在Sentinel 控制台中配置了规则之后 随着服务的重启 配置的规则也随之消失 Sentinel 控制台控制
  • 【2023】Nacos下载与安装配置(2.2.3版本示例)

    目录 1 Nacos概述 2 下载地址和版本 2 修改配置文件 2 1 配置鉴定密钥 自定义密钥 2 2 配置数据库 3 启动 4 项目注册 4 1 配置yml文件 4 2 在启动类上加入注解 4 3 使用 bat文件启动 需要学习naco
  • Docker Portainer 安装与报错处理

    安装docker 管理器 Portainer 最近在看spring cloud alibaba的时候 觉得docker是肯定要用的 然后找了个管理的docker的东东 比较方便的查询docker的情况 直接看操作吧 root localho
  • seata server 1.6版本安装及配置

    文章目录 下载 安装并启动 数据库 导入数据库 修改配置文件 服务注册 配置中心 手动添加 脚本导入 前些天发现了一个巨牛的人工智能学习网站 通俗易懂 风趣幽默 忍不住分享一下给大家 点击跳转到网站 Seata 是一款开源的分布式事务解决方
  • SpringCloud Alibaba 教程

    SpringCloud Alibaba GitHub官方地址 https github com alibaba spring cloud alibaba blob master README zh md SpringCloud Alibab
  • Nacos的配置中心(简单案例搭建)

    动态更改配置参数 使用Nacos配置中心 一定先把Nacos给启动起来 不然会报错误 java lang IllegalStateException failed to req API nacos v1 ns service list af
  • 防止内卷和被潜规则,Spring Cloud Alibaba微服务架构实战派(上下册)|35岁程序员那些事

    目录 1 写书缘由 2 本书上册核心内容 2 1 Spring Cloud Alibaba基础实战 2 1 1 主要内容 2 1 2 MyBatis Plus实现多租户架构的核心原理 2 2 分布式服务治理 基于Nacos 2 2 1 主要
  • Sentinel做服务熔断与限流,服务能被监控,但是监控列表为空的问题思考

    首先我觉得 服务和Sentinel不在同一台机器上面 本身是能够正常监控的 只要保证两台机器能够在一个内网中 能够互相连通即可 我在学习Sentinel的时候 我盲目使用云服务器的docker拉取Sentinel镜像 但是我开启了服务后 服
  • 四、Arthas

    四 Arthas 1 安装 卸载 1 Arthas支持在Linux Unix Mac等平台上一键安装 请复制以下内容 并粘贴到命令行中 敲回车执行即可 curl L https arthas aliyun com install sh sh
  • 谷粒商城高级篇(36)——商品上架之上传数据到Elasticsearch

    商品上架之上传数据到Elasticsearch 功能需求分析 分析 怎么设计存储结构来保存数据 空间换时间 时间换空间 最终方案 存储结构 关于 nested 类型 商品上架功能实现 guimall common pom xml com x
  • spring cloud alibaba 学习(二十五)nacos 服务地址动态更新

    目录 前言 服务地址动态更新 前言 通过配置endpoint来实现服务地址的动态更新 服务地址动态更新 1 在 NacosConfigBootstrapConfiguration 创建 NacosConfigManager 的过程中 会创建
  • 微服务系列:Spring Cloud Alibaba 之 Sentinel 高级流控规则

    微服务系列 Spring Cloud Alibaba 之 Sentinel 基本流控规则 在上一篇中 我们学习完了 Sentinel 的基本流控规则 这篇我们来研究一下 Sentinel 的高级流控规则 话不多说 开始今天的学习 一 概述

随机推荐

  • linux设备管理之设备号与次设备号

    linux设备管理之主设备号与次设备号 jinzi 博客园 剽窃 过来的 记录下 以备查 主设备号和次设备号 一个字符设备或者块设备都有一个主设备号和次设备号 主设备号和次设备号统称为设备号 主设备号用来表示一个特定的驱动程序 次设备号用来
  • 使用 Python 对股票数据分析预测

    使用 Python 对股票数据分析预测 文章目录 使用 Python 对股票数据分析预测 目录索引 模块安装 股票数据获取 雅虎财经 Quandl 模块 Pandas Datareader 模块 数据预处理 缺失值查找 数据规范化 股价涨跌
  • 前端埋点VS后端埋点

    前端埋点比后端埋点更灵活 比如页面停留时间 点击下拉框动作等都可以通过埋点接口让后端记录下来 而后端埋点 这些是记录不下来的 因为没有请求 后端埋点还有一个问题 有可能前端不同按钮调用后端同一个接口 此时后端埋点是区分不出来的 后端埋点又分
  • 代码习惯

    补个liangs333的代码习惯 include
  • 全面 Serverless 化,阿里云微服务引擎 MSE 重磅升级

    微服务已成为企业数字化首选的应用架构 并正在向缩短服务的构建周期和降低资源成本 提升架构质量和架构效率两个方向演进 今天 阿里云正式宣布微服务引擎 MSE 重磅升级 全面 Serverless 化 带来两大新形态和两大新体验 产业新形态 业
  • [Android AIDL系列 1] 手动编译aidl文件,生成Java、C++[android]、C++[ndk]、Rust接口

    AIDL文件在Android系统上应用广泛 和底层的Binder机制紧密关联 在Android源码或者Android Studio中通常是自动编译aidl文件 生成对应语言的接口文件 做应用层Java开发 aidl和binder封装的比较
  • centos7虚拟网卡其他服务器不识别,Vmware10 下安装centos7,网卡无法识别问题处理...

    问题表现 之前安装的是32位版本的centos5 后来操作不当损坏 于是安装了64位版本的centos7 安装后网卡无法识别 用如下第一种方式顺利解决 网络连接使用nat方式 由于Vmware虚拟网卡和linux兼容问题导致驱动无法正常安装
  • Retrofit+OKHttp+RxAndroid,图文最详细解释(Kotlin)

    文章目录 一 Retrofit 1 上图说明了如下几点 2 Retrofit 对Okhttp做了什么 3 下面我们来看一下Retrofit的具体使用 1 导入依赖 module build gradle下 2 添加网络权限 src main
  • mac iterm2快捷键

    mac iterm2快捷键 1 命令一 查找 Cmd f 自动完成 Cmd 命令历史 Cmd Shift H
  • vue 组件同页面多次调用 props 传值无效

    项目场景 在同一个编辑页面使用了同一个Vue组件 导致props 传值无效 问题描述 在做一个文章编辑的页面 需要通过切换文章类型 音频 视频 显示隐藏上传不同类型的按钮给用户上传 例如以下代码会出现一个奇怪的问题 当我从article m
  • MySQL笔记 —— 基础(概念,对于数据库、表、数据的各种操作语句)

    目录 关系型数据库 创建 查看 删除数据库 创建表 查询表 删除表 修改表结构 插入数据 删除数据 修改数据 查询语句 where与having的区别 语句的执行顺序 别名 子句中的运算符 limit 分页 关系型数据库 数据库与普通文件系
  • SQL每日一练(牛客新题库)——第3天: 条件查询

    文章目录 1 查找某个年龄段的用户信息 2 查找除复旦大学的用户信息 3 用where过滤空值练习 4 高级操作符练习 1 5 如何让刷题变得更高效 1 查找某个年龄段的用户信息 题目 现在运营想要针对20岁及以上且23岁及以下的用户开展分
  • 金蝶部署在公有云服务调用外部链接报错:错误为:System.Net.WebException: 基础连接已经关闭: 发送时发生错误。

    刚开始一直以为是因为外部链接是https的问题 就一直更改安全协议 代码改为 if url StartsWith https StringComparison OrdinalIgnoreCase 创建HttpWebRequest reque
  • 常用的搜索引擎

    参考博客 https www chinaz com news 2017 0822 798159 shtml 1 Google 2 Bing 3 Yahoo 4 百度
  • 使用MyBatis分页插件PageHelper遇到的问题

    最近在使用mybatis的PageHelper进行分页查询时 遇到了不少问题 总结一下希望能帮到别人 1 版本错误 报错如下 java lang NoSuchMethodError java util List net sf jsqlpar
  • 关于调用Callable时的一个问题分享--总是只输出最后一次数据

    问题描述 我本来想使用线程池 ExecutorService Callable实现多线程处理数据 测试过程发现 只循环2到3次时 最终输出的数据只有最后一次遍历的数据 很奇怪 遇到问题解决问题 1 首先把我的测试代码贴出来 1 1 测试代码
  • Java导出压缩文件

    在很多场景需要导出很多的文件 将其压缩成zip是一个很不错的选择 先将要压缩的文件路径和名称得到 然后用工具类将其压缩 代码逻辑清晰 使用得修改一些文件路径 实现类中导出方法中 String zipFileName 工单附件 new Sim
  • 剑指 Offer 12. 矩阵中的路径

    题解 dfs 对棋盘里的每个点都dfs一遍 看是否有合适的字符串 当找到最后一个字符位置 并且最后一个字符 并且当前字符串匹配 那么为真 注意回溯之后的标记需要改成false 因为需要回溯进行查找 class Solution public
  • Hive启停脚本

    bin bash HIVE LOG DIR HIVE HOME logs if d HIVE LOG DIR then mkdir p HIVE LOG DIR fi 检查进程是否运行正常 参数 1 为进程名 参数 2 为进程端口 func
  • Spring Cloud Alibaba Sentinel 整合 nacos 进行规则持久化

    上篇文章Spring Cloud Alibaba Sentinel 初体验介绍了Sentinel 的简单使用 在使用过程中我们发现在Sentinel 控制台中配置了规则之后 随着服务的重启 配置的规则也随之消失 Sentinel 控制台控制