SpringCloudGateway--Sentinel限流、熔断降级

目录

一、概览

二、安装Sentinel

三、微服务整合sentinel

四、限流

1、流控模式

①直接

②关联

③链路

2、流控效果

①快速失败

②Warm Up

③排队等待

五、熔断降级

1、慢调用比例

2、异常比例

3、异常数


一、概览

       SpringCloudGateway是一个基于SpringBoot2.x的API网关,它可以帮助实现路由、过滤、容错等功能,同时也是微服务架构中不可或缺的一部分。在这篇博客中,将会了解到如何使用Sentinel实现SpringCloudGateway的限流、熔断降级。

        Sentinel是一个轻量级的流量控制框架,它可以帮助我们实现熔断降级、限流等功能,同时也可以与SpringCloudGateway无缝集成。通过使用Sentinel,可以有效地保护微服务架构免受故障和异常的影响。

二、安装Sentinel

        官方提供了UI控制台,下载地址:https://github.com/alibaba/Sentinel/releases

        将下载好的jar包放到任意非中文路径目录,使用java命令启动,可以修改Sentinel的默认端口、账户、密码;server.port默认8080,sentinel.dashboard.auth.username默认sentinel,sentinel.dashboard.auth.password默认sentinel。

        比如我这里放到D盘的Jar文件夹,启动时换成2500端口,命令如下:

java -Dserver.port=25000 -jar  D:\Jar\sentinel-dashboard-1.8.2.jar

        启动之后访问:http://localhost:25000/,账户密码都是sentinel,第一次启动后界面是空白的,因为还没有进行相关微服务项目的整合。

三、微服务整合sentinel

         SpringCloudGateWay项目参考:SpringCloudGateway--自动路由映射与手动路由映射_雨欲语的博客-CSDN博客,源码下载地址:

GitHub - dengyifanlittle/littledyf-test: my-test

        添加依赖:

        <!-- https://mvnrepository.com/artifact/com.alibaba.cloud/spring-cloud-starter-alibaba-sentinel -->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
            <version>2020.0.RC1</version>
        </dependency>

        添加配置文件:

spring:
  cloud:
    sentinel:
      transport:
      # 服务监控端口
      dashboard: localhost:25000
      # 默认 8719,如果8719被占用了会自动从 8719 开始依次 +1 扫描,直至找到未被占用的端口
      port: 8719

四、限流

        启动项目,访问:http://localhost:9999/service/nacos/test,这时再刷新sentinel界面,里面便有数据了

        流控规则页面新增:

        资源名:指需要进行流控的资源名称。例如,如果我们需要对某个 API 接口进行流控,那么这个 API 接口的地址就是这个规则的资源名。

        针对来源:指需要进行流控的请求来源,可以是单个 IP 地址、应用程序、用户等。例如,我们可以为某个 IP 地址创建一个流控规则,或者为某个应用程序创建一个流控规则,填写微服务名,默认 default(不区分来源)。

         阈值类型/单位阈值:指流控的阈值类型和具体的阈值。阈值类型可以是并发线程数、QPS(每秒请求数)等,具体的阈值则取决于阈值类型。例如,如果阈值类型为并发线程数,那么阈值可以是 100,表示最多只能有 100 个并发线程在访问这个资源

        是否集群:指这个流控规则是否应用于整个集群,如果是,则表示该规则将应用于整个集群范围内的所有实例。如果不是,则表示规则只应用于当前实例。

        流控模式:指当超过阈值时,Sentinel 会采取的流控策略。有三种模式,分别为直接流控模式、关联流控模式、链路流控模式。

        ①直接流控模式:当资源超过阈值时,直接拒绝请求。这是一种比较常见的流控模式,适用于对请求处理能力要求比较高的场景,如秒杀系统。

        ②关联流控模式:当资源超过阈值时,拒绝请求的同时,还会对关联的资源进行流控。这种流控模式适用于有些资源的请求频率较低,但是对资源的请求能力有较大的影响的场景,如数据库或者缓存。

        ③链路流控模式:当资源超过阈值时,不仅会对当前请求进行流控,还会对整个请求链路上的资源进行流控。这种流控模式适用于分布式系统中的场景,例如微服务架构下的请求链路。

        流控效果:指当流控规则触发时,Sentinel 采取的具体流控效果。

        ①快速失败:在快速失败的流控效果下,当请求被拒绝后,Sentinel会立即返回错误信息,告诉请求方请求被拒绝。这种流控效果适用于对响应时间要求比较高的场景,例如秒杀系统或高并发的API接口。

        ②Warm Up:在Warm Up的流控效果下,当系统初次启动或资源被重新分配时,Sentinel会允许一部分请求通过,以减缓流控策略的限制,等待系统稳定后再进行全面的流控。这种流控效果适用于需要短时间内承受高流量的场景,例如系统升级或重启。

        ③排队等待:在排队等待的流控效果下,当请求被拒绝后,Sentinel会将请求放入等待队列中,等待资源可用后再进行处理。这种流控效果适用于对响应时间要求不是很高的场景,例如消息队列或后台任务。

1、流控模式

①直接

        新增流控规则,流控模式选择直接模式,阈值类型QPS,单机阈值1:

        使用jemeter进行测试,线程数量、现成启动时间、运行次数分别设置为1、1、4:

        可以看到有一个成功,三个失败,且失败信息是sentinel默认:

        删除原有规则,新增流控规则,流控模式选直接,阈值类型选择并发线程数,单机阈值设置为2,微服务中只启动一个service即可,并修改其中代码:

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * @Author dengyifan
 * @create 2023/11/1 17:02
 * @description
 */

@RestController
@RequestMapping("/nacos")
public class NacosTestController {

    @GetMapping("/test")
    public String test() throws InterruptedException {

        Thread.sleep(2000);
        return "8088";
    }
}

         并发线程数表示1秒内访问该API接口的线程数,当排队的线程数达到设定的阈值的时候就会进行限流操作,这种通常是出现在访问接口响应很慢的时候,因此代码里面主动休眠2秒模拟。jmeter模拟测试时线程数设置为10,其余为1:

        可以看到返回结果中成功两次,其余8次失败,并返回sentinel默认错误信息:

        如果将sentinel的流控规则删除,则全部成功:

②关联

        新增流控规则,流控模式选择关联,阈值类型选择QPS,单机阈值设置为2,关联资源填写另外的访问接口:

        在我们的微服务中新增两个接口:

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * @Author dengyifan
 * @create 2023/11/1 17:02
 * @description
 */

@RestController
@RequestMapping("/nacos")
public class NacosTestController {


    @GetMapping("/test-one")
    public String testOne() {

        return "8088-one";
    }


    @GetMapping("/test-two")
    public String testTwo() {

        return "8088-two";
    }
}

        在jmeter中线程组设置为1、1、10:

        设置两个http请求,分别设置为test-one和test-two:

        启动测试,可以发现模拟test-one的接口两个成功,8个失败,模拟test-two的接口10个全部成功,因为设置了关联模式,并且test-one关联了test-two接口,当test-two接口的访问超过2的时候,就会让test-one的处于失败状态。这种:

③链路

        对于链路模式,比如A路径会访问到资源C,B路径也会访问到资源C,此时配置链路模式,入口资源设置为A,当访问A达到一定限制就会触发限流,B没有配置,则不会触发。

        配置文件增加:

sentinel.web-context-unify=false

        在gateway项目中新建Controller和Service:

import com.littledyf.service.SentinelTestService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * @Author dengyifan
 * @create 2023/11/9 10:41
 * @description
 */
@RestController
@RequestMapping("/test")
public class SentinelTestController {

    @Autowired
    private SentinelTestService sentinelTestService;

    @GetMapping("/test-sentinel")
    public String testSentinel() {
        return sentinelTestService.testSentinel();
    }
}
import com.alibaba.csp.sentinel.annotation.SentinelResource;
import org.springframework.stereotype.Service;

/**
 * @Author dengyifan
 * @create 2023/11/9 10:42
 * @description
 */
@Service
public class SentinelTestService {
    @SentinelResource("sentinel")
    public String testSentinel() {
        return "test sentinel";
    }
}

        其中@SentinelResource("sentinel")是手动设置资源名,sentinel只会扫描controller层的资源,service通过注解设置。

        新增链路流控:

        jmeter添加测试:

        启动测试查看结果可发现4次里面3次失败:

2、流控效果

①快速失败

        之前流控模式都是使用快速失败,即直接失败,抛出异常。

②Warm Up

        warm up是指预热,比如一些秒杀环节,之前系统流量不高,当秒杀开启突然升高,这个时候开启预热模式,让通过的流量缓慢增加,能够达到设定阈值为止,这样能够很好的保护系统。

        其中会有一个默认1的coldFactor,该值为3,请求QPS从threshold/3开始,经过设置的预热时间后达到设定的阈值,比如我们现在进行以下设置:

        即刚开始有5/3个,后面经过3秒后达到设定的阈值5。

        jmeter设置:

        启动后可以看到前几秒都有失败的,经过3秒后,就稳定达到5个成功:

③排队等待

        排队等待即让请求均匀通过,其实跟漏桶算法是对应的,选择排队等待,必须要将类型设置为QPS,否则是无效的:

        jmeter设置:

        效果:

五、熔断降级

        新增熔断规则界面:

资源名:指需要进行流控的资源名称。例如,如果我们需要对某个 API 接口进行流控,那么这个 API 接口的地址就是这个规则的资源名。

熔断策略:表示触发熔断的条件

①慢调用比例

②异常比例

③异常数

最大RT:当资源的响应时间超过设定的阈值,则统计计数

比例阈值:表示触发熔断的比例阈值,当某个熔断策略的比例超过该阈值,触发熔断

熔断时长:表示触发熔断后,保持熔断状态的时间,一般是为了避免熔断状态过早结束,导致系统负载过高

最小请求数:表述触发熔断的最小请求数,当某个资源的请求数不足该值时,不触发熔断

统计时长:表示熔断策略统计的时间范围,例如最近10秒内的统计数据

1、慢调用比例

        为了模拟慢调用,在接口中进行1000毫秒的休眠达到响应慢的作用:


import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * @Author dengyifan
 * @create 2023/11/1 17:02
 * @description
 */

@RestController
@RequestMapping("/nacos")
public class NacosTestController {

    @GetMapping("/test")
    public String test() throws InterruptedException {
        Thread.sleep(1000);
        return "8088";
    }
}

        熔断设置:

        jmeter设置:

        结果:

        刚运行完之后,在5秒内继续运行,可以看到结果都是失败状态,都被熔断处理了。 

2、异常比例

        代码修改成会出现异常的情况:

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * @Author dengyifan
 * @create 2023/11/1 17:02
 * @description
 */

@RestController
@RequestMapping("/nacos")
public class NacosTestController {

    @GetMapping("/test")
    public String test() throws Exception {
        String s = null;
        if (s.equals("1")){
            return "1";
        }
        return "8088";
    }
}

        新增熔断规则,熔断策略选择异常比例:

        jmeter设置不变,其中前5个都会抛出空指针异常,后面5个是直接熔断:

3、异常数

        熔断策略选择异常数跟异常比例类似,只是异常比例变为异常数了而已

        sentinel还可以配置热点规则以及系统自适应限流。热点规则就类似于微博热搜一样,有时候突然一个热点访问量大,这时候可以进行限流设置,很多时候热点都会进行相应的缓存,比如加上一级缓存、二级缓存等,这些实际就是为了保护系统而进行的设置。

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

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

相关文章

国外访问学者/博士后留学人员反诈骗指南

访问学者/博士后/联合培养博士人员出国后&#xff0c;对当地环境及政策不熟悉&#xff0c;需要提高防范意识&#xff0c;为此&#xff0c;知识人网小编特整理这篇反诈骗指南&#xff0c;提醒留学人员防微杜渐、未雨绸缪。 近日&#xff0c;多国使馆发布相关提醒&#xff1a;不法…

DAY47 198.打家劫舍 + 213.打家劫舍II + 337.打家劫舍 III

198.打家劫舍 题目要求&#xff1a;你是一个专业的小偷&#xff0c;计划偷窃沿街的房屋。每间房内都藏有一定的现金&#xff0c;影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统&#xff0c;如果两间相邻的房屋在同一晚上被小偷闯入&#xff0c;系统会自动报警…

WordPress页脚配置备案号

进入后台管理页面 后台管理页面地址一般是&#xff1a;域名/wp-admin 在指定位置加入代码 点击外观 -> 主题文件编辑器 在右侧的文件中选择 footer.php,[注意&#xff1a;上方的主题需要是你自己选择的对应的主题]在 </footer>标签这一行的上一行中加入代码 <di…

学习在echarts中优化数据视图dataView样式带表格样式,支持复制功能

学习在echarts中优化数据视图dataView样式 带表格样式 toolbox里有个dataView视图模式&#xff0c;里面的数据没有对整&#xff0c;影响展示效果&#xff0c;情形如下&#xff1a; 像这种标题跟数据没有整齐对应上&#xff0c;看起来乱 改问题解决方案为&#xff0c;option 》…

风力等级划分

图片来源于网络

Spark 基础知识点

Spark 基础 本文来自 B站 黑马程序员 - Spark教程 &#xff1a;原地址 什么是Spark 什么是Spark 1.1 定义&#xff1a;Apache Spark是用于大规模数据&#xff08;large-scala data&#xff09;处理的统一&#xff08;unified&#xff09;分析引擎 Spark最早源于一篇论文 Re…

【IP固定】地平线开发板如何实现重启IP地址不变

文章目录 1 背景2 临时解决方案3 真正解决方案 1 背景 重新刷了地平线工具链OE包中BSP20230417的系统镜像&#xff0c;结果只能串口连接&#xff0c;无法实现网口连接&#xff0c;串口连接后&#xff0c;发现eth0和eth1的IP竟然是一样的&#xff0c;如下图所示 还挺少见的。 …

单目标应用:粒子群优化算法(PSO)求解微电网优化MATLAB

一、微网系统运行优化模型 微电网优化模型介绍&#xff1a; 微电网多目标优化调度模型简介_IT猿手的博客-CSDN博客 二、粒子群优化算法&#xff08;PSO&#xff09;求解微电网优化 &#xff08;1&#xff09;部分代码 close all; clear ; clc; global P_load; %电负荷 gl…

低代码平台的探究与分析

目录 1.低代码行业现状 2.产品分析 2.1可视化应用开发 2.2流程管理 2.3特别支持整个平台源码合作 3.架构和技术 3.1技术栈 4.规划和展望 低代码平台&#xff08;Low-code Development Platform&#xff09;是一种让开发者通过拖拽和配置&#xff0c;而非传统的手动编写…

物联网水表有什么弊端吗?

物联网水表作为新一代智能水表&#xff0c;虽然在很大程度上提高了水资源的管理效率&#xff0c;但也存在一定的弊端。在这篇文章中&#xff0c;我们将详细讨论物联网水表的弊端&#xff0c;以帮助大家更全面地了解这一技术。 一、安全隐患 1.数据泄露&#xff1a;物联网水表通…

12.(vue3.x+vite)组件间通信方式之$attrs与$listeners

前端技术社区总目录(订阅之前请先查看该博客) 示例效果 在vue3中的$attrs的变化 $ listeners已被删除合并到$ attrs中。 $ attrs现在包括class和style属性。 也就是说在vue3中$ listeners不存在了。vue2中$listeners是单独存在的。 在vue3 $attrs包括class和style属性, vue…

运动蓝牙耳机哪个品牌好?推荐五款好用的运动耳机

​无论你是赛跑者、自行车手还是健身爱好者&#xff0c;运动耳机绝对是你追求极致、超越自我的最佳搭档。它不仅具备优秀的音质和耐用的性能&#xff0c;更重要的是&#xff0c;它可以激发你的运动激情&#xff0c;让你的运动生活更加充满动力。推荐以下几款不错的运动耳机给大…

网站引流绝技:如何通过外链持续给网站带来高质量流量

做网站的人&#xff0c;不论是写文章还是搞外链&#xff0c;最终都是希望能获得更多的流量。既然是为了搞来流量和收入&#xff0c;你可能还不知道有一种方法既能搞来外链还能带来源源不断的高质量流量。 这个方法我在8年前就已经掌握&#xff0c;而且至今我仍认为它是一种有效…

OSPF下的MGRE实验

一、实验要求 1、R1-R3-R4构建全连的MGRE环境 2、R1-R5-R6建立hub-spoke的MGRE环境&#xff0c;其中R1为中心 3、R1-R3...R6均存在环回网段模拟用户私网&#xff0c;使用OSPF使全网可达 4、其中R2为ISP路由器&#xff0c;仅配置IP地址 二、实验拓扑图 三、实验配置 1、给各路…

iOS如何通过在线状态来监听其他设备登录的状态

前提条件 1、完成 3.9.1 或以上版本 SDK 初始化 2、了解环信即时通讯 IM API 的 使用限制。 3、已联系商务开通在线状态订阅功能 实现方法 你可以通过调用 subscribe 方法订阅自己的在线状态&#xff0c;从而可以监听到其他设备在登录和离线时的回调&#xff0c;示例代码如下…

(六)库存超卖案例实战——使用mysql分布式锁解决“超卖”问题

前言 本节内容是关于使用分布式锁解决并发访问“超卖”问题的最终篇&#xff0c;在前面的章节中我们介绍了使用mysql的行锁、乐观锁、悲观锁解决并发访问导致的超卖问题&#xff0c;存在的问题是行锁、乐观锁、悲观锁不太灵活&#xff0c;需要和具体的业务耦合到一起&#xff…

数据结构与算法C语言版学习笔记(4)-栈与队列再回顾

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言&#xff1a;一、栈的定义&#xff1a;栈(stack)是限定仅在表尾进行插入和删除操作的线性表&#xff08;1&#xff09;栈是特殊的线性表&#xff08;2&#xff…

Sui学术研究奖公布,资助研究者探索人工智能、能源市场和区块链游戏

Sui基金会高兴地宣布首轮Sui学术研究奖&#xff08;SARAs&#xff09;的获奖者。SARAs计划提供资助&#xff0c;支持推动Sui区块链技术的研究。学术和研究界对我们的初次征集呈现出大量高质量的提案。 已接受的九个提案涵盖了各种主题&#xff0c;如token经济学、智能合约机制…

Java 设计模式——状态模式

目录 1.概述2.结构3.案例实现3.1.抽象状态类3.2.具体状态类3.3.上下文类3.4.测试 4.优缺点5.使用场景 1.概述 【例】通过按钮来控制一个电梯的状态&#xff0c;电梯有开门状态&#xff0c;关门状态&#xff0c;停止状态&#xff0c;运行状态。每一种状态改变&#xff0c;都有可…

银行APP虚拟金额软件,建设农业工商邮政余额生成器,易语言开源版

用易语言开发了一个虚拟余额装逼软件&#xff0c;可以生成虚拟的余额截图&#xff0c;就是APP端的截图&#xff0c;用的画板组件&#xff0c;但是生成出来的图片是非常高清的&#xff0c;软件里面因为图片是缩放状态&#xff0c;所以看起来有点失真的感觉&#xff0c;生成图片的…