微服务守护神-Sentinel-流控规则

news2024/12/23 0:50:04

引言

书接上篇 微服务守护神-Sentinel-概念 ,上面介绍了Sentinel相关概念,本篇就来看下Sentinel的流控规则。

流控规则

流量控制,其原理是监控应用流量的QPS(每秒查询率) 或并发线程数等指标,当达到指定的阈值时

对流量进行控制,以避免被瞬时的流量高峰冲垮,从而保障应用的高可用性。

 

资源名:唯一名称,默认是请求路径,可自定义

针对来源:指定对哪个微服务进行限流,默认指default,意思是不区分来源,全部限制

阈值类型/单机阈值

  • QPS(每秒请求数量): 当调用该接口的QPS达到阈值的时候,进行限流

  • 线程数:当调用该接口的线程数达到阈值的时候,进行限流

是否集群:是否需要集群

 

QPS流控

还有沿用之前订单与商品项目代码

@RestController
public class SentinelController {
    @RequestMapping("/sentinel1")
    public String sentinel1(){
        //模拟一次网络延时
        try {
            TimeUnit.SECONDS.sleep(1);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        return "sentinel1";
    }
    @RequestMapping("/sentinel2")
    public String sentinel2(){
        return "测试高并发下的问题";
    }
}

启动订单服务,多次访问/sentinel2接口,会在sentinel 客户端看到order-service 管理界面,接下来就是具体流控配置。

步骤1:簇点链路--->流控

 步骤2:在单机阈值填写一个数值,表示每秒上限的请求数

 这里阈值 3 表示单位时间内(1s) QPS超过3次,执行流控限制逻辑

步骤3:通过控制台快速频繁访问, 观察效果

线程数流控

线程流控配置跟QPS流程差不多,先删掉QPS的流控配置

步骤1:新增线程数流控

 步骤2:启动Jemter压测工具,在Jmeter中新增线程
Jemter不会用参考这篇文章:微服务绕不过的坎-服务雪崩

 

步骤3:访问 http://localhost:8091/sentinel2 会发现已经被限流

启动压测工具, 然后再访问

 

 此时肯定会有小伙伴问:QPS 方式跟线程数方式有啥区别?这个可以看这篇文章:微服务Sentinel流控难题:QPS模式与线程数模式区别

流控模式

点击上面设置流控规则的编辑按钮,然后在编辑页面点击高级选项,会看到有流控模式一栏。

 所谓流控模式,就是流量控制的操作方式有哪些。

sentinel共有三种流控模式,分别是:

  • 直接(默认):接口达到限流条件时,开启限流

  • 关联:当关联的资源(接口/服务)达到限流条件时,开启限流 [适合做应用让步]

  • 链路:当从某个接口过来的资源达到限流条件时,开启限流

直接流控模式

这个是默认模式, 上面我们演示QPS/线程数流控例子都是直接流控模式,请求达到设置流量阈值进行直接流控限制。

关联流控模式

关联流控模式指的是,当要关联的接口达到限流条件时,开启对当前接口开启限流。

啥意思?设想一种场景:电商项目中:用户下单与用户支付

假设用户下完单后会马上支付,如果某天支付服务非常繁忙,为防止整个项目因资源消耗被拖垮,配置当支付服务繁忙,限制下单。

这种场景就是关联流控, A接口与B接口存在联动(依赖)关系,比如:B调用A,当A接口出现高频访问,限制B接口调用。

沿用之前订单服务与商品服务案例

步骤1:在SentinelController.java中增加一个接口/sentinel3,重启订单服务

@RestController
public class SentinelController {
    @RequestMapping("/sentinel1")
    public String sentinel1(){
        //模拟一次网络延时
        try {
            TimeUnit.SECONDS.sleep(1);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        return "sentinel1";
    }
    @RequestMapping("/sentinel2")
    public String sentinel2(){
        return "测试高并发下的问题";
    }

    @RequestMapping("/sentinel3")
    public String sentinel3(){
    	return "sentinel3";
    }

}

步骤2:配置限流规则, 将流控模式设置为关联,关联资源设置为的 /sentinel2

在/sentinel3接口中配置关联接口:/sentinel2

步骤3:通过jmeter软件向/sentinel2连续发送请求,注意QPS一定要大于3  

 

 步骤4:访问/sentinel3,会发现已经被限流

 sentinel3 接口关联sentinel2,它们为一体,当sentinel2接口超频访问,影响sentinel3的访问,这就是联动限制。

链路流控模式

链路流控模式指的是,当从某个接口过来的资源达到限流条件时,开启限流。

啥意思,解释一下:

链路:就是访问链条,请求到响应通过代码链。

比如下面:

链路1: trace1--->traceService

链路2: trace2--->traceService

 链路流控模式可以对traceService资源做流控限制,设置限制入口资源为/trace2,意味着请求触发流控规则,如果是从/trace1访问进入的不处理,如果是从/trace2进来的,直接拒绝。

用代码演示一遍

步骤1:在shop-order-server项目的application.yml文件中新增如下配置

sentinel默认是不支持链路,需要提前开启

spring:
  cloud:
    sentinel:
      web-context-unify: false

步骤2:在shop-order-server项目中新增TraceServiceImpl.java

@Service
@Slf4j
public class TraceServiceImpl {
    @SentinelResource(value = "traceService")
    public void tranceService(){
        log.info("调用tranceService方法");
    }
}

步骤3:在shop-order-server项目中新增TraceController.java

@RestController
public class TraceController {
    @Autowired
    private TraceServiceImpl traceService;
    @RequestMapping("/trace1")
    public String trace1(){
        traceService.tranceService();
        return "trace1";
    }
    @RequestMapping("/trace2")
    public String trace2(){
        traceService.tranceService();
        return "trace2";
    }
}

步骤4:重新启动订单服务并添加链路流控规则

步骤5:分别通过 /trace1 和 /trace2 访问, 发现/trace1没问题, /trace2的被限流了  

流控效果

最后一个是sentinel的流控效果

 sentinel总共设置了3个:

快速失败(默认): 直接失败,抛出异常,不做任何额外的处理,是最简单的效果

Warm Up:它从开始阈值到最大QPS阈值会有一个缓冲阶段,一开始的阈值是最大QPS阈值的

1/3,然后慢慢增长,直到最大阈值,适用于将突然增大的流量转换为缓步增长的场景。

排队等待:让请求以均匀的速度通过,单机阈值为每秒通过数量,其余的排队等待; 它还会让设

置一个超时时间,当请求超过超时间时间还未处理,则会被丢弃。

到这,sentinel的流控规则就结束了,如果想知道还有哪些控制逻辑,请听下回分解。

 看文字不过瘾可以切换视频版:SpringCloud Alibaba 极简入门

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

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

相关文章

OSG开发-使用VisualStudio2019创建CMake项目方式开发HelloOSG

本文保证你使用VS2019,可以把这个OSG程序开发出来,看到那个蓝色的带有纹理的地球。 大概步骤如下: 下载已经编译好的OSG的库和头文件新建一个CMake项目编辑make.txt编写main.cpp运行。下载已经编译好的OSG的库和头文件 由于我们需要用OSG的…

blender 常用修改器

文章目录前置.阵列.倒角.布尔.精简.拆边.镜像.螺旋.实体化表面细分.三角化.体积到网格.焊接修改器.蒙皮.线框.铸型.曲线修改器.置换修改器.晶格修改器.缩裹修改器.简易修改.表面形变修改 .多级精度修改器.前置. 注意,修改器未应用前,只能操作原物体 阵…

自动驾驶:2022 apollo day 观后感(三)

自动驾驶:2022 apollo day 观后感(三)TOPIC THREE: 文心大模型在自动驾驶感知中的落地应用(王井东)多传感器融合autolabeling的发展:大模型数据闭环大模型,已经成为自动驾驶能力提升…

差动驱动机器人轨迹-CoCube

轨迹博客: 玫瑰线轨迹如何规划?(desmosROS2turtlesim……) ROS1云课→23turtlesim绘制小结(数学和编程) 如上所涉及的机器人假定模型都是差动驱动机器人。 许多移动机器人使用一种称为差动驱动的驱动机构…

vue项目图片裁剪上传——vue-cropper的使用,裁剪后上传头像

vue项目图片裁剪上传——vue-cropper的使用,裁剪后上传头像 npm地址:https://www.npmjs.com/package/vue-cropper github地址:https://github.com/xyxiao001/vue-cropper 在线demo:http://github.xyxiao.cn/vue-cropper/exampl…

学习分享:如何进行全局变量的学习

​对于很多朋友,尤其是刚接触全局变量的朋友而言,全局变量的学习对他们来说不是一件容易的事情。关于这方面的学习,很多朋友不太理解它的用法及分析方法,所以会比较乱,难以掌握。 什么是axure全局变量?全局…

【STM32】详解PWM的概念和原理

PWM的概念和原理一、PWM是什么?二、如何实现?三、STM32中的PWM四、使用库函数配置PWM将LED0设置为呼吸灯一、PWM是什么? PWM(Pulse width modulation)脉冲宽度调制。PWM是通过编程控制输出方波的频率和占空比&#xf…

oracle自启动的p***并行进程过多导致的process进程超限问题

某项目现场反馈无任何业务连接,查询v$process仍有500多个进程; 查询会话连接,也只有十几个会话; select b.MACHINE, b.PROGRAM,b.USERNAME, count(*) from v$process a, v$session b where a.ADDR b.PADDR and b.USERNAME is…

RCNN学习笔记-ResNeXt

论文地址:https://arxiv.org/pdf/1611.05431.pdf Abstract 我们提出了一种简单、高度模块化的图像分类网络体系结构。我们的网络是通过重复一个构建块来构建的,该构建块聚合了一组具有相同拓扑的变换。我们的简单设计产生了一个只有几个超参数可设置的…

JavaScript -- 数组常用方法及示例代码总结

文章目录数组的方法1 Array.isArray()2 at()3 concat()4 indexOf()5 lastIndexOf()6 join()7 slice()8 push()9 pop()10 unshift()11 shift()12 splice()13 reverse()14 sort()15 forEach()16 filter()17 map()18 reduce()数组的方法 Array参考文档:https://develo…

AIoT通用组件服务攻略之设备“收纳”好帮手——分组管理

天翼物联网平台(AIoT)通用组件服务提供设备分组管理功能,既可将单个产品下的部分设备划成一个分组,也可将多个产品下的设备划成一个统一分组,主要用于对设备进行归类管理,便于对设备进行批量操作。 对设备…

Java中高级核心知识全面解析——类加载过程

一个非数组类的加载阶段(加载阶段获取类的二进制字节流的动作)是可控性最强的阶段,这一步我们可以去完成还可以自定义类加载器去控制字节流的获取方式(重写一个类加载器的 loadClass() 方法)。数组类型不通过类加载器创…

适用于嵌入式单片机的差分升级通用库+详细教程

1. 什么是差分/增量升级? 借用网上的介绍:适合嵌入式的差分升级又叫增量升级,顾名思义就是通过差分算法将源版本与目标版本之间差异的部分提取出来制作成差分包,然后在设备通过还原算法将差异部分在源版本上进行还原从而升级成目…

Jekyll如何自定义摘要

最近搭建博客网站的时候遇到一个问题:博客的摘要包含了内容的格式,比如下面这张图。 标题的样式显示在摘要中,这可太奇怪了。我在查找文档之后没有想到合适的解决方案,于是乎就去 Jekyll 的项目下面提了个 Issue 问了一下。 在…

js原生实现步骤条

实现思路: 1.定義一個流程數組和一个步骤状态 2.遍历这个流程数组&#xff0c;如果步骤状态大于流程&#xff0c;checked&#xff1d;true&#xff0c; 3.页面输出遍历的流程数组&#xff0c;checked的div点亮 最终效果 <!DOCTYPE html> <html> <title>js原…

音视频开发:直播推流技术指南

一、推流架构 推流SDK客户端的模块主要有三个&#xff0c;推流采集端、队列控制模块、推流端。其中每个模块的主要流程如下&#xff0c;本文的主要目的就是拆分推流流程。 1.1 采集端 视频采集&#xff1a;通过Camera采集视频。 音频采集&#xff1a;通过麦克风采集音频。 …

HTML做一个节日页面【六一儿童节】纯HTML代码

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…

「动态规划学习心得」正则表达式匹配

正则表达式匹配 给你一个字符串 s 和一个字符规律 p&#xff0c;请你来实现一个支持 ‘.’ 和 ‘*’ 的正则表达式匹配。 ‘.’ 匹配任意单个字符‘*’ 匹配零个或多个前面的那一个元素 所谓匹配&#xff0c;是要涵盖 整个 字符串 s的&#xff0c;而不是部分字符串。 输入&…

客户管理系统中的常用术语都有哪些 (下)

CRM客户管理系统概念问世的二十多年来&#xff0c;曾帮助过无数企业打造优质的客户关系&#xff0c;带来显著的业绩增长。为了让您有更好的理解&#xff0c;小编把CRM常用术语进行了汇总&#xff0c;希望能够帮助到正在了解CRM的您。 销售方法及营销理念 LTC (Leads To Cash)…

超细节的javaWeb知识点总结

文章目录Servlet系统架构C/S架构B/S架构C/S和B/S结构的系统&#xff0c;哪个好&#xff0c;哪个不好&#xff1f;JavaEE是什么&#xff1f;B/S结构的系统通信原理&#xff08;没有涉及到Java小程序&#xff09;WEB系统的访问过程关于域名&#xff1a;IP地址是啥&#xff1f;端口…