Sentinel基础使用

1. 概念解释


	限流:对并发访问进行限速。限流的一些行为:  1. 拒绝服务:将多余的请求直接拒绝掉2.服务降级:降级甚至关闭后台的某些服务3.特权请求:在多租户或者对用户进行分级时,考虑让特权用户进行访问4.延时处理:可以利用队列把请求进行缓存熔断:在分布式系统中,往往需要依赖下游服务,不管是内部系统还是第三方服务。如果下游服务出现问题,此时还盲目请求的话,会失败很多次还是会傻傻去请求,去等待,增加了整个链路的请求时间。熔断模式可以防止应用程序不断尝试可能超时和失败的服务,能达到应用程序执行而不必等待下游服务修正错误。熔断模式最牛在于能让应用程序自我诊断下游系统的错误是否已经修正,如果没有,不放量去请求,如果请求成功了,慢慢增加请求,再次尝试调用。比如说A服务调用B服务,B服务是下游的服务提供,或者是第三方服务,容易发生问题。这样既能防止不断的调用,是下游服务更坏,保护了下游方,还能降低自己的执行成本,快速的响应,减少延迟,增加吞吐量。降级:为了解决资源不足和访问量增加的矛盾。在有限的资源情况下,为了能抗住大量的请求,就需要对系统做一些牺牲,放弃一些功能,来保证整个系统正常运行。

2. 常见限流算法


  1. 静态窗口限流:限制每秒内请求的数量
  2. 动态窗口限流:限制当前时间1s内请求的数量。例如当前是2.5秒,静态:统计第2秒到现在的请求数;动态:统计第1.5秒到现在的请求数
  3. 漏桶限流:将请求全部放入桶中,使用队列的形式进行消费,会控制消费的速度。(进来的时候可以大流量地接收,出去的时候可以匀速出去)
  4. 令牌桶限流:令牌桶中存放的是令牌,会有一个产生令牌的程序,每秒产生多少个令牌,放入桶中,如果满了,则不再放了。取令牌:每过来一个请求,就取一个令牌,如果取不到令牌,则该请求就会失败
  5. 令牌大闸:在令牌桶的基础上进行控制,一次性产生N个令牌,产生完之后便不再生成。

3. Sentinel基础使用


限流是作用于被调用方,熔断是作用于调用方
Sentinel的使用主要包含两部分:

  1. 核心库:不依赖任何框架/库,能够运行于java8以及以上的版本的运行环境
  2. 控制台:主要负责管理推送规则、监控、管理机制消息等。

Sentinel控制台(github主页有)是一个标准的Springboot应用,以SpringBoot的形式来运行jar包即可,该程序以8080端口运行,打开页面之后账户和密码均为sentinel

java -Dserver.port=8080 -Dcsp.sentinel.dashboard.server=localhost:8080 -Dproject.name=sentinel-dashboard -jar sentinel-dashboard.jar

程序中引入sentinel

  1. 引入依赖:使用的是Spring-Cloud-alibaba
<!-- 限流熔断 -->  
<dependency>  <groupId>com.alibaba.cloud</groupId>  <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>  
</dependency>
  1. 定义资源:
    为某个接口加入注解
@SentinelResource("doConfirm")  
public void doConfirm(ConfirmOrderDoReq req){XXX};
  1. 定义规则:使用代码的方式定义规则
    在该模块中定义规则并进行启动
@SpringBootApplication  
@MapperScan("com.monster.business.mapper")  
@ComponentScan("com.monster")  
@EnableFeignClients("com.monster.business.feign")  
@EnableCaching  
public class BusinessApplication {  private static final Logger LOG= LoggerFactory.getLogger(BusinessApplication.class);  public static void main(String[] args) {  SpringApplication app=new SpringApplication(BusinessApplication.class);  Environment env=app.run(args).getEnvironment();  LOG.info("启动成功!");  LOG.info("地址:\thttp://127.0.0.1:{}{}",env.getProperty("server.port"),env.getProperty("server.servlet.context-path"));  initFlowRules();  LOG.info("已定义限流规则");  }  private static void initFlowRules(){  List<FlowRule> rules = new ArrayList<>();  FlowRule rule = new FlowRule();  rule.setResource("doConfirm");  rule.setGrade(RuleConstant.FLOW_GRADE_QPS);  // Set limit QPS to 20.  rule.setCount(1);  rules.add(rule);  FlowRuleManager.loadRules(rules);  }  }

此时QPS为1,每秒只允许1个请求到达。
所以其他线程的请求就会得到sentinel报出的错误,但是这样不太正常,可以省略这些报错,相应处理如下:

//当被拦截的请求不会执行doConfirm方法,但会去执行doConfirmBlock
@SentinelResource(value="doConfirm",blockHandler = "doConfirmBlock")  
public void doConfirm(ConfirmOrderDoReq req){XXX};

doConfirmBlock方法的定义(返回值也需要一致),参数是有限制的。参数需要和doConfirm方法参数一样的基础上,再加一个BlockException e

public void doConfirmBlock(ConfirmOrderTicketReq req, BlockException e){  LOG.info("购票请求被限流:{}",req);  throw new BusinessException(BusinessExceptionEnum.CONFIRM_ORDER_FLOW_EXCEPTION);  
}

4. Sentinel控制台&&使用sentinel进行限流


应用与控制台进行交互:在yml文件中进行配置

spring:cloud:  sentinel:  transport:  port: 8719  //sentinel启动的固定端口dashboard: localhost:8080  //sentinel-dashboard启动的端口

可以在簇点链路中加入流控规则
![[Pasted image 20240318143230.png]]

但是控台不保存规则,一旦应用重启,之前设置的规则就全部消失

5. Sentinel+Nacos实现限流规则持久化


  1. 引入依赖
<!-- sentinel + nacos -->  
<dependency>  <groupId>com.alibaba.csp</groupId>  <artifactId>sentinel-datasource-nacos</artifactId>  
</dependency>
  1. 在Business模块增加配置,客户端和nacos做一个关联
    下面的属性需要与nacos中的配置一一对应
spring.cloud.sentinel.datasource.nacos.nacos.serverAddr=127.0.0.1:8848  
spring.cloud.sentinel.datasource.nacos.nacos.namespace=train  
spring.cloud.sentinel.datasource.nacos.nacos.groupId=TRAIN_GROUP  
spring.cloud.sentinel.datasource.nacos.nacos.dataId=sentinel-business-flow  
spring.cloud.sentinel.datasource.nacos.nacos.ruleType=flow
  1. 配置nacos
    ![[Pasted image 20240318150732.png]]

6. Sentinel限流不同的流控效果-Warm Up


默认为快速失败,还有Warm up和排队等待

Warm up效果:coldFactor即为请求QPS从(阈值/3)开始,经过多少预热时长才逐渐升值设定的QPS阈值,比如阈值是100,时长为10秒,则从33开始经过10秒上升到100

![[Pasted image 20240318160425.png]]

设置一个测试类

@RestController  
public class TestController {  @SentinelResource("hello")  @GetMapping("/hello")  public String hello()throws InterruptedException{  return "Hello World! Business!";  }  
}

改变配置文件

spring.cloud.sentinel.datasource.flow.nacos.serverAddr=127.0.0.1:8848  
spring.cloud.sentinel.datasource.flow.nacos.namespace=train  
spring.cloud.sentinel.datasource.flow.nacos.groupId=DEFAULT_GROUP  
spring.cloud.sentinel.datasource.flow.nacos.dataId=sentinel-business-flow  
#flow表示限流  
spring.cloud.sentinel.datasource.flow.nacos.ruleType=flow

在Nacos中配置一个名为sentinel-business-flow 的配置文件

[
{
// 资源名称
"resource": "hello",
//针对来演
"limitApp": "default",
// 按照QPS模式
"grade": "1",
//阈值为10
"count": 10,
// 策略为直接放弃
"strategy": 0,
// 流控模式为1即Warm Up
"controlBehavior": 1,
// 预热时长为2s
"warmUpPeriodSec": 2,
// 集群模式
"clusterMode": false
}
]

一开始的QPS为3,然后慢慢增长到10。这就是预热的效果
![[Pasted image 20240318163025.png]]

7. Sentinel限流不同的流控效果-排队等待


排队等待需要设置一个排队等待时间,默认为500ms。
接收到的(超过阈值的)请求,会进行排队等待,如果在500ms内能够接收请求的话就处理,否则就拒绝
![[Pasted image 20240318163215.png]]

相应的配置文件内容为:设置超时时间为1000ms即1s

[
{
"resource": "hello",
"limitApp": "default",
"grade": "1",
"count": 10,
"strategy": 0,
"controlBehavior": 2,
"maxQueueingTimeMs": 1000,
"clusterMode": false
}
]

设置20个线程去请求,理论上来说是第一秒处理10个请求,然后10个请求进行排队等待,在第二秒进行处理

8. Sentinel+Feign熔断


调用方:Batch模块
被调用方:Business模块的Hello接口

当被调用方不稳定时,调用方会启动备用方案,这就是熔断

为Batch模块加入相关依赖,并进行配置,degrade表示熔断降级的意思

spring.cloud.sentinel.transport.port=8719  
spring.cloud.sentinel.transport.dashboard=localhost:8080  
spring.cloud.sentinel.datasource.degrade.nacos.serverAddr=127.0.0.1:8848  
spring.cloud.sentinel.datasource.degrade.nacos.namespace=train  
spring.cloud.sentinel.datasource.degrade.nacos.groupId=DEFAULT_GROUP  
spring.cloud.sentinel.datasource.degrade.nacos.dataId=sentinel-batch-degrade  
#flow表示限流  
spring.cloud.sentinel.datasource.flow.nacos.ruleType=degrade
# sentinel默认不监控feign,需要配置  
feign.sentinel.enabled=true  
# 上面改为true后,启动会报注入错误,需要改成懒加载  
spring.cloud.openfeign.lazy-attributes-resolution=true

Batch模块远程调用代码为

@Resource  
BusinessFeign businessFeign;  @GetMapping("/hello")  
public String hello() {  String businessHello = businessFeign.hello();  LOG.info(businessHello);  return "Hello World! Batch! " + businessHello;  
}

Batch的nacos配置代码为:

[{
"resource": "GET:http://business/business/hello",
"grade": 0,
"count": 201,
"timeWindow": 11,
"minRequestAmount": 6,
"statIntervalMs": 1000,
"slowRatioThreshold": 0.3
}]

对应的熔断规则如下图所示:
最大RT:表示响应时间,如果响应时间大于201ms,当有百分之三十的请求响应时间大于201ms时出发熔断
熔断时长:表示触发熔断之后,后面的11秒所有的请求会抛出
最小请求数:一秒内必须要超过6个请求时,才会进行熔断判断
统计时长:在多少ms之内进行统计
![[Pasted image 20240318192706.png]]

当请求参数如下时不会发生熔断
![[Pasted image 20240318193751.png]]

当请求参数如下时,会发生熔断
![[Pasted image 20240318193859.png]]

![[Pasted image 20240318193924.png]]

9. Sentinel+Feign熔断后降级处理


当熔断之后,进行降级处理;在FeignClient注解上加上fallback,就是说其降级处理是BusinessFeignFallback.class

@FeignClient(value = "business", fallback = BusinessFeignFallback.class)  
public interface BusinessFeign {  @GetMapping("/business/admin/daily-train/gen-daily/{date}")  CommonResp<Object> genDaily(@PathVariable @DateTimeFormat(pattern = "yyyy-MM-dd") Date date);  @GetMapping("/business/hello")  String hello();  }
@Component  
public class BusinessFeignFallback implements BusinessFeign {  @Override  public String hello() {  return "Fallback";  }  @Override  public CommonResp<Object> genDaily(Date date) {  return null;  }  
}

远程调用的hello方法定义

@SentinelResource("hello")  
@GetMapping("/hello")  
public String hello()throws InterruptedException{  return "Hello World! Business!";  
}

10. 熔断策略


异常比例策略:

比例阈值:0-1之间,
最小请求数:当每秒钟的请求数大于6时
当出现异常的请求数大于比例阈值时会进行熔断,熔断时间为3秒
![[Pasted image 20240318194650.png]]

异常数:

区别在于异常数和比例阈值,在异常数策略中,只要异常请求达到3个便会触发熔断
![[Pasted image 20240318195352.png]]

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/755083.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

得物java春训营(一面面经)

1.聊项目技术点。 2.java中的threadlocal有了解过吗&#xff1f;使用threadlocal要注意什么呢&#xff1f;&#xff08;平时也没用过&#xff0c;后来复盘的时候才知道有内存泄露的问题&#xff0c;面试官提示到了和线程池共用&#xff0c;最后也没答出来。&#xff09; 3.线程…

代码随想录算法训练营day25 | 216.组合总和III、17.电话号码的字母组合

目录 组合总和III思路解题方法复杂度Code 电话号码的字母组合思路解题方法复杂度Code 总结 组合总和III 链接: 组合总和III 找出所有相加之和为 n 的 k 个数的组合&#xff0c;且满足下列条件&#xff1a; 只使用数字1到9 每个数字 最多使用一次 返回 所有可能的有效组合的列…

论文解析:V3D: Video Diffusion Models are Effective 3DGenerators

摘要&#xff1a; 自动三维生成最近引起了广泛关注。最近的方法大大加快了生成速度&#xff0c;但由于模型容量有限或三维数据&#xff0c;生成的物体通常不够精细。在视频扩散模型最新进展的推动下&#xff0c;我们引入了 V3D&#xff0c;利用预训练视频扩散模型的世界模拟能…

YOLOV5 部署:基于web网页的目标检测(本地、云端均可)

1、前言 YOLOV5推理的代码很复杂,大多数都是要通过命令行传入参数进行推理,不仅麻烦而且小白不便使用。 本章介绍的web推理,仅仅需要十几行代码就能实现本地推理,并且只需要更改单个参数就可以很方便的部署云端,外网也可以随时的使用 之前文章介绍了QT的可视化推理界面,…

Linux初识环境变量

&#x1f30e;环境变量【上】 文章目录&#xff1a; 环境变量 什么是环境变量 关于命令行参数 环境变量       简单了解       为什么需要环境变量       系统中其他环境变量 总结 前言&#xff1a; 环境变量是一种非常重要的概念&#xff0c;它们对于系统的…

TH-FBCQX2防爆气象站

TH-FBCQX2防爆气象站主要适用于易燃易爆、危险性高的场所。以下是其主要的适用领域&#xff1a; 石油与天然气行业&#xff1a;在石油和天然气的生产、储存和运输过程中&#xff0c;防爆气象站可以监测环境中的可燃气体浓度&#xff0c;并根据气象条件预测爆炸风险。同时&…

Machine Learning ---- Gradient Descent

目录 一、The concept of gradient&#xff1a; ① In a univariate function&#xff1a; ②In multivariate functions&#xff1a; 二、Introduction of gradient descent cases&#xff1a; 三、Gradient descent formula and its simple understanding: 四、Formula o…

【sql】深入理解 mysql的EXISTS 语法

相关文章&#xff1a; 【sql】深入理解 mysql的EXISTS 语法 【sql】初识 where EXISTS 1. 使用格式如下&#xff1a; select * from a where exists ( 任何子查询 ) 代码根据颜色分成两段&#xff0c;前面的是主查询&#xff0c;后面红色的是子查询&#xff0c;先主后子&…

手势追踪技术在HTC VIVE中的应用与实现

在虚拟现实(VR)的世界中&#xff0c;手势追踪技术正变得日益重要。它不仅能提升用户的交互体验&#xff0c;使其更加直观和自然&#xff0c;还能在各种应用场景中开辟新的可能性&#xff0c;从游戏和娱乐到专业的培训和设计。作为VR领域的先行者&#xff0c;HTC VIVE提供了一套…

Android弹出通知

发现把Android通知渠道的重要性设置为最高时&#xff0c;当发送通知时&#xff0c;通知能直接弹出来显示&#xff0c;以前一直搞不明白为什么别的app的通知可以弹出来&#xff0c;我的不行&#xff0c;搞了半天原来是这个属性在作怪&#xff0c;示例如下&#xff1a; class Ma…

Java毕业设计 基于springboot vue招聘网站 招聘系统

Java毕业设计 基于springboot vue招聘网站 招聘系统 springboot vue招聘网站 招聘系统 功能介绍 用户&#xff1a;登录 个人信息 简历信息 查看招聘信息 企业&#xff1a;登录 企业信息管理 发布招聘信息 职位招聘信息管理 简历信息管理 管理员&#xff1a;注册 登录 管理员…

后端工程师快速使用axios

文章目录 01.AJAX 概念和 axios 使用模板目标讲解代码解析案例前端后端结果截图 02.URL 查询参数模板目标讲解案例前端后端结果截图 03.常用请求方法和数据提交模板目标讲解案例前端后端结果截图 04.axios 错误处理模板目标讲解案例前端后端结果截图 01.AJAX 概念和 axios 使用…

鸿蒙Harmony应用开发—ArkTS声明式开发(容器组件:ListItem)

用来展示列表具体item&#xff0c;必须配合List来使用。 说明&#xff1a; 该组件从API Version 7开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起始版本。该组件的父组件只能是List或者ListItemGroup。 子组件 可以包含单个子组件。 接口 从API…

ASP.NET Core 8.0 WebApi 从零开始学习JWT登录认证

文章目录 前言相关链接Nuget选择知识补充JWT不是加密算法可逆加密和不可逆加密 普通Jwt&#xff08;不推荐&#xff09;项目环境Nuget 最小JWT测试在WebApi中简单使用简单使用运行结果 WebApi 授权&#xff0c;博客太老了&#xff0c;尝试失败 WebApi .net core 8.0 最新版Jwt …

XML和JSON的区别

1、JSON是一种轻量级的数据交换格式 XML是可扩展标记语言。 2、JSON是基于JavaScript语言 XML源自SGML。 3、JSON是一种表示对象的方式 XML是一种标记语言 使用标记结构来表示数据项。 4、JSON不提供对命名空间的任何支持 XML支持名称空间。 5、JSON支持数组 XML不支…

flinksql在实时数仓hologres的计算问题排查

要排查 Flink 实时计算从 Hologres 源表到目标表的错误,可以采取以下步骤: 检查 Flink 程序逻辑: 确保 Flink 程序中源表到目标表的数据转换逻辑正确。检查是否正确地连接了源表和目标表,并且字段映射正确。检查 Hologres 连接: 确保 Flink 程序正确地连接到 Hologres 数据…

笔记本插入耳机没有声音

笔记本插入耳机没有声音&#xff0c;有可能是因为音频设置问题 打开声音小喇叭&#xff0c;选择耳机频道就好了

【Qt图形界面引擎(一)】:第一个Qt程序

跨平台图形界面引擎&#xff0c;接口简单&#xff0c;易上手&#xff0c;一定程度简化内存。 Qt发展史 1991年由Qt Company开发的跨平台C图形用户界面应用程序开发框架2008年&#xff0c;Qt Company科技被诺基亚公司收购&#xff0c;Qt也因此成为诺基亚旗下的编程语言工具2012…

数字人解决方案— SadTalker语音驱动图像生成视频原理与源码部署

简介 随着数字人物概念的兴起和生成技术的不断发展&#xff0c;将照片中的人物与音频输入进行同步变得越来越容易。然而&#xff0c;目前仍存在一些问题&#xff0c;比如头部运动不自然、面部表情扭曲以及图片和视频中人物面部的差异等。为了解决这些问题&#xff0c;来自西安…

vue3 使用video-player 监听事件获取当前播放时间(全网首发)

1.main.ts 安装 npm i vue3-video-play --save import VueVideoPlayer from videojs-player/vue import video.js/dist/video-js.cssapp.use(VueVideoPlayer) 2.复制代码直接使用 <script setup lang"ts"> import {ref} from "vue"; import {con…