【分布式流控组件 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: 8401

spring:
  application:
    name: cloudalibaba-sentinel-service
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848 #Nacos服务注册中心地址
    sentinel:
      transport:
        dashboard: localhost:8080 #配置Sentinel dashboard地址
        port: 8719
      datasource: #<---------------------------关注点,添加Nacos数据源配置
        ds1:
          nacos:
            server-addr: localhost:8848
            dataId: cloudalibaba-sentinel-service
            groupId: DEFAULT_GROUP
            data-type: json
            rule-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.mfbz.cn/a/61520.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

springboot第34集:ES 搜索,nginx

#用search after解决深分页性能问题 #第一页 GET /bank/_search {"size": 10,"sort": [{"account_number": {"order": "asc"}}] }#第二页 GET /bank/_search {"size": 10,"sort": [{"account_numb…

《cuda c编程权威指南》05 - cuda矩阵求和

目录 1. 使用一个二维网格和二维块的矩阵加法 1.1 关键代码 1.2 完整代码 1.3 运行时间 2. 使用一维网格和一维块的矩阵加法 2.1 关键代码 2.2 完整代码 2.3 运行时间 3. 使用二维网格和一维块的矩阵矩阵加法 3.1 关键代码 3.2 完整代码 3.3 运行时间 1. 使用一个二…

Java ~ Collection/Executor ~ PriorityBlockingQueue【总结】

前言 相关系列 《Java ~ Collection【目录】》&#xff08;持续更新&#xff09;《Java ~ Executor【目录】》&#xff08;持续更新&#xff09;《Java ~ Collection/Executor ~ PriorityBlockingQueue【源码】》&#xff08;学习过程/多有漏误/仅作参考/不再更新&#xff09;…

echarts 饼图的label放置于labelLine引导线上方

一般的饼图基础配置后长这样。 想要实现将文本放置在引导线上方&#xff0c;效果长这样 const options {// ...series: [{label: {padding: [0, -40],},labelLine: {length: 10,length2: 50,},labelLayout: {verticalAlign: "bottom",dy: -10,},},], };label.padd…

中国区域250米归一化植被指数数据集(2000-2022)介绍

一、归一化植被指数是什么&#xff1f; 归一化植被指数 (Normalized Difference Vegetation Index, NDVI) 是一种衡量地表植被绿度&#xff08;生物量&#xff09;的重要指标&#xff0c;它反映了植被对太阳辐射的吸收情况和光合作用的强度。该指数是通过对地面反射的近红外和可…

IDEA SpringBoot Maven profiles 配置

IDEA SpringBoot Maven profiles 配置 IDEA版本&#xff1a; IntelliJ IDEA 2022.2.3 注意&#xff1a;切换环境之后务必点击一下刷新&#xff0c;推荐点击耗时更短。 application.yaml spring:profiles:active: env多环境文件名&#xff1a; application-dev.yaml、 applicat…

【SpringCloud】Gateway服务网关

Spring Cloud Gateway 是 Spring Cloud 的一个全新项目&#xff0c;该项目是基于 Spring 5.0&#xff0c;Spring Boot 2.0 和 Project Reactor 等响应式编程和事件流技术开发的网关&#xff0c;它旨在为微服务架构提供一种简单有效的统一的 API 路由管理方式。 1.为什么需要网关…

从0到1开发go-tcp框架【4实战片— — 开发MMO之玩家聊天篇】

从0到1开发go-tcp框架【实战片— — 开发MMO】 MMO&#xff08;MassiveMultiplayerOnlineGame&#xff09;&#xff1a;大型多人在线游戏&#xff08;多人在线网游&#xff09; 1 AOI兴趣点的算法 游戏中的坐标模型&#xff1a; 场景相关数值计算 ● 场景大小&#xff1a; 250…

【ASP.NET MVC】使用动软(五)(13)

一、问题 前文完成的用户登录后的首页如下&#xff1a; 后续账单管理、人员管理等功能页面都有相同的头部&#xff0c;左边和下边&#xff0c;唯一不同的右边内容部分&#xff0c;所以要解决重复设计的问题。 二、解决方法——使用布局页 在Views上右键添加新建项&#xff…

CentOS7---部署Tomcat和安装Jpress

总览需求 1. 简述静态网页和动态网页的区别。 2. 简述 Webl.0 和 Web2.0 的区别。 3. 安装tomcat8&#xff0c;配置服务启动脚本&#xff0c;部署jpress应用。1、简述静态网页和动态网页的区别 静态网页&#xff1a; 请求响应信息&#xff0c;发给客户端进行处理&#xff0c…

Mysql字符集问题整理

0.概述 MySQL的字符集支持(Character Set Support)包括两个方面&#xff1a; 字符集(Character set)和排序方式(Collation)。 对于字符集的支持细化到四个层次: 服务器(server)&#xff0c;数据库(database)&#xff0c;数据表(table)和连接(connection)。1.MySQL…

Python:Spider爬虫工程化入门到进阶(2)使用Spider Admin Pro管理scrapy爬虫项目

Python&#xff1a;Spider爬虫工程化入门到进阶系列: Python&#xff1a;Spider爬虫工程化入门到进阶&#xff08;1&#xff09;创建Scrapy爬虫项目Python&#xff1a;Spider爬虫工程化入门到进阶&#xff08;2&#xff09;使用Spider Admin Pro管理scrapy爬虫项目 目录 1、使…

【雕爷学编程】MicroPython动手做(33)——物联网之天气预报2

天气&#xff08;自然现象&#xff09; 是指某一个地区距离地表较近的大气层在短时间内的具体状态。而天气现象则是指发生在大气中的各种自然现象&#xff0c;即某瞬时内大气中各种气象要素&#xff08;如气温、气压、湿度、风、云、雾、雨、闪、雪、霜、雷、雹、霾等&#xff…

循环结构的学习

循环结构 文章目录 为什么要学习循环while循环dowhile循环偶数之和断点调试购物结算循环的选择类名和全类名摄氏华氏对照表for循环for执行次序五门功课成绩for的特殊写法break和continue录入客户信息_continue使代码优雅小数的比较不能用或! 为什么要学习循环 在编写代码时&a…

【Linux操作系统】Vim:提升你的编辑效率

Vim是一款功能强大的文本编辑器&#xff0c;它具有高度可定制性和灵活性&#xff0c;可以帮助程序员和文本编辑者提高编辑效率。本文将介绍Vim的基本使用方法、常用功能和一些实用技巧。 文章目录 1. Vim的基本使用方法&#xff1a;2. 常用功能&#xff1a;2.1 文件操作&#…

TextBox基本使用

作用&#xff1a; 文本框&#xff0c;用于展示文本、输入文本 常用属性&#xff1a; 文本属性 允许多行 常用事件&#xff1a; 后台代码&#xff1a; private void textBox4_TextChanged(object sender, EventArgs e){//实时获取输入的文本label3.Text textBox4.Text;}

基于vue医院分时段预约挂号系统java病历管理系统snsj0

伴随着我国社会的发展&#xff0c;人民生活质量日益提高。互联网逐步进入千家万户&#xff0c;改变传统的管理方式&#xff0c;医院病历管理系统以互联网为基础&#xff0c;利用java技术&#xff0c;和mysql数据库开发设计一套医院病历管理系统&#xff0c;提高工作效率的同时&…

ClickHouse目录结构

默认安装路径&#xff1a;/var/lib/clickhouse/ 目录结构&#xff1a; 主要介绍metadata和data metadata 其中的default、system及相应的数据库&#xff0c;.sql文件即数据库创建相关sql语句 进入default数据库&#xff08;默认数据库&#xff09;&#xff1a; 可以看到数据库…

Kafka介绍

目录 1&#xff0c;kafka简单介绍 2&#xff0c;kafka使用场景 3&#xff0c;kafka基本概念 kafka集群 数据冗余 分区的写入 读取分区数据 顺序消费 顺序消费典型的应用场景&#xff1a; 批量消费 提交策略 kafka如何保证高并发 零拷贝技术&#xff08;netty&#…

VSCode---通过ctrl+鼠标滚动改变字体大小

打开设置然后在右边输editor.mouseWheelZoo勾选即可实现鼠标滚动改变字体大小 4.这种设置的字体大小是固定的