Sentinel基础使用

news2024/9/22 15:38:49

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.coloradmin.cn/o/1527335.html

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

相关文章

osgEarth学习笔记2-第一个Osg QT程序

原文链接 上个帖子介绍了osgEarth开发环境的安装。本帖介绍我的第一个Osg QT程序。 下载 https://github.com/openscenegraph/osgQt 解压&#xff0c;建立build目录。 使用Cmake-GUI Configure 根据需要选择win32或者x64&#xff0c;这里我使用win32. 可以看到include和lib路…

C语言数据结构与算法笔记(排序算法)

排序算法 基础排序 冒泡排序 核心为交换&#xff0c;通过不断进行交换&#xff0c;将大的元素一点一点往后移&#xff0c;每一轮最大的元素排到对应的位置上&#xff0c;形成有序。 设数组长度为N&#xff0c;过程为: 共进行N轮排序每一轮排序从数组的最左边开始&#xff0…

云原生(三)、Docker网络

Docker网络 在 Docker 中&#xff0c;不同容器之间的网络访问原理取决于容器所使用的网络模式。下面是 Docker 中常见的两种网络模式下容器间网络访问的原理&#xff1a; 桥接模式&#xff08;Bridge&#xff09;&#xff1a; 在桥接模式下&#xff0c;Docker 使用 Linux 桥接…

Vue3学习日记 Day4 —— pnpm,Eslint

注&#xff1a;此课程需要有Git的基础才能学习 一、pnpm包管理工具 1、使用原因 1.1、速度快&#xff0c;远胜过yarn和npm 1.2、节省磁盘空间 2、使用方式 2.1、安装方式 npm install -g pnpm 2.2、创建项目 pnpm create vue 二、Eslint配置代码风格 1、环境同步 1、禁用Pret…

Jenkins实现CICD(3)_Jenkins连接到git

文章目录 1、如何完成上述操作&#xff0c;并且不报如下错&#xff1a;2、连接不上git&#xff0c;操作如下&#xff1a;3、将上边产生的3个文件拷贝到&#xff1a;C:\Windows\System32\config\systemprofile\.ssh4、新建下图凭证&#xff1a;创建步骤&#xff1a; 5、公钥填到…

OpenCV 新版滴 4.5.1 发布啦!

发布亮点&#xff1a; OpenCV Github 项目终于突破50000 stars&#xff01;新的里程碑~ 这次发布的特性包括&#xff1a; 集成更多的GSoC 2020 项目的结果&#xff0c;包括&#xff1a; 开发了OpenCV.js DNN 模块&#xff0c;以方便再网页中使用&#xff0c;并提供了相关教…

基于yolov2深度学习网络的人脸检测matlab仿真,图像来自UMass数据集

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 4.1 网络架构与特征提取 4.2 输出表示 4.3损失函数设计 4.4预测阶段 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 matlab2022a 3.部分核心程序 load yolov2.mat% 加载…

浏览器架构的温故知新

【引子】前端可能是一个日新月异的领域&#xff0c;我们很难了解其中的方方面面。但是&#xff0c;前端系统一般都以浏览器作为运行环境&#xff0c; 对浏览器的进一步理解有助于我们更好地开发前端应用。这也是本文的由来之一&#xff0c;也作为对runtime的一次实例分析。 浏览…

全国各省市县统计年鉴/中国环境统计年鉴/中国工业企业数据库/中国专利数据库/污染排放数据库

统计年鉴是指以统计图表和分析说明为主&#xff0c;通过高度密集的统计数据来全面、系统、连续地记录年度经济、社会等各方面发展情况的大型工具书来获取统计数据资料。 统计年鉴是进行各项经济、社会研究的必要前提。而借助于统计年鉴&#xff0c;则是研究者常用的途径。目前国…

Web3 之力:探索去中心化技术的创新应用

在当今数字化时代&#xff0c;随着区块链技术的发展和应用&#xff0c;Web3作为其重要组成部分&#xff0c;正在逐渐改变着我们对于互联网和数字经济的认知与体验。Web3不仅是一种技术革新&#xff0c;更是一种新的思维范式&#xff0c;其去中心化的特点为数字世界带来了更多的…

DOcker搭建Rancher

简介 Rancher 是供采用容器的团队使用的完整软件堆栈。它解决了管理多个Kubernetes集群的运营和安全挑战&#xff0c;并为DevOps团队提供用于运行容器化工作负载的集成工具。 官网地址&#xff1a;https://www.rancher.cn/ 安装 拉取镜像 docker pull rancher/rancher:stab…

Chrome历史版本下载地址:Google Chrome Older Versions Download (Windows, Linux Mac)

最近升级到最新版本Chrome后发现页面居然显示错乱,是在无语, 打算退回原来的版本, 又发现官方只提供最新的版本下载, 为了解决这个问题所有收集了Chrome历史版本的下载地址分享给大家. Google Chrome Windows version 32-bit VersionSizeDate104.0.5112.10279.68 MB2022-05-30…

汽车电子拓扑架构的演进过程

汽车电子拓扑架构的演进过程 我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师 (Wechat:gongkenan2013)。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 本就是小人物,输了就是输了,不要在意别人怎么看自己。江湖一碗茶,喝完再挣扎,出门靠…

【Sass】1px分割线 + 缩进分割线

效果图 1. 亮色模式效果 2. 暗色模式效果 设计思路 配色使用grey色 优点&#xff1a;无论在暗色模式还是亮色模式都可以看清楚分割线 使用after,before 伪元素绘制线条&#xff0c;并压缩线条transform: scaleY(.25) 注意事项 必须确保父级有宽高父级定位必须为position: r…

【地图】腾讯地图 - InfoWindow 自定义信息窗口内容时,内容 html 嵌套混乱问题

目录 需求描述问题问题代码页面展示 解决原因解决办法解决代码页面展示 代码汇总注 需求描述 腾讯地图上画点位&#xff0c;点击点位展示弹框信息 问题 问题代码 // 打开弹框 openInfoWindow(position, content) {this.infoWindow new TMap.InfoWindow({map: this.map,posit…

使用jenkins-pipeline进行利用项目文件自动化部署到k8s上

Discard old builds:丢弃旧的构建,目的是管理存储空间、提升性能以及保持环境整洁 Do not allow concurrent builds: 禁止并发构建是指同一时间内只允许一个构建任务执行,避免多个构建同时运行可能带来的问题 Do not allow the pipeline to resume if the controller resta…

macOS 通过 MacPorts 正确安装 MySQL 同时解决无法连接问题

如果你通过 sudo port install 命令正常安装了 MySQL&#xff0c;再通过 sudo load 命令启动了 MySQL Server&#xff0c;此刻却发现使用 Navicat 之类的 GUI 软件无法连接&#xff0c;始终返回无法连接到 127.0.0.1 服务器。这是一个小坑&#xff0c;因为他默认使用了 Sock 套…

初级爬虫实战——哥伦比亚大学新闻

文章目录 发现宝藏一、 目标二、简单分析网页1. 寻找所有新闻2. 分析模块、版面和文章 三、爬取新闻1. 爬取模块2. 爬取版面3. 爬取文章 四、完整代码五、效果展示 发现宝藏 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不…

docker小白第十三天-compose容器编排

docker-compose容器编排 Docker-Compose是Docker官方的开源项目&#xff0c;负责实现对Docker容器集群的快速编排。Compose是Docker公司推出的一个工具软件&#xff0c;可以管理多个Docker容器组成一个应用。你需要定义一个YAML格式的配置文件docker-compose.yml&#xff0c;写…

信驰达车规蓝牙模块RF-BM-2642QB1I赋能汽车T-Box

近年来&#xff0c;随着人们对数据传输需求的增长&#xff0c;传统网络布线的通讯方式逐渐显现出满足不了的局限性&#xff0c;与此同时&#xff0c;各种无线传输技术迅速发展。汽车工业同样需要无线通讯技术&#xff0c;但红外技术、802.11、HomeRF等技术在汽车工业中存在一定…