sentinel新手入门安装和限流,热点的使用

news2025/4/18 15:37:40

1 sentinel入门

1.1下载sentinel控制台

🔗sentinel管理后台官方下载地址

在这里插入图片描述

下载完毕以后就会得到一个jar包

1.2启动sentinel

  • 将jar包放到任意非中文目录,执行命令:
java -jar  名字.jar
  • 如果要修改Sentinel的默认端口、账户、密码,可以通过下列配置:
配置项默认值说明
server.port8080服务端口
sentinel.dashboard.auth.usernamesentinel默认用户名
sentinel.dashboard.auth.passwordsentinel默认密码
  • 例如,修改端口,用户名和密码
java -Dserver.port=8000 \
     -Dsentinel.dashboard.auth.username=sentinel \
     -Dsentinel.dashboard.auth.password=cgj1223. \
     -jar 名字.jar

-D 参数的理解,你可以理解为它在做“Define”的事 —— 定义一个系统级属性。
📌 举个例子:

-Dserver.port=8000

➡️ 在 Java 程序里可以这样获取:

String port = System.getProperty("server.port");

在我的mac上本地运行,参数全部默认
在这里插入图片描述
在这里插入图片描述

在远程linux运行也一样,需要保证有java的环境, 然后通过ip+端口访问即可
在linux加上 nohup 即使退出终端也可以正常访问

nohup java -Dserver.port=8000      -Dsentinel.dashboard.auth.username=sentinel      -Dsentinel.dashboard.auth.password= 你的密码.      -jar sentinel-dashboard-1.8.8.jar 

1.2 访问sentinel

访问http://localhost:8080页面,就可以看到sentinel的控制台了:

需要输入账号和密码,默认都是:sentinel

登录后,发现一片空白,什么都没有:因为还没有监控任何服务。另外,sentinel是懒加载的,如果服务没有访问,看不到该服务信息。
在这里插入图片描述

1.4 idea整合sentinel

快速入门(直接模式)

1、引入sentinel依赖(在想要被流控的模块)

<!--sentinel-->
<dependency>
    <groupId>com.alibaba.cloud</groupId> 
    <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>

2、配置控制台
修改application.yaml文件,添加下面内容

spring:
  cloud:
    sentinel:
      transport:
        dashboard: ip:端口  # 配置sentinel控制台地址

3、访问引入依赖的微服务的任意接口后,sentinel 才会显示. 我点刷新点了5次
在这里插入图片描述

在这里插入图片描述

2 流量控制

限流是避免服务因突发的流量而发生故障,是对微服务雪崩问题的预防

2.1 相关概念

簇点链路:当请求进入微服务时,首先会访问DispatcherServlet(Spring MVC 架构的核心控制器,负责处理 HTTP 请求并将其转发到相应的处理器Controller),然后进入Controller、Service、Mapper,这样的一个调用链就叫做簇点链路。

资源:簇点链路中被监控的每一个接口就是一个资源,流控、熔断等都是针对簇点链路中的资源来设置的。

默认情况下sentinel会监控spring mvc的每一个端点(Endpoint,也就是controller中的方法),因此spring mvc的每一个端点就是调用链路中的一个资源。

例如,我们刚才访问的spzx-cloud-user中的UserController中的端点:/api/user/selectByUserId/{userId}

我们可以点击对应资源后面的按钮来设置规则:

1、流控:流量控制

2、降级:降级熔断

3、热点:热点参数限流,是限流的一种

4、授权:请求的权限控制

2.2 快速入门

需求:给 /api/user/selectByUserId/{userId}这个资源设置流控规则,QPS不能超过 2( 这里直接人工手点,不使用工具测试, 可以设置的低一点),然后测试。

步骤:

1、首先在sentinel控制台添加限流规则
在这里插入图片描述
在这里插入图片描述
浏览器手动进行测试 多刷几次
在这里插入图片描述

2、利用jmeter测试(如果你设置的比较大,那么就需要用工具在进行测试,模拟并发请求) 我更改为QPS为5

Apache JMeter 是 Apache 组织基于 Java 开发的压力测试工具,用于对软件做压力测试
🔗官网下载地址
🔗csdn我上传的文件

通过如下命令打开jmeter

java -jar ApacheJMeter.jar

在这里插入图片描述
🔗要导入测试文件的地址
在这里插入图片描述
在这里插入图片描述
选择流控入门
在这里插入图片描述
在这里插入图片描述

10个线程,1秒内运行完,QPS是10,超过了5。

选中流控入门,QPS<5右键运行
在这里插入图片描述

可以看到,成功的请求每次只有5个。
在这里插入图片描述
注意:如果测试结果不是上述情况,那是因为sentinel在统计请求的时候,把一部分的请求统计到了下一秒中导致的。

流控模式简介

在添加限流规则时,点击高级选项,可以选择三种流控模式

1、直接:统计当前资源的请求,触发阈值时对当前资源直接限流,也是默认的模式

2、关联:统计与当前资源相关的另一个资源,触发阈值时,对当前资源限流

3、链路:统计从指定链路访问到本资源的请求,触发阈值时,对指定链路限流

如下所示:
在这里插入图片描述

2.3 关联模式

关联模式:统计与当前资源相关的另一个资源,触发阈值时,对当前资源限流.
语法说明:对/api/user/updateUserById资源的请求进行统计,当访问流量超过阈值时,就对/api/user/selectByUserId/{userId}进行限流,避免影响/api/user/updateUserById资源。

使用场景:比如用户支付时需要修改订单状态,同时用户要查询订单。查询和修改操作会争抢数据库锁,产生竞争。业务需求是优先支付和更新订单的业务,因此当修改订单业务触发阈值时,需要对查询订单业务限流。

案例实现:

1、在UserController新建一个端点:/api/user/updateUserById,无需实现业务

// 修改用户数据端点
@GetMapping(value = "/updateUserById")
public String updateUserById() {
    return "修改用户数据成功";
}

2、重启服务,访问对应的端点,让其产生簇点链路
在这里插入图片描述

3、配置流控规则,当/api/user/updateUserById资源被访问的QPS超过5时,对/api/user/selectByUserId/{UserId}请求限流。**对哪个端点限流,就点击哪个端点后面的按钮。**我们是对用户查询/api/user/selectByUserId/{userId}限流,因此点击它后面的按钮:
在这里插入图片描述
在这里插入图片描述

4、在Jmeter中进行测试
在这里插入图片描述
但是访问查询接口,直接就被限流了,可以看到1000个线程,100秒,因此QPS为10,超过了我们设定的阈值5:
请求的目标是/api/user/updateUserById,这样这个端点就会触发阈值。但限流的目标是/api/user/selectByUserId/{userId},我们在浏览器访问,可以发现:
在这里插入图片描述

关联流控模式的使用场景:

1、两个有竞争关系的资源

2、一个优先级较高,一个优先级较低

对高优先级的资源的流量进行统计,当超过阈值对低优先级的资源进行限流。

2.4链路模式

链路模式:只针对从指定链路访问到本资源的请求做统计,判断是否超过阈值,如果超过阈值对从该链路请求进行限流。
案例实现:
/api/user/save --> users
/api/user/query --> users
都访问的是users资源, 目标 只对从/api/user/query这个接口来的进行限流

1、在UserService中添加一个queryUsers方法(共用的资源),不用实现业务

// 用来当被不同链路访问的资源
@SentinelResource("users")
public void queryUsers(){
    System.out.println("查询用户");
}

2、在UserController中,添加两个端点,在这两个端点中分别调用UserService中的queryUsers方法

//链路一
@GetMapping(value = "/save")
public String save() {
    userService.queryUsers();
    System.out.println("保存用户");
    return "订单保存成功" ;
}
//链路二
@GetMapping(value = "/query")
public String query() {
    userService.queryUsers();
    System.out.println("查询用户");
    return "查询用户成功" ;
}

4、通过**@SentinelResource**标记UserService中的queryUsers方法为一个sentinel监控的资源(默认情况下,sentinel只监控controller方法)

5、更改application.yml文件中的sentinel配置

链路模式中,是对不同来源的两个链路做监控。但是sentinel默认会给进入spring mvc的所有请求设置同一个root资源,会导致链路模式失效。因此需要关闭这种资源整合。

spring:
  cloud:
    sentinel:
      web-context-unify: false # 关闭context整合

6、重启服务,访问/api/user/save和/api/user/query,可以查看到sentinel的簇点链路规则中,出现了新的资源

在这里插入图片描述

7、添加流控规则
点击users资源后面的流控按钮(那个都行,因为是同一个资源)
只统计从/api/user/query进入/users的资源,QPS阈值为2,超出则被限流。

8、jmeter测试
在这里插入图片描述

  • /api/user/save 没有被限流

在这里插入图片描述

  • /api/user/query 被限流了
    在这里插入图片描述

3 流控效果

在这里插入图片描述

流控效果是指请求达到流控阈值时应该采取的措施,包括三种:

1、快速失败:达到阈值后,新的请求会被立即拒绝并抛出FlowException异常,是默认的处理方式 (第一个入门案例就是)

2、warm up:预热模式,对超出阈值的请求同样是拒绝并抛出异常,但这种模式阈值会动态变化,从一个较小值逐渐增加到最大阈值

3、排队等待:让所有的请求按照先后次序进入到一个队列中进行排队,当某一个请求最大的预期等待时间超过了所设定的超时时间时同样是拒绝并抛出异常

3.1 warm up

阈值一般是一个微服务能承担的最大QPS,但是一个服务刚刚启动时,一切资源尚未初始化(冷启动),如果直接将QPS跑到最大值,可能导致服务瞬间宕机。

warm up也叫预热模式,是应对服务冷启动的一种方案。阈值会动态变化,从一个较小值逐渐增加到最大阈值。

工作特点:请求阈值初始值是 maxThreshold / coldFactor, 持续指定时长(预热时间)后,逐渐提高到maxThreshold值,而coldFactor的默认值是3。

例如,我设置QPS的maxThreshold为10,预热时间为5秒,那么初始阈值就是 10 / 3 ,也就是3,然后在5秒后逐渐增长到10。)

案例需求:给api/user/query这个资源设置限流,最大QPS为10,利用warm up效果,预热时长为5秒

1、配置流控规则

在这里插入图片描述

2、jmeter测试

选择《流控效果,warm up》

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

到sentinel控制台查看实时监控
在这里插入图片描述

3.2排队等待

排队等待: 让所有的请求按照先后次序进入到一个队列中进行排队,当某一个请求最大的预期等待时间超过了所设定的超时时间时同样是拒绝并抛出异常

例如:QPS = 5,意味着每200ms处理一个队列中的请求;timeout = 2000,意味着预期等待时长超过2000ms的请求会被拒绝并抛出异常。

那什么叫做预期等待时长呢?

比如现在一下子来了12 个请求,因为每200ms执行一个请求,那么:

1、第6个请求的预期等待时长 = 200 * (6 - 1) = 1000ms

2、第12个请求的预期等待时长 = 200 * (12-1) = 2200ms
在这里插入图片描述

4热点参数限流

配置介绍

之前的限流是统计访问某个资源的所有请求,判断是否超过QPS阈值。而热点参数限流是分别统计参数值相同的请求,判断是否超过QPS阈值。

案例演示

案例需求:给/api/user/selectByUserId/{userId}这个资源添加热点参数限流,规则如下:

1、默认的热点参数规则是每1秒请求量不超过2

2、给2这个参数设置例外:每1秒请求量不超过4

3、给3这个参数设置例外:每1秒请求量不超过10

注意事项:热点参数限流对默认的spring mvc资源无效,需要利用@SentinelResource注解标记资源

实现步骤:

1、标记资源

给UserController中的/api/user/selectByUserId/{userId}资源添加注解:
在这里插入图片描述

2、热点参数限流规则

访问该接口,可以看到我们标记的hot资源出现了
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3、jmeter测试

在这里插入图片描述

![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/7bc9ec47d55b4204b6110602886f84cd.png
在这里插入图片描述

在这里插入图片描述

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

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

相关文章

Ubuntu 22 Linux上部署DeepSeek R1保姆式操作详解(Xinference方式)

一、安装步骤 1.基础环境安装 安装显卡驱动、cuda&#xff0c;根据自己硬件情况查找相应编号&#xff0c;本篇不介绍这部分内容&#xff0c;只给出参考指令&#xff0c;详情请读者自行查阅互联网其它参考资料。 sudo apt install nvidia-utils-565-server sudo apt install…

CTF类题目复现总结-hashcat 1

一、题目地址 https://buuoj.cn/challenges#hashcat二、复现步骤 1、下载附件&#xff0c;解压得到What kind of document is this_文件&#xff1b; 2、用010 Editor打开What kind of document is this_文件&#xff0c;发现是office文件&#xff1b; 3、将后缀名改为ppt时…

4月5日作业

需求&#xff1a; 1.按照图示的VLAN及IP地址需求&#xff0c;完成相关配置 2.要求SW 1为VLAN 2/3的主根及主网关 SW2为VLAN 20/30的主根及主网关&#xff0c;SW1和 SW2互为备份 3.可以使用super vlan 4.上层通过静态路由协议完成数据通信过程 5.AR1为企业出口路由器…

Bert论文解析

文章目录 BERT&#xff1a;用于语言理解的深度双向转换器的预训练一、摘要三、BERT介绍BERT及其详细实现答疑&#xff1a;为什么没有标注的数据可以用来预训练模型&#xff1f;1. 掩码语言模型&#xff08;Masked Language Model, MLM&#xff09;2. 下一句预测&#xff08;Nex…

无招回归阿里

这两天&#xff0c;无招回归阿里的新闻被刷屏了。无招创业成立的两氢一氧公司无招的股份也被阿里收购&#xff0c;无招以这种姿态回归阿里&#xff0c;并且出任钉钉的 CEO。有人说&#xff0c;这是对 5 年前“云钉一体”战略的纠偏。现在确实从云优先到 AI 优先&#xff0c;但云…

初探:简道云平台架构及原理

一、系统架构概述 简道云作为一款低代码开发平台&#xff0c;其架构设计以模块化和云端协同为核心&#xff0c;主要分为以下层次&#xff1a; 1. 前端层 可视化界面&#xff1a;基于Web的拖拽式表单设计器&#xff0c;支持动态渲染&#xff08;React/Vue框架&#xff09;。多…

Redis(笔记)

简介&#xff1a; 常用数据类型: 常用操作命令&#xff1a; Redis的Java客户端&#xff1a; 操作字符串类型的数据&#xff1a; 操作Hash类型的数据&#xff1a; 操作列表类型的数据&#xff1a; 操作集合类型的数据&#xff1a; 操作有序集合类型数据&#xff1a; 通用命令…

bootloader+APP中,有些APP引脚无法正常使用?

问&#xff1a;bootloaderAPP程序中&#xff0c;为什么有些APP引脚无法正常使用&#xff1f;无法设置高低电平 主控芯片GD32F415&#xff0c;参考案例bootloader中的引脚使用&#xff1a; 参考案例APP程序的引脚使用&#xff1a; 以及个人使用的无线模组&#xff0c;高电平使能…

高并发内存池:原理、设计与多线程性能优化实践

高并发内存池是一种专门为多线程环境设计的内存管理机制&#xff0c;其核心目标是通过优化内存分配和释放过程&#xff0c;解决传统内存分配器&#xff08;如malloc/free&#xff09;在高并发场景下的性能瓶颈&#xff0c;显著提升多线程程序的内存访问效率。 目录 一、核心设计…

基于内容的课程推荐网站的设计与实现00(SSM+htmlL)

基于内容的课程推荐网站的设计与实现(SSMhtml) 该系统是一个基于内容的课程推荐网站&#xff0c;旨在为用户提供个性化的课程推荐。系统包含多个模块&#xff0c;如教学视频、教学案例、课程信息、系统公告、个人中心和后台管理。用户可以通过首页访问不同的课程分类&#xff…

生活电子常识--删除谷歌浏览器搜索记录

前言 谷歌浏览器会记录浏览器历史搜索,如果不希望看到越来越多的搜索记录,可以如下设置 解决 设置-隐私-自动填充表单 这个和浏览器记录的密码没有关系,可以放心删除

学习threejs,使用Texture纹理贴图,测试repeat重复纹理贴图

&#x1f468;‍⚕️ 主页&#xff1a; gis分享者 &#x1f468;‍⚕️ 感谢各位大佬 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍⚕️ 收录于专栏&#xff1a;threejs gis工程师 文章目录 一、&#x1f340;前言1.1 ☘️Texture 纹理贴图1.1.1 ☘️…

蓝桥杯基础算法-字符串与集合

对集合的考察集中在集合的特性和功能。 set-唯一性 list-有序性 集合元素的个数 思路分析&#xff1a;set的唯一性&#xff0c;取出重复的子串 eg&#xff1a; 下标0截取的范围&#xff1a;【0&#xff0c;最大下标】 下标1截取的范围&#xff1a;【1&#xff0c;最大下标…

animals_classification动物分类

数据获取 深度学习训练中第一个是获取数据集&#xff0c;数据集的质量很重要&#xff0c;我们这里做的是动物分类&#xff0c;大致会选择几个动物&#xff0c;来做一个简单的多分类问题&#xff0c;数据获取的方法&#xff0c;鼠鼠我这里选择使用爬虫的方式来对数据进行爬取&a…

解决Oracle PL/SQL中“表或视图不存在“错误的完整指南

解决Oracle PL/SQL中"表或视图不存在"错误的完整指南 前言问题概述根本原因分析一、 编译时与运行时验证差异二、权限问题三、 Schema命名问题 实际案例演示案例1&#xff1a;动态分表查询案例2&#xff1a;权限不足的场景 实用排查步骤排查流程图最佳实践建议解决方…

SSH远程连接服务器(cursor)

安装Remote-SSH插件 Cursor是基于VSCode的&#xff0c;因此支持VSCode的Remote-SSH功能。打开Cursor&#xff0c;进入扩展市场&#xff08;左侧活动栏的“Extensions”图标&#xff09;。搜索“Remote - SSH”插件并安装&#xff08;由Microsoft提供&#xff09;。 配置SSH 在…

idea gitlab 操作

1.拉取脚本 账号登录 就可以获取git代码 2. 版本回退 hard暴力回退到暂存区 缓存区消失 3.版本合并 切换到目标分区 选择点击开发分区 进行合并

【MATLAB第113期】基于MATLAB的EFAST扩展傅里叶幅度敏感性分析方法(有目标函数)

【MATLAB第113期】基于MATLAB的EFAST扩展傅里叶幅度敏感性分析方法&#xff08;有目标函数&#xff09; 一、方法概述 扩展傅里叶幅度敏感性检验&#xff08;EFAST&#xff09;是一种基于频域分析的全局敏感性分析方法&#xff0c;能够同时评估模型参数的一阶敏感性&#xff…

Unity3D开发AI桌面精灵/宠物系列 【三】 语音识别 ASR 技术、语音转文本多平台 - 支持科大讯飞、百度等 C# 开发

Unity3D 交互式AI桌面宠物开发系列【三】ASR 语音识别 该系列主要介绍怎么制作AI桌面宠物的流程&#xff0c;我会从项目开始创建初期到最终可以和AI宠物进行交互为止&#xff0c;项目已经开发完成&#xff0c;我会仔细梳理一下流程&#xff0c;分步讲解。 这篇文章主要讲有关于…

Qt -信号与槽

博客主页&#xff1a;【夜泉_ly】 本文专栏&#xff1a;【暂无】 欢迎点赞&#x1f44d;收藏⭐关注❤️ 目录 前言引入connect调用链模板类型的connectQObject::connectImplQObjectPrivate::connectImpl qobject_p_p.hconnect作用总结ai对信号与槽的模拟实现 前言 面向对象&am…