当前位置: 首页 > news >正文

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

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.mrgr.cn/news/97341.html

相关文章:

  • 003集——《利用 C# 与 AutoCAD API 开发 WPF 随机圆生成插件》(侧栏菜单+WPF窗体和控件+MVVM)
  • Gerapy二次开发:用户管理专栏页面样式与功能设计
  • 2024 天梯赛——工业园区建设题解
  • C++ 内存访问模式优化:从架构到实践
  • 协同控制与分布式控制 —— 理论、案例与交互式 GUI 实现
  • 进程内存分布--之理论知识
  • 从零实现本地大模型RAG部署
  • 小刚说C语言刷题——第16讲 switch语句
  • 【Linux学习笔记】初识进程概念和进程PCB
  • 构建企业级表单验证系统:可配置化验证器设计与实现
  • C语言中单向链表:创建节点与插入新节点
  • btrfs , ext4 , jfs , xfs , zfs 对比 笔记250406
  • 基于BP神经网络的杂草智能识别系统(杂草识别、Python项目)
  • pulsar中的延迟队列使用详解
  • 消息队列基础概念及选型,常见解决方案包括消息可靠性、消息有序、消息堆积、重复消费、事务消息
  • 整车CAN网络和CANoe
  • C# Winform 入门(12)之制作简单的倒计时
  • WEB安全--内网渗透--LMNTLM基础
  • 计算机系统--- BIOS(基本输入输出系统)
  • JCR一区文章,壮丽细尾鹩莺算法Superb Fairy-wren Optimization-附Matlab免费代码