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,一经查实,立即删除!

相关文章

论文解析: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;先主后子&…

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 …

笔记本插入耳机没有声音

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

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

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

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

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

【软件工程】一份完整的软件工程实践论文格式

一份完整的软件工程实践论文格式 记录一下&#xff0c;以备不时之需&#xff01; 目 录 第1章 绪 论 1.1 课题背景 1.2 课题意义 1.3 国内外现状 2 第2章 系统关键技术 4 2.1 开发技术 4 2.2 MVVM模式 4 2.3 MySQL数据库 4 2.4 B/S结构 5 2.5 框架介绍 5 2.6 Vue.js主要功能 6…

sentinel熔断降级

熔断降级 Slot 责任链上的最后一环&#xff1a;熔断降级 DegradeSlot,熔断降级作为保护系统的一种强大手段,可以根据慢调用、异常比例和异常数进行熔断,并自定义持续时间以实现系统保护 规则配置 规则类中属性解析 与控制面板对应 // 其中资源名称在 AbstractRule 里。 pu…

LiveGBS流媒体平台GB/T28181功能-大屏播放上大屏支持轮巡播放分屏轮巡值守播放监控视频轮播大屏轮询播放轮播

LiveGBS支持-大屏播放上大屏支持轮巡播放分屏轮巡值守播放监控视频轮播大屏轮询播放轮播 1、轮播功能2、分屏展示3、选择轮播通道4、配置轮播间隔(秒)5、点击开始轮播6、轮播停止及全屏7、搭建GB28181视频直播平台 1、轮播功能 视频监控项目使用过程中&#xff0c;有时需要大屏…

聊聊Go程序是如何运行的

写在文章开头 Go语言是一门编译语言&#xff0c;其工作过程即直接通过编译生成各大操作系统的机器码即可直接执行&#xff0c;所以这篇文章笔者就从底层汇编码的角度聊一聊Go语言是如何运行的。 Hi&#xff0c;我是 sharkChili &#xff0c;是个不断在硬核技术上作死的 java c…

IntelliJ IDEA 设置运行时环境变量

背景 博主要测试langchain4j&#xff0c;运行时需要OPENAI_BASE_URL和OPENAI_API_KEY这两个环境变量的值。 临时设置 Run -> Edit Configurations -> Edit Environmental Variables 永久设置 在系统环境变量中设置&#xff0c;教程无数。 注意&#xff1a;windows在…

MATLAB教程

目录 前言一、MATLAB基本操作1.1 界面简介1.2 搜索路径1.3 交互式命令操作1.4 帮助系统 二、MATLAB语言基础2.1 数据类型2.2 MATLAB运算2.2.1 算数运算2.2.2 关系运算2.2.3 逻辑运算 2.3 常用内部函数2.4 结构数据与单元数据 三、MATLAB程序设计3.1 M文件3.2 函数文件3.3 程序控…