nacos(九):sentinel——规则持久化
接上回,sentinel基本使用我们已经掌握。但是在设置限流规则时,会发现规则都是临时的,一段时间没访问资源或者重启sentinel,规则就会消失。所以,我们需要有一个将规则持久化保存的地方,让规则一直生效。
关于sentinel的规则持久化,我们一般会关注两个方面:
1) 在sentinel设置规则的时候,自动将规则同步到外部的存储设备;
2)sentinel启动的时候,如何自动拉取外部存储设备中的规则;
关于第1点,在官方版本中(截止当前为止1.8.8)都未进行支持。如果需要实现自动推送,则需要修改源码,不在今天的讨论范围中;
第2点才是我们今天讨论的重点。
步骤一:在nacos中添加规则
1)在nacos中新建一个命名空间,该命名空间专门用于存放sentinel的规则,如下图:
注意:这一步是必须的。因为经过多次尝试,放在public命名空间下,无法将规则同步到sentinel。
2)在新建的命名空间下,添加DataID为sentinel-flow-rules的配置项
该配置项中,即为流控规则,内容如下:
[
{
"resource": "/hello",
"limitApp": "default",
"grade": 1,
"count": 2,
"clusterMode": false,
"controlBehavior": 0,
"strategy": 0
},
{
"resource": "/api",
"limitApp": "default",
"grade": 1,
"count": 2,
"clusterMode": false,
"controlBehavior": 0,
"strategy": 0
}
]
添加完成后,效果如下图所示:
步骤二:在项目中进行配置
当前仍是在多模块测试项目(详情点击查看)的基本上进行扩展。
1) 在pom.xml中添加依赖
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.example</groupId>
<artifactId>multimod_nacos</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<artifactId>producer</artifactId>
<packaging>jar</packaging> <dependencies>
<!--springboot-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency> <dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency> <!-- 服务发现(生产者) -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency> <!--sentinel -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency> <dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-datasource-nacos</artifactId>
</dependency> </dependencies> <build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>${spring-boot.version}</version>
<configuration>
<mainClass>com.example.producer.ProducerApplication</mainClass>
<skip>false</skip>
</configuration>
<executions>
<execution>
<id>repackage</id>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build> </project>
2) 配置application.yml
server:
port: 8085 spring:
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
username: nacos
password: nacos
config:
server-addr: 127.0.0.1:8848
username: nacos
password: nacos
namespace: public loadbalancer:
nacos:
enabled: true sentinel:
filter:
enabled: true
transport:
port: 8719
dashboard: 127.0.0.1:8080
datasource:
flow:
nacos:
server-addr: 127.0.0.1:8848
username: nacos
password: nacos
namespace: 86c02680-8d68-478a-b263-524726121545 #不能放在public命名空间中
dataId: sentinel-flow-rules
groupId: DEFAULT_GROUP
data-type: json
rule-type: flow
eager: true #主动全量加载,如果不设置,默认懒加载 application:
name: product1
其中:
namespace与dataId要与nacos中命名空间ID和配置项的dataId一致;
rule-type:规则的类型,所有类型的流控规则见文后附录;
eager:该参数如果设置为true,则项目启动后会立即全量加载流控规则。
3) 配置完成,启动项目
启动项目后,进入sentinel官理面版,在流控规则下即可看到生效的两条规则,如下图:
备注:在nacos中修改规则后,规则会立即同步到sentinel。所以开发过程中,尽量做好约定,如果里要修改规则,统一在nacos中进行修改。
附录:各种类型规则说明
1) 流控规则
[
{
// 资源名
"resource": "/test",
// 针对来源,若为 default 则不区分调用来源
"limitApp": "default",
// 限流阈值类型(1:QPS;0:并发线程数)
"grade": 1,
// 阈值
"count": 1,
// 是否是集群模式
"clusterMode": false,
// 流控效果(0:快速失败;1:Warm Up(预热模式);2:排队等待)
"controlBehavior": 0,
// 流控模式(0:直接;1:关联;2:链路)
"strategy": 0,
// 预热时间(秒,预热模式需要此参数)
"warmUpPeriodSec": 10,
// 超时时间(排队等待模式需要此参数)
"maxQueueingTimeMs": 500,
// 关联资源、入口资源(关联、链路模式)
"refResource": "/ref"
}
]
2) 降级规则
[
{
// 资源名
"resource": "/test1",
"limitApp": "default",
// 熔断策略(0:慢调用比例,1:异常比率,2:异常计数)
"grade": 0,
// 最大RT、比例阈值、异常数
"count": 200,
// 慢调用比例阈值,仅慢调用比例模式有效(1.8.0 引入)
"slowRatioThreshold": 0.2,
// 最小请求数
"minRequestAmount": 5,
// 当单位统计时长(类中默认1000)
"statIntervalMs": 1000,
// 熔断时长
"timeWindow": 10
}
]
3) 热点规则
[
{
// 资源名
"resource": "/test1",
// 限流模式(QPS 模式,不可更改)
"grade": 1,
// 参数索引
"paramIdx": 0,
// 单机阈值
"count": 13,
// 统计窗口时长
"durationInSec": 6,
// 是否集群 默认false
"clusterMode": 默认false,
"burstCount": 0,
// 集群模式配置
"clusterConfig": {
"fallbackToLocalWhenFail": true,
"flowId": 2,
"sampleCount": 10,
"thresholdType": 0,
"windowIntervalMs": 1000
},
// 流控效果(支持快速失败和匀速排队模式)
"controlBehavior": 0,
"limitApp": "default",
"maxQueueingTimeMs": 0,
// 高级选项
"paramFlowItemList": [
{
// 参数类型
"classType": "int",
// 限流阈值
"count": 222,
// 参数值
"object": "2"
}
]
}
4) 系统规则
[
{
// RT
"avgRt": 1,
// CPU 使用率
"highestCpuUsage": -1,
// LOAD
"highestSystemLoad": -1,
// 线程数
"maxThread": -1,
// 入口 QPS
"qps": -1
}
]
5) 授权规则
[
{
// 资源名
"resource": "sentinel_spring_web_context",
// 流控应用
"limitApp": "/test",
// 授权类型(0代表白名单;1代表黑名单。)
"strategy": 0
}
]
则对应以上各种类型规则的rule-type如下:
spring:
cloud:
sentinel:
datasource:
# 名称随意
flow:
nacos:
server-addr: localhost:8848
dataId: cloud-ali-flow-rules
groupId: DEFAULT_GROUP
# 规则类型,取值见:
# org.springframework.cloud.alibaba.sentinel.datasource.RuleType
rule-type: flow #流控规则
degrade:
nacos:
server-addr: localhost:8848
dataId: ${spring.application.name}-degrade-rules
groupId: DEFAULT_GROUP
rule-type: degrade #降级规则
system:
nacos:
server-addr: localhost:8848
dataId: ${spring.application.name}-system-rules
groupId: DEFAULT_GROUP
rule-type: system #系统规则
authority:
nacos:
server-addr: localhost:8848
dataId: ${spring.application.name}-authority-rules
groupId: DEFAULT_GROUP
rule-type: authority #授权规则
param-flow:
nacos:
server-addr: localhost:8848
dataId: ${spring.application.name}-param-flow-rules
groupId: DEFAULT_GROUP
rule-type: param-flow #热点规则
到这里sentinel的使用则告一段落,接下来的话题我们一起讨论dobbo的运用以及接入nacos的方法:)
nacos(九):sentinel——规则持久化的更多相关文章
- [Spring-Cloud-Alibaba] Sentinel 规则持久化
在之前的练习中,只要应用重启,就需要重新配置,这样在我们实际的项目是非常不实用的,那么有没有办法把我们配置的规则保存下来呢?答案是YES,那么接下来,给大家来介绍如何将Sentinel规则持久化. D ...
- sentinel 规则持久化到nacos
问题描述 Sentinel Dashboard中添加的规则是存储在内存中的,只要项目一重启规则就丢失了 此处将规则持久化到nacos中,在nacos中添加规则,然后同步到dashboard中: 后面研 ...
- Spring Cloud Alibaba学习笔记(7) - Sentinel规则持久化及生产环境使用
Sentinel 控制台 需要具备下面几个特性: 规则管理及推送,集中管理和推送规则.sentinel-core 提供 API 和扩展接口来接收信息.开发者需要根据自己的环境,选取一个可靠的推送规则方 ...
- sentinel规则nacos持久化
背景说明:生产环境中sentinel的使用应该是如下图所示: sentinel控制台编辑规则 推送到 nacos配置中心, 由nacos推送到应用,应用更新内存. 这样的话, 规则持久化在了naco ...
- Sentinel Dashboard(基于1.8.1)流控规则持久化到Nacos——涉及部分Sentinel Dashboard源码改造
前言 之前虽然也一直在使用sentinel实现限流熔断功能,但却没有好好整理之前看的源码与资料,今天有时间将之前自己整理过的资料写成一篇博文,或者是是一篇关于Sentinel(基于目前最近版本1.8, ...
- 如何基于 Nacos 和 Sentinel ,实现灰度路由和流量防护一体化
基于Alibaba Nacos和Sentinel,实现灰度路由和流量防护一体化的解决方案,发布在最新的 Nepxion Discovery 5.4.0 版,具体参考: 源码主页,请访问 源码主页指南主 ...
- Spring Cloud Alibaba生态探索:Dubbo、Nacos及Sentinel的完美结合
@ 目录 背景 一.项目框架 1.1 采用IDEA和Maven多模块进行项目搭建 1.2 模块管理及版本管理 二.微服务公共接口 2.1 定义一个公共接口Api 2.2 pom.xml 2.3 Goo ...
- 普通用户iptables规则持久化,开机自动恢复
本文档对于docker环境下并不适用,docker环境的iptables持久化请参考https://www.cnblogs.com/wiseo/p/15000745.html 添加iptables规则 ...
- Sentinel Dashboard 规则 持久化到Nacos
本篇文章基于sentinel1.8.4版本进行改造的.本篇主要记录改造步骤 1.下载源码 https://github.com/alibaba/Sentinel 2.打开下载的sentinel,到se ...
- 阿里Sentinel控制台源码修改-对接Apollo规则持久化
改造背景 前面我们讲解了如何对接Apollo来持久化限流的规则,对接后可以直接通过Apollo的后台进行规则的修改,推送到各个客户端实时生效. 但还有一个问题就是Sentinel控制台没有对接Apol ...
随机推荐
- 即时通讯技术文集(第7期):长连接网关、P2P等 [共10篇]
为了更好地分类阅读52im.net 总计1000多篇精编文章,我将在每周三推送新的一期技术文集,本次是第7 期. [- 1 -] 长连接网关技术专题(二):知乎千万级并发的高性能长连接网关技术实践 [ ...
- Solution Set -「AGC 004~006」C~F
目录 「AGC 004C」AND Grid 「AGC 004D」Teleporter 「AGC 004E」Salvage Robots 「AGC 004F」Namori ^ 「AGC 005C」Tre ...
- WPF webbowser 交互
// <Window x:Class="WpfApp1.MainWindow" xmlns="http://schemas.microsoft.com/winfx/ ...
- 前端(三)-JavaScript
1.基本语法 1.1 引入JavaScript 1.1.1行内引入 <input type="button" value="轻轻点我一下" onclick ...
- 网站架构核心技disruptor
一 序:本章业务场景:队列在数据结构中是一种线性表,从一端插入数据,然后从另一端删除数据.作者举例的场景有:进行异步处理.系统解耦.数据同步.流量削峰.缓冲.限流等. 前面的比较浅,总结起来,核心知识 ...
- Linux系统设置用户密码规则(复杂密码策略)方法
Linux系统下的用户密码的有效期 可以修改密码可以通过login.defs文件控制.设置密码过期期限(默认情况下,用户的密码永不过期.) 编辑 /etc/login.defs 文件,可以设置当前密码 ...
- LangChain基础篇 (04)
LangChain 核心模块:Data Conneciton - Document Loaders 使用文档加载器从源中加载数据作为文档.一个文档是一段文字和相关的元数据. 如,有用于加载简单 .tx ...
- .NET 进程 stackoverflow异常后,还可以接收 TCP 连接请求吗?
昨天线上有几个进程因为 StackOverFlowException 导致进程 Crash 了,但是 TCP 请求还是可以连接,具体可不可以连接一个出现StackOverFlowException的微 ...
- Flink CDC全量和增量同步数据如何保证数据的一致性
Apache Flink 的 Change Data Capture (CDC) 功能主要用于实时捕获数据库中的变更记录,并将其转换为事件流以供下游处理.为了保证全量和增量数据同步时数据的一致性.不丢 ...
- Java获取数据库的列名、列数、标题、类型等信息, ResultSetMetaData
import java.sql.*; public class jdbcTest { public static void main(String[] args) throws ClassNotFou ...