【分布式流控组件 Sentinel 快速入门】——图文详解操作流程

在这里插入图片描述

                                                                          💧 分布式流控组件 S e n t i n e l 快速入门 \color{#FF1493}{分布式流控组件 Sentinel 快速入门} 分布式流控组件Sentinel快速入门💧          


🌷 仰望天空,妳我亦是行人.✨
🦄 个人主页——微风撞见云的博客🎐
🐳 《数据结构与算法》专栏的文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~🌺
💧 《Java学习笔记》专栏的文章是本人在Java学习中总结的一些知识点~ 💐
🥣 《每天一点小知识》专栏的文章可以丰富你的知识库,滴水成河~ 🌊
🎐 《Redis》专栏的文章是在学习Redis时,整理的笔记与记录的思考~ 🥏
🥕 《RabbitMQ》专栏的文章是在学习尚硅谷课程时整理的笔记,方便复习巩固~ 🍑
🪁 希望本文能够给读者带来一定的帮助~🌸文章粗浅,敬请批评指正!🐥


文章目录

  • 🐳Sentinel快速入门:图文讲解操作流程
    • 1. Sentinel简介
    • 2. 安装Sentinel控制台
    • 3. @SentinelResource注解
    • 4. Sentinel的使用配置
    • 5. Sentinel流控规则
    • 6. Sentinel服务降级
    • 7. Sentinel热点key限流
    • 8. Sentinel系统规则
    • 9. 总结
  • 🐳结语


🐳Sentinel快速入门:图文讲解操作流程

1. Sentinel简介

Sentinel是阿里巴巴开源的分布式系统的流量控制组件,旨在保护分布式系统在高并发和故障情况下的稳定性。它提供了实时的流量控制、熔断降级、系统负载保护等功能,是微服务架构中不可或缺的一环。

在这里插入图片描述

2. 安装Sentinel控制台

💧Sentinel控制台是Sentinel的管理工具,可以帮助您监控和管理Sentinel的各种规则和限制。安装步骤如下:

  • 下载Sentinel控制台的jar包
  • 运行命令:java -jar sentinel-dashboard-xxx.jar

在这里插入图片描述

  • 启动nacos作为服务注册中心

在这里插入图片描述

3. @SentinelResource注解

💧注解@SentinelResource用于标记受Sentinel保护的资源,可以定义资源的限流和降级策略。

@SentinelResource(value = "protectedResource", blockHandler = "handleBlock", fallback = "handleFallback")
public void protectedResource() {// 处理受保护的资源逻辑
}public void handleBlock(BlockException ex) {// 处理流控逻辑
}public void handleFallback(Throwable ex) {// 处理降级逻辑
}

4. Sentinel的使用配置

💧在使用Sentinel之前,我们需要在应用程序中进行配置。例如,在Spring Cloud项目中,添加Sentinel的依赖,并配置相关参数。通常需要结合nacos一起使用:

	    <!--SpringCloud ailibaba nacos --><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency><!--SpringCloud ailibaba sentinel --><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-sentinel</artifactId></dependency>

💧然后,在application.yml中配置Sentinel相关参数,这样,nacos8080 将会监控 8401服务

server:port: 8401spring:application:name: cloudalibaba-sentinel-servicecloud:nacos:discovery:server-addr: localhost:8848 #Nacos服务注册中心地址sentinel:transport:dashboard: localhost:8080 #配置Sentinel dashboard地址port: 8719datasource: #<---------------------------关注点,添加Nacos数据源配置ds1:nacos:server-addr: localhost:8848dataId: cloudalibaba-sentinel-servicegroupId: DEFAULT_GROUPdata-type: jsonrule-type: flow

💧添加几个方法用于测试

@RestController
@Slf4j
public class FlowLimitController {@GetMapping("/testA")public String testA() {/* try {TimeUnit.MILLISECONDS.sleep(800);} catch (InterruptedException e) {e.printStackTrace();}*/return "------testA";}@GetMapping("/testB")public String testB() {log.info(Thread.currentThread().getName() + "\t" + "...testB");return "------testB";}@GetMapping("/testD")public String testD() {try {TimeUnit.SECONDS.sleep(1);} catch (InterruptedException e) {e.printStackTrace();}log.info("testD 测试RT");return "------testD";}@GetMapping("/testE")public String testE() {log.info("testE 测试异常数");int age = 10 / 0;return "------testE 测试异常数";}@GetMapping("/testHotKey")@SentinelResource(value = "testHotKey", blockHandler/*兜底方法*/ = "deal_testHotKey")public String testHotKey(@RequestParam(value = "p1", required = false) String p1,@RequestParam(value = "p2", required = false) String p2) {//int age = 10/0;return "------testHotKey";}/*兜底方法*/public String deal_testHotKey(String p1, String p2, BlockException exception) {return "------deal_testHotKey,o(╥﹏╥)o";  //sentinel系统默认的提示:Blocked by Sentinel (flow limiting)}}

💧运行主启动类

@EnableDiscoveryClient
@SpringBootApplication
public class MainApp8401 {public static void main(String[] args) {SpringApplication.run(MainApp8401.class, args);}
}

💧访问控制台:http://localhost:8080 ,默认账号密码均为: sentinel

在这里插入图片描述

💧由于Sentinel采用了懒加载机制,我们不访问URL的话是不会出现监控服务的

💧访问 http://localhost:8401/testA 多刷几次看看效果

在这里插入图片描述

💧刷新sentinel,观察结果

在这里插入图片描述

💧簇点链路部分可以看到我们访问过的URL对应的方法

在这里插入图片描述

5. Sentinel流控规则

💧流控规则用于限制资源的访问速率,防止系统被过多请求拖垮。例如,我们可以设置一个API在一分钟内最多只能处理100个请求:

  • 资源名:唯一名称。默认请求路径
  • 针对来源: Sentinel可以针对调用者进行限流,填写微服务名,默认default(不区分来源)
  • 阈值类型/单机阔值:
    • QPS(每秒钟的请求数量):当调用该api的QPS达到阔值的时候,进行限流。
    • 线钱程数:当调用该api伯9美程数认到阈值的时候。进行限流
  • 是否集群:不需要集群
  • 流控模式:
    • 直接: api达到限流尔件时,直接限流
    • 关联:当关联的资源达到阔值时。就限流自己
    • 链路:只记录指定链路上的流量(指定资源从入口资源进来的流量,如果达到阈值,就进行限流)【api级别的针对来源】
  • 流控效果:
    • 快速失败:直接失败,抛异常
    • Warm up:根据codeFactor (冷加载因子,默认3)的值,从阈值/codeFactor,经过预热时长,才达到设置的QPS阈值。

💧添加流控规则

  • 方法1

在这里插入图片描述

  • 方法2

在这里插入图片描述

💧新增流控规则

在这里插入图片描述
在这里插入图片描述

💧再次访问 http://localhost:8401/testA 每秒点两次,直接限流

在这里插入图片描述

💧修改规则

在这里插入图片描述

💧修改代码

在这里插入图片描述

💧开两个线程,分别狂点

在这里插入图片描述

💧再次限流

在这里插入图片描述

💧当关联资源/testB的qps阀值超过1时,就限流/testA的Rest访问地址

在这里插入图片描述

💧使用postman 模拟连续密集访问testB

💧新建collection

在这里插入图片描述

💧点击Run 配置发送规则

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

💧此时访问testA,发现已经挂了,产生了连坐效应

在这里插入图片描述

💧预热冷启动,效果:刚开始点太快不行,等预热时间到了就可以正常访问

在这里插入图片描述

💧排队等待,一秒一个

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

6. Sentinel服务降级

💧服务降级是应对系统高并发时的一种保护措施。当资源的异常比例超过阈值时,系统将自动对该资源进行降级,避免系统崩溃。

💧测试代码:
在这里插入图片描述
💧新增降级规则

在这里插入图片描述
💧打开JMeter

在这里插入图片描述

💧添加线程组

在这里插入图片描述
在这里插入图片描述

💧点击运行

在这里插入图片描述

💧此时访问:http://localhost:8401/testE,服务已降级

在这里插入图片描述

💧停掉JMeter后,再次访问,不会降级,展示不友好的ERROR页面

在这里插入图片描述
💧异常数,时间要大于60s

在这里插入图片描述

💧快速请求五次testE,服务降级

在这里插入图片描述

7. Sentinel热点key限流

💧热点key限流用于对一些热点资源进行限制,防止因某个热点资源过于频繁访问而导致系统故障。

何为热点?热点即经常访问的数据。很多时候我们希望统计某个热点数据中访问频次最高的TopK数据,并对其访问进行限制。比如:

  • 商品ID为参数,统计—段时间内最常购买的商品ID并进行限制
  • 用户ID为参数,针对—段时间内频繁访问的用户ID进行限制

热点参数限流会统计传入参数中的热点参数,并根据配置的限流阈值与模式,对包含热点参数的资源调用进行限流。热点参数限流可以看做是一种特殊的流量控制,仅对包含热点参数的资源调用生效。

Sentinel利用LRU策略统计最近最常访问的热点参数,结合令牌桶算法来进行参数级别的流控。热点参数限流支持集群模式。

💧自定义兜底降级方法,@SentinelResource

在这里插入图片描述

💧访问一下:http://localhost:8401/testHotKey

在这里插入图片描述

💧添加限流规则

在这里插入图片描述

💧连续点击两次:http://localhost:8401/testHotKey?p1=a,限流,走兜底方法

在这里插入图片描述

💧如果我们配置了限流规则,但不添加兜底方案,那么被触发限流机制后就会直接报500

💧添加“参数例外项”,即使我们触发了上面的限流,但如果这个参数值是我们特殊指定的,则会走特殊通道

在这里插入图片描述
💧我们疯狂访问:http://localhost:8401/testHotKey?p1=5,没有任何问题。

💧而把5改为3,则依然限流,走兜底方法

在这里插入图片描述

8. Sentinel系统规则

💧系统规则是Sentinel的全局配置,可以对整个系统的资源进行限制,例如线程数、CPU使用率等。

系统保护规则是从应用级别的入口流量进行控制,从单台机器的 load、CPU使用率、平均RT、入口QPS和并发线程数等几个维度监控应用指标,让系统尽可能跑在最大吞吐量的同时保证系统整体的稳定性。
系统保护规则是应用整体维度的,而不是资源维度的,并且仅对入口流量生效。入口流量指的是进入应用的流量( EntryType.IN ),比如 Web服务或Dubbo服务端接收的请求,都属于入口流量。系统规则支持以下的模式:

  • Load自适应(仅对Linux/Unix-like机器生效):系统的 load1作为启发指标。进行自适应系统
    保护。当系统load1超过设定的启发值,且系统当前的并发线程数超过估算的系统容量时才会触发系统保护(BBR阶段)。系统容量由系统的maxOps * minRt估算得出。设定参考值一般是cpu cores * 2.5。
  • CPU usage (1.5.0+版本)︰当系统CPU使用率超过阈值即触发系统保护(取值范围0.0-1.0) ,比较灵敏。
  • 平均RT:当单台机器上所有入口流量的平均RT达到阈值即触发系统保护,单位是毫秒。
  • 并发线程数:当单台机器上所有入口流量的并发线程数达到阈值即触发系统保护。
  • 入口QPS:当单台机器上所有入口流量的QPS达到阈值即触发系统保护。

在这里插入图片描述

💧测试限流,添加 RateLimitController 和 公共类

@RestController
public class RateLimitController {@GetMapping("/byResource")@SentinelResource(value = "byResource", blockHandler = "handleException")public CommonResult byResource() {return new CommonResult(200, "按资源名称限流测试OK", new Payment(2020L, "serial001"));}public CommonResult handleException(BlockException exception) {return new CommonResult(444, exception.getClass().getCanonicalName() + "\t 服务不可用");}@GetMapping("/rateLimit/byUrl")@SentinelResource(value = "byUrl")public CommonResult byUrl() {return new CommonResult(200, "按url限流测试OK", new Payment(2020L, "serial002"));}@GetMapping("/rateLimit/customerBlockHandler")@SentinelResource(value = "customerBlockHandler",blockHandlerClass = CustomerBlockHandler.class,//<-------- 自定义限流处理类blockHandler = "handlerException2")//<-----------public CommonResult customerBlockHandler() {return new CommonResult(200, "按客戶自定义", new Payment(2020L, "serial003"));}}
@Data
@AllArgsConstructor
@NoArgsConstructor
public class CommonResult<T>{private Integer code;private String message;private T data;public CommonResult(Integer code, String message){this(code, message, null);}
}
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Payment implements Serializable {private Long id;private String serial;
}

访问http://localhost:8401/byResource
在这里插入图片描述
💧新增流控规则

在这里插入图片描述
💧连续快速访问,限流,走兜底方法

在这里插入图片描述
💧如果我们关闭服务,限流规则也随之消失(体现出临时性)

💧测试一下,没有兜底方法的

在这里插入图片描述

💧添加限流规则

在这里插入图片描述

💧如果没有写兜底方法blockHandler,则依然走系统默认兜底

在这里插入图片描述

💧创建CustomerBlockHandler类,自定义限流处理逻辑

/*** @Author: LiangXinRui* @Date: 2023/08/4/17:51* @Description:*/
import com.alibaba.csp.sentinel.slots.block.BlockException;
import com.atguigu.springcloud.entities.CommonResult;public class CustomerBlockHandler {public static CommonResult handlerException(BlockException exception) {return new CommonResult(4444,"按客戶自定义,global handlerException----1");}public static CommonResult handlerException2(BlockException exception) {return new CommonResult(4444,"按客戶自定义,global handlerException----2");}
}

💧测试这个方法

在这里插入图片描述

💧访问:http://localhost:8401/rateLimit/customerBlockHandler

在这里插入图片描述

💧新增流控规则

在这里插入图片描述

💧一秒访问两次:

在这里插入图片描述

9. 总结

希望本篇博客能够带你一步一步完成Sentinel的入门,从而在微服务架构中有效地保护系统的稳定性和可用性。

在这里插入图片描述


🐳结语

🐬初学一门技术时,总有些许的疑惑,别怕,它们是我们学习路上的点点繁星,帮助我们不断成长。

🐟积少成多,滴水成河。文章粗浅,希望对大家有帮助!

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

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

相关文章

智慧工地云平台源码,基于微服务+Java+Spring Cloud +UniApp +MySql开发

智慧工地可视化系统利用物联网、人工智能、云计算、大数据、移动互联网等新一代信息技术&#xff0c;通过工地中台、三维建模服务、视频AI分析服务等技术支撑&#xff0c;实现智慧工地高精度动态仿真&#xff0c;趋势分析、预测、模拟&#xff0c;建设智能化、标准化的智慧工地…

华为云交付

文章目录 一、华为云-公有云架构华为公有云的主要服务1.华为云服务—计算类2.华为云服务——存储类3.华为云服务—网络类4.华为云服务—管理和监督类5.华为云数据库 二、待续 一、华为云-公有云架构 华为公有云的主要服务 ECS&#xff1a;弹性云服务器&#xff08; Elastic Cl…

穷举深搜暴搜回溯剪枝(3)

一)字母大小写全排列 784. 字母大小写全排列 - 力扣&#xff08;LeetCode&#xff09; 1)从每一个字符开始进行枚举&#xff0c;如果枚举的是一个数字字符&#xff0c;直接忽视 如果是字母的话&#xff0c;进行选择是变还是不变 2)当进行遍历到叶子结点的时候&#xff0c;直接将…

(三)Node.js - 模块化

1. Node.js中的模块化 Node.js中根据模块来源不同&#xff0c;将模块分为了3大类&#xff0c;分别是&#xff1a; 内置模块&#xff1a;内置模块由Node.js官方提供的&#xff0c;例如fs、path、http等自定义模块&#xff1a;用户创建的每个.js文件&#xff0c;都是自定义模块…

jmeter 5.1彻底解决中文上传乱码

1.修改源码,然后重新打jar包,就是所有上传文件名重新获取文件名 参考链接:多种Jmeter中文乱码问题处理方法 - 51Testing软件测试网 2.修改Advanced,必须选java

RaabitMQ(三) - RabbitMQ队列类型、死信消息与死信队列、懒队列、集群模式、MQ常见消息问题

RabbitMQ队列类型 Classic经典队列 这是RabbitMQ最为经典的队列类型。在单机环境中&#xff0c;拥有比较高的消息可靠性。 经典队列可以选择是否持久化(Durability)以及是否自动删除(Auto delete)两个属性。 Durability有两个选项&#xff0c;Durable和Transient。 Durable表…

【ARM Coresight 系列文章 2.5 - Coresight 寄存器:PIDR0-PIDR7,CIDR0-CIDR3 介绍】

文章目录 1.1 JEDEC 与 JEP1061.2 PIDR0-PIDR7(peripheral identification registers)1.2 CIDR0-CIDR3(Component Identification Registers) 1.1 JEDEC 与 JEP106 JEDEC和JEP106都是来自美国电子工业联合会&#xff08;JEDEC&#xff0c;Joint Electron Device Engineering C…

深度学习(34)—— StarGAN(1)

深度学习&#xff08;34&#xff09;—— StarGAN&#xff08;1&#xff09; 文章目录 深度学习&#xff08;34&#xff09;—— StarGAN&#xff08;1&#xff09;1. 背景2. 基本思路3. 整体流程4. StarGAN v2(1) 网络结构(2) mapping network(3) style encoder(4)Loss 和之前…

4个顶级的支持消费级硬件的NeRF软件平台

似乎每天都有大量的创新发布&#xff0c;人们很容易感到不知所措。因此&#xff0c;让我们放慢脚步&#xff0c;看看4个主流的支持消费级硬件的NeRF 平台。 推荐&#xff1a;用 NSDT设计器 快速搭建可编程3D场景。 1、Instant-NGP&#xff08;Instant-NeRF&#xff09; 2022 年…

计算机网络-三种交换方式

计算机网络-三种交换方式 电路交换(Circuit Switching) 电话交换机接通电话线的方式称为电路交换从通信资源分配的角度来看&#xff0c;交换(Switching)就是按照某种方式动态的分配传输线路的资源 电话交换机 为了解决电话之间通信两两之间连线过多&#xff0c;所以产生了电话…

认识 spring AOP (面向切面编程) - springboot

前言 本篇介绍什么是spring AOP, AOP的优点&#xff0c;使用场景&#xff0c;spring AOP的组成&#xff0c;简单实现AOP 并 了解它的通知&#xff1b;如有错误&#xff0c;请在评论区指正&#xff0c;让我们一起交流&#xff0c;共同进步&#xff01; 文章目录 前言1. 什么是s…

快速制作美容行业预约小程序

随着科技的不断进步&#xff0c;移动互联网的快速发展&#xff0c;小程序成为了很多行业迅速发展的利器。对于美容行业来说&#xff0c;一款美容预约小程序不仅可以方便用户进行预约&#xff0c;还可以提升美容店铺的服务质量和管理效率。下面&#xff0c;我们来介绍一下如何快…

【云原生K8s】初识Kubernetes的理论基础

K8S由google的Borg系统(博格系统&#xff0c;google内部使用的大规模容器编排工具)作为原型&#xff0c;后经GO语言延用Borg的思路重写并捐献给CNCF基金会开源。 云原生基金会&#xff08;CNCF&#xff09;于2015年12月成立&#xff0c;隶属于Linux基金会。CNCF孵化的第一个项目…

iOS——Block循环引用

Capturing ‘self’ strongly in this block is likely to lead to a retain cycle 典型的循环引用 self持有了blockblock持有了self(self.name) 这样就形成了self -> block -> self的循环引用 解决办法 强弱共舞 使用 中介者模式 __weak typeof(self) weakSelf sel…

【Spring Boot】(二)Spring Boot 配置文件的探索之旅

文章目录 前言一、配置文件的作用二、配置文件的格式2.1 Spring Boot 配置文件格式2.2 properties 和 yml 的区别 三、properties 配置文件3.1 properties 基本语法3.2 配置文件的读取3.3 properties 优缺点分析 四、yml 配置文件说明4.1 yml 基本语法4.2 yml 使用案例4.3 yml …

fishing之第四篇使用案例一模拟登陆口

文章目录 一、访问钓鱼平台二、Sending Profiles(发件人邮箱配置)三、User&Groups(接收人邮件列表)四、Landing Pags(钓鱼页面配置)五、Email Templates(邮件内容配置)六、Campaigns七、攻击结果查看免责声明一、访问钓鱼平台 详细查看第二篇的gophish的搭建 二…

WebRTC 之音视频同步

在网络视频会议中&#xff0c; 我们常会遇到音视频不同步的问题&#xff0c; 我们有一个专有名词 lip-sync 唇同步来描述这类问题&#xff0c;当我们看到人的嘴唇动作与听到的声音对不上的时候&#xff0c;不同步的问题就出现了 而在线会议中&#xff0c; 听见清晰的声音是优先…

Java窗体应用程序人事管理系统web人资招聘员工劳资jsp源代码mysql

本项目为前几天收费帮学妹做的一个项目&#xff0c;Java EE JSP项目&#xff0c;在工作环境中基本使用不到&#xff0c;但是很多学校把这个当作编程入门的项目来做&#xff0c;故分享出本项目供初学者参考。 一、项目描述 Java窗体应用程序人事管理系统 注意&#xff1a;此项…

迅为全国产龙芯3A5000电脑运行统信UOS、银河麒麟、loongnix系统

iTOP-3A5000开发板采用全国产龙芯3A5000处理器&#xff0c;基于龙芯自主指令系统 (LoongArch) 的LA464微结构&#xff0c;并进一步提升频率&#xff0c;降低功耗&#xff0c;优化性能。在与龙芯3A4000处理器保持引脚兼容的基础上&#xff0c;频率提升至2.5GHZ&#xff0c;功耗降…

自然语言处理学习笔记(三)————HanLP安装与使用

目录 1.HanLP安装 2.HanLP使用 &#xff08;1&#xff09;预下载 &#xff08;2&#xff09;测试 &#xff08;3&#xff09;命令行 &#xff08;4&#xff09;测试样例 3.pyhanlp可视化 4. HanLP词性表 1.HanLP安装 HanLP的 Python接口由 pyhanlp包提供&#xff0c;其安装…