首页 > 其他分享 >sentinel 流控规则持久化

sentinel 流控规则持久化

时间:2022-10-10 11:39:18浏览次数:44  
标签:持久 流控 flow nacos Nacos Sentinel 熔断 sentinel

1\. 在项目 pom.xml 文件中加入 sentinel-datasource-nacos 依赖
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-datasource-nacos</artifactId>
</dependency>

sentinel-datasource-nacos 是 Sentinel 为 Nacos 扩展的数据源模块,允许将规则数据存储在 Nacos 配置中心,在微服务启动时利用该模块 Sentinel 会自动在 Nacos下载对应的规则数据。

2\. 在application.yml 文件中增加 Nacos下载规则
#spring:
# application:
# name: sentinel-sample #应用名&微服务id
# cloud:
# sentinel: #Sentinel Dashboard通信地址
# transport:
# dashboard: 10.173.203.14:9100
# eager: true #取消控制台懒加载
# nacos: #Nacos通信地址
# server-addr: 10.173.203.14:8848
# username: nacos
# password: nacos
#server:
# port: 80
#management:
# endpoints:
# web: #将所有可用的监控指标项对外暴露
# exposure: #可以访问 /actuator/sentinel进行查看Sentinel监控项
# include: '*'

spring:

application:

name: sentinel-sample #应用名&微服务id

cloud:

sentinel: #Sentinel Dashboard通信地址

transport:

dashboard: 10.173.203.158:8080

eager: true #取消控制台懒加载

datasource:

flow: #数据源名称,可以自定义

nacos: #nacos配置中心

#Nacos内置配置中心,因此重用即可

server-addr: ${spring.cloud.nacos.server-addr}

dataId: ${spring.application.name}-flow-rules #定义流控规则data-id,完整名称为:sentinel-sample-flow-rules,在配置中心设置时data-id必须对应。

groupId: SAMPLE_GROUP #gourpId对应配置文件分组,对应配置中心groups项

rule-type: flow #flow固定写死,说明这个配置是流控规则 degrade

username: nacos #nacos通信的用户名与密码

password: nacos

nacos: #Nacos通信地址

server-addr: 10.173.203.14:8848

username: nacos

password: nacos

jackson:
default-property-inclusion: non_null

server:
port: 80

management:
endpoints:
web: #将所有可用的监控指标项对外暴露
exposure: #可以访问 /actuator/sentinel进行查看Sentinel监控项
include: '*'
logging:
level:
root: debug #开启 debug 是学习需要,生产改为 info 即可
3\. 在 Nacos 配置中心页面,新增 data-id 为sentinel-sample-flow-rules 的配置项。

这里 data-id 与 groups 与微服务应用的配置保持对应,最核心的配置内容采用 JSON 格式进行书写,我们来分析下这段流控规则。

[

{

"resource":"/test_flow_rule", #资源名,说明对那个URI进行流控

"limitApp":"default", #命名空间,默认default

"grade":1, #类型 0-线程 1-QPS

"count":2, #超过2个QPS限流将被限流

"strategy":0, #限流策略: 0-直接 1-关联 2-链路

"controlBehavior":0, #控制行为: 0-快速失败 1-WarmUp 2-排队等待

"clusterMode":false #是否集群模式

}

]
4\. 查看服务的流量控制规则

访问 : ​​http://localhost/actuator/sentinel在​​ flowRules 这个数组中,可以看到 对应流控规则

{
"appName": "sentinel-sample",
"consoleServer": [{
"r1": "10.173.203.158",
"r2": 8080
}],
"coldFactor": "3",
"rules": {
"systemRules": [],
"authorityRule": [],
"paramFlowRule": [],
"flowRules": [{
"resource": "/test_flow_rule",
"limitApp": "default",
"grade": 1,
"count": 1.0,
"strategy": 0,
"controlBehavior": 0,
"warmUpPeriodSec": 10,
"maxQueueingTimeMs": 500,
"clusterMode": false,
"clusterConfig": {
"thresholdType": 0,
"fallbackToLocalWhenFail": true,
"strategy": 0,
"sampleCount": 10,
"windowIntervalMs": 1000
}
}],
"degradeRules": []
},
"metricsFileCharset": "UTF-8",
"filter": {
"order": -2147483648,
"urlPatterns": ["/**"],
"enabled": true
},
"totalMetricsFileCount": 6,
"datasource": {
"flow": {
"nacos": {
"dataType": "json",
"ruleType": "FLOW",
"serverAddr": "10.173.203.14:8848",
"username": "nacos",
"password": "nacos",
"groupId": "SAMPLE_GROUP",
"dataId": "sentinel-sample-flow-rules"
}
}
},
"clientIp": "10.173.134.200",
"clientPort": "8719",
"logUsePid": false,
"metricsFileSize": 52428800,
"logDir": "C:\\Users\\xulihui\\logs\\csp\\",
"heartbeatIntervalMs": 10000
}
5\. 自定义资源点进行熔断保护

在 sentinel-core 客户端中为开发者提供了 @SentinelResource 注解,该注解允许在程序代码中自定义 Sentinel 资源点来实现对特定方法的保护

在 sentinel-core 中基于 Spring AOP(面向切面技术)可在目标 Service 方法执行前按熔断规则进行检查,只允许有效的数据被送入目标方法进行处理。

5.1 声明切面
 // 注解支持的配置Bean
@Bean
public SentinelResourceAspect sentinelResourceAspect() {
return new SentinelResourceAspect();
}
5.2 声明资源点

在 SampleService.createOrder 方法上增加 @SentinelResource 注解用于声明 Sentinel 资源点,只有声明了资源点,Sentinel 才能实施限流熔断等保护措施。

/**

* 演示用的业务逻辑类

*/

@Service

public class SampleService {

//资源点名称为createOrder

@SentinelResource("createOrder")

/**

* 模拟创建订单业务

* 抛出IllegalStateException异常用于模拟业务逻辑执行失败的情况

*/

public void createOrder() throws IllegalStateException{

try {

//模拟处理业务逻辑需要101毫秒

Thread.sleep(101);

} catch (InterruptedException e) {

e.printStackTrace();

}

System.out.println("订单已创建");

}

}
5.3 获取熔断规则

打开sentinel-sample 工程的 application.yml 文件,将服务接入 Nacos 配置中心的参数以获取熔断规则。

datasource:

flow: #之前的流控规则,直接忽略

...

degrade: #熔断规则

nacos:

server-addr: ${spring.cloud.nacos.server-addr}

dataId: ${spring.application.name}-degrade-rules

groupId: SAMPLE_GROUP

rule-type: degrade #代表熔断

username: nacos

password: nacos
5.4 在 Nacos 配置熔断规则

设置 data-id 为 sentinel-sample-degrade-rules,Groups 为 SAMPLE_GROUP与微服务的设置保持一致。

[{

"resource": "createOrder", #自定义资源名

"limitApp": "default", #命名空间

"grade": 0, #0-慢调用比例 1-异常比例 2-异常数

"count": 100, #最大RT 100毫秒执行时间

"timeWindow": 5, #时间窗口5秒

"minRequestAmount": 1, #最小请求数

"slowRatioThreshold": 0.1 #比例阈值

}]

JSON 完整的含义是:在过去 1 秒内,如果 createOrder资源被访问 1 次后便开启熔断检查,如果其中有 10% 的访问处理时间超过 100 毫秒,则触发熔断 5 秒钟,这期间访问该方法所有请求都将直接抛出 DegradeException,5 秒后该资源点回到“半开”状态等待新的访问,如果下一次访问处理成功,资源点恢复正常状态,如果下一次处理失败,则继续熔断 5 秒钟。

标签:持久,流控,flow,nacos,Nacos,Sentinel,熔断,sentinel
From: https://blog.51cto.com/u_15773567/5742952

相关文章

  • MQTT 消息持久化
    MQTT消息持久化前提条件:服务器(EMQX)&生产者都正常工作--消费者正常或者非正常掉线,一段时间过后,消费者重新上线,如何保证接收掉线时间内的离线消息?一、持久化会话当消......
  • Redis 开发与运维--第5章 持久化
    Redis支持RDB和AOF两种持久化机制,持久化功能有效避免因为进程退出而造成数据丢失的问题。当下次重启时候利用之前持久化的文件即可实现数据恢复。本章内容如下:......
  • SARscape存放sentinel-1精密轨道数据并自动读取
    问题描述在SARScape导入sentinel-1数据并处理的时候,需要精密轨道文件(可选,非必须),SARscape562可以自动下载精密轨道数据,但经常出错,为了处理数据流程顺利,建议手动下载好需要的......
  • 阿里巴巴开源限流组件Sentinel初探之集成Gateway
    1Sentinel主页​​github.com/alibaba/Sen…​​1.1Sentinel介绍随着微服务的流行,服务和服务之间的稳定性变得越来越重要。Sentinel是面向分布式服务架构的流量控制组件,......
  • P3402 可持久化并查集
    P3402通过主席树维护不同版本的并查集,注意要采用按秩合并的方式,路径压缩可能会爆。1#include<bits/stdc++.h>2usingnamespacestd;3constintN=3e5+10;......
  • P3919 【模板】可持久化线段树 1(可持久化数组)
    还是用主席树来做(因为提到不同的版本),这时候的主席树不是以权值为下标的,就是普通的线段树,维护范围1~n,i存的是a[]中的数。1#include<bits/stdc++.h>2usingnamespac......
  • KAL1 LINUX 官方文档之usb live版本 --- 将持久性添加到 Kali Linux Live USB 驱动器
    将持久性添加到KaliLinuxLiveUSB驱动器KaliLinux“Live”在默认启动菜单中有两个选项可以启用持久性——在“KaliLive”USB驱动器上保存数据——在“KaliLive”......
  • KAL1 LINUX 官方文档之usb live版本 --- 将加密持久性添加到 Kali Linux Live USB 驱
    将加密持久性添加到KaliLinuxLiveUSB驱动器在本次研讨会中,我们将研究从USB设备启动KaliLinux时可用的各种功能。我们将探索诸如持久性、创建LUKS加密持久性......
  • 【持久层框架】- SpringData - JPA
    JPA简介JPA即JavaPersistenceAPI。是一款持久层框架,中文名Java持久层API,是JDK5.0注解或XML描述对象-关系表的映射关系,并将运行期的实体对象持久化到数据库中。JPA的对象......
  • redis的两种持久化方式
    redis的两种持久化方式redis是一个内存数据库,一旦断电或服务器进程退出,内存数据库中的数据将全部丢失,所以需要redis持久化redis持久化就是把数据保存在磁盘上,利用永久性......