微服务保护-流量控制1

news2024/12/23 15:01:00

请添加图片描述
个人名片:

博主:酒徒ᝰ.
个人简介沉醉在酒中,借着一股酒劲,去拼搏一个未来。
本篇励志三人行,必有我师焉。

请添加图片描述
本项目基于B站黑马程序员Java《SpringCloud微服务技术栈》,SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式

【SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式,系统详解springcloud微服务技术栈课程|黑马程序员Java微服务】 点击观看

目录

  • 二、流量控制
    • 1. 簇点链路
    • 2. 快速入门
    • 3. 流控模式

二、流量控制

雪崩问题虽然有四种方案,但是限流是避免服务因突发的流量而发生故障,是对微服务雪崩问题的预防。我们先学习这种模式。

1. 簇点链路

当请求进入微服务时,首先会访问DispatcherServlet,然后进入Controller、Service、Mapper,这样的一个调用链就叫做簇点链路。簇点链路中被监控的每一个接口就是一个资源

默认情况下sentinel会监控SpringMVC的每一个端点(Endpoint,也就是controller中的方法),因此SpringMVC的每一个端点(Endpoint)就是调用链路中的一个资源。

例如,我们刚才访问的order-service中的OrderController中的端点:/order/{orderId}

在这里插入图片描述

流控、熔断等都是针对簇点链路中的资源来设置的,因此我们可以点击对应资源后面的按钮来设置规则:

  • 流控:流量控制
  • 降级:降级熔断
  • 热点:热点参数限流,是限流的一种
  • 授权:请求的权限控制

2. 快速入门

  1. 示例

点击资源/order/{orderId}后面的流控按钮,就可以弹出表单.

在这里插入图片描述

表单中可以填写限流规则。

在这里插入图片描述
2. 案例:

给 /order/{orderId}这个资源设置流控规则,QPS不能超过 5,然后测试。

1)首先在sentinel控制台添加限流规则
在这里插入图片描述

2)利用jmeter测试

在课前资料中找到

在这里插入图片描述

直接解压,进入bin目录,找到jmeter.bat双击

在这里插入图片描述

课前资料提供了编写好的Jmeter测试样例:
打开jmeter,导入课前资料提供的测试样例:

在这里插入图片描述

选中流控入门,QPS<5右键运行:

在这里插入图片描述

结果:

在这里插入图片描述

可以看到,成功的请求每次只有5个。(结果不一定完全符合。可以多试几次)

3. 流控模式

在添加限流规则时,点击高级选项,可以选择三种流控模式

  • 直接:统计当前资源的请求,触发阈值时对当前资源直接限流,也是默认的模式
  • 关联:统计与当前资源相关的另一个资源,触发阈值时,对当前资源限流
  • 链路:统计从指定链路访问到本资源的请求,触发阈值时,对指定链路限流
  1. 快速入门测试的就是直接模式。

  2. 关联模式

关联模式:统计与当前资源相关的另一个资源,触发阈值时,对当前资源限流

使用场景:比如用户支付时需要修改订单状态,同时用户要查询订单。查询和修改操作会争抢数据库锁,产生竞争。业务需求是优先支付和更新订单的业务,因此当修改订单业务触发阈值时,需要对查询订单业务限流。

案例

  1. 在OrderController新建两个端点:/order/query和/order/update,无需实现业务
  2. 配置流控规则,当/order/ update资源被访问的QPS超过5时,对/order/query请求限流

1)定义/order/query端点和/order/update端点,模拟订单查询和更新

@GetMapping("/query")
public String queryOrder() {
    return "查询订单成功";
}

@GetMapping("/update")
public String updateOrder() {
    return "修改订单成功";
}

重启orderApplication服务,查看sentinel控制台的簇点链路:
(访问前需要先在浏览器进行一次页面访问才可以查询到簇点链路。)

在这里插入图片描述

3)配置流控规则

对哪个端点限流,就点击哪个端点后面的按钮。我们是对订单查询/order/query限流.
在表单中填写流控规则:

在这里插入图片描述

4)在Jmeter测试

选择《流控模式-关联》:

在这里插入图片描述

可以看到1000个用户,100秒,因此QPS为10,超过了我们设定的阈值:5

查看http请求:

在这里插入图片描述

请求的目标是/order/update,这样这个断点就会触发阈值。
但限流的目标是/order/query,我们在浏览器访问query业务,可以发现:

在这里插入图片描述
确实被限流了。

总结:

满足下面条件可以使用关联模式:

  • 两个有竞争关系的资源
  • 一个优先级高,一个优先级低
  1. 链路模式

链路模式:只针对从指定链路访问到本资源的请求做统计,判断是否超过阈值。

案例

需求:有查询订单和创建订单业务,两者都需要查询商品。针对从查询订单进入到查询商品的请求统计,并设置限流。
步骤:

  1. 在OrderService中添加一个queryGoods方法,不用实现业务
  2. 在OrderController中,改造/order/query端点,调用OrderService中的queryGoods方法
  3. 在OrderController中添加一个/order/save的端点,调用OrderService的queryGoods方法
  4. 给queryGoods设置限流规则,从/order/query进入queryGoods的方法限制QPS必须小于2

实现:

1)添加查询商品方法

在order-service服务中,给OrderService类添加一个queryGoods方法:
默认情况下,OrderService中的方法是不被Sentinel监控的,需要我们自己通过注解的方式来标注监控的方法,及添加@SentinelResource()

@SentinelResource("goods")
public void QueryGood() {
    System.err.println("查询商品");
}

2)查询订单时,查询商品

在order-service的OrderController中,修改/order/query端点的业务逻辑:

@GetMapping("/query")
public String queryOrder() {
    orderService.queryGoods();
    return "查询订单成功";
}

3)新增订单,查询商品

在order-service的OrderController中,修改/order/save端点,模拟新增订单:

@GetMapping("/save")
public String saveOrder() {
    orderService.queryGoods();
    return "新增订单成功";
}

4)添加配置

链路模式中,是对不同来源的两个链路做监控。但是sentinel默认会给进入SpringMVC的所有请求设置同一个root资源,会导致链路模式失效。

我们需要关闭这种对SpringMVC的资源聚合,修改order-service服务的application.yml文件:

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

重启服务,访问/order/query和/order/save,可以查看到sentinel的簇点链路规则中,出现了新的资源:

在这里插入图片描述

5)添加流控规则

点击任意一个goods资源后面的流控按钮,在弹出的表单中填写下面信息:

在这里插入图片描述

只统计从/order/query进入/goods的资源,QPS阈值为2,超出则被限流。

6)Jmeter测试

选择《流控模式-链路》:

一个http请求是访问/order/save:
运行的结果:
在这里插入图片描述
完全不受影响。

另一个是访问/order/query:
运行结果:
在这里插入图片描述
每次只有2个通过。

总结

流控模式有哪些?
•直接:对当前资源限流
•关联:高优先级资源触发阈值,对低优先级资源限流。
•链路:阈值统计时,只统计从指定资源进入当前资源的请求,是对请求来源的限流

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

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

相关文章

Learn Prompt-角色扮演

模拟面试​ 当你在新闻中读到更多关于ChatGPT的内容时&#xff0c;你会听说ChatGPT可以代替医生、面试官、教师、律师等。但如果你想在实践中使用它&#xff0c;除了使用简单的提示或例子&#xff0c;你还可以根据不同的场景为ChatGPT设置不同的角色&#xff0c;这样我们就可以…

基于matlab寻找并显示一维数组t中的素数

一、方法介绍 首先&#xff0c;要编写一个寻找素数的子函数&#xff1a; function primeNumbers findPrimeNumbers(t)primeNumbers [];for i 1:length(t)num t(i);isPrime true;if num < 1isPrime false;elsefor j 2:sqrt(num)if mod(num, j) 0isPrime false;brea…

Learn Prompt-“标准“提示

在前面的教程中&#xff0c;我们介绍了指令输入的简单提示&#xff0c;提供实例的提示和角色扮演类的提示&#xff0c;那么是否有一个公式来列出提示的各个部分&#xff0c;并将其组合成一个标准化的提示&#xff1f;答案是肯定的。 角色扮演&#xff08;Role&#xff09; 指令…

Ae 效果:CC Hair

模拟/CC Hair Simulation/CC Hair CC Hair&#xff08;CC 毛发&#xff09;可以在源图像上模拟生成毛发、绒线等&#xff0c;并可调整它们的长度、方向、重量等属性&#xff0c;从而创建出非常独特的效果。 CC Hair 本质上是基于 Alpha 通道来生成毛发&#xff0c;无毛发处将变…

多款大模型向公众开放,百模大战再升级?

作为一种使用大量文本数据训练的深度学习模型&#xff0c;大模型可以生成自然语言文本或理解语言文本的含义&#xff0c;是通向人工智能的一条重要途径。大模型可以应用于各种机器学习任务&#xff0c;包括自然语言处理、计算机视觉、语音识别、机器翻译、推荐系统、强化学习等…

【电子元件】常用电子元器件的识别之二极管

目录 前言1. 二极管的识别1.1 普通整流二极管/开关二极管的识别1.2 快速恢复二极管的识别1.3 肖特基二极管的识别1.4 稳压(齐纳)二极管的识别1.5 发光二极管的识别1.6 整流桥的识别1.7 检波二极管的识别1.8 变容二极管的识别1.9 双向触发二极管的识别1.10 二极管在电路图中的…

【记录】深度学习环境配置(pytorch版)

1080面对Transformer连勉强也算不上了&#xff0c;还是要去用小组公用的卡 完整记一个环境配置&#xff0c;方便后面自用✍️ nvidia-smi查看GPU信息 ** CUDA版本12.2 conda -V查询conda版本 22.9.0 新建conda环境 准备装python3.8 conda create --name caiman python3.8.2激…

五层网络模型

分层的意义 当遇到一个复杂问题的时候&#xff0c;可以使用分层的思想把问题简单化 比如&#xff0c;你有半杯82年的可乐&#xff0c;想分享给你的朋友王富贵&#xff0c;但你们已经10年没有联系了。要完成这件事&#xff0c;你可能要考虑&#xff1a; 我用什么装可乐&#x…

shell脚本学习教程(一)

shell脚本学习 一、什么是 Shell&#xff1f;1. shell概述2. Shell 的分类3. 第一个shell脚本4. 多命令执行 二、Shell 变量3.1 变量的命名规则3.2 变量的特殊符号3.3 用户自定义变量3.4 环境变量3.5 位置参数变量3.6 预定义变量3.7 接受键盘输入 三、Shell 运算符3.1 算术运算…

NSSCTF web 刷题记录2

文章目录 前言题目[广东强网杯 2021 团队组]love_Pokemon[NCTF 2018]Easy_Audit[安洵杯 2019]easy_web[NCTF 2018]全球最大交友网站prize_p2[羊城杯 2020]easyser[FBCTF 2019]rceservice方法一方法二 前言 今天是2023年9月13号&#xff0c;刷题记录2正式开始。时间来到九月十七…

Doris数据库FE——SQL 接收

SQL 接收 首先看定义在fe/fe-core/src/main/java/org/apache/doris/qe/QeService.java文件中的public class QeService类&#xff0c;该类is the encapsulation of the entire front-end service, including the creation of services that support the MySQL protocol是整个前…

89 # express 构建 layer 和 route 的关系

上一节实现了实现应用和路由的分离&#xff0c;这一节来构建 layer 和 route 的关系 先看个例子如下&#xff1a;路由中间件&#xff0c;将处理的逻辑拆分成一个个的模块 const express require("express"); const app express();app.get("/",(req, re…

大语言模型之十-Byte Pair Encoding

Tokenizer 诸如GPT-3/4以及LlaMA/LlaMA2大语言模型都采用了token的作为模型的输入输出&#xff0c;其输入是文本&#xff0c;然后将文本转为token&#xff08;正整数&#xff09;&#xff0c;然后从一串token&#xff08;对应于文本&#xff09;预测下一个token。 进入OpenAI官…

六、数学建模之插值与拟合

1.概念 2.例题和matlab代码求解 一、概念 1.插值 &#xff08;1&#xff09;定义&#xff1a;插值是数学和统计学中的一种技术&#xff0c;用于估算在已知数据点之间的未知数据点的值。插值的目标是通过已知数据点之间的某种函数或方法来估计中间位置的数值。插值通常用于数…

服务器管理

腾讯云服务器相关管理 linux下安装python3 linux自带2.x&#xff0c;有时候需要2.x执行一些工具&#xff0c;开发的时候又想用p3&#xff0c;就需要同时装python2和python3 依次执行以下命令 ssh xxxxx.xx.xx.xx #进入linux服务器 su #输入密码&#xff0c;如果不知道管理员…

基于讯飞人脸算法(调用API进行人脸比对)

先看结果 必须遥遥领先 所需准备 这里我调用了&#xff1a; 人脸比对 API 文档 | 讯飞开放平台文档中心https://www.xfyun.cn/doc/face/xffaceComparisonRecg/API.html#%E6%8E%A5%E5%8F%A3%E8%AF%B4%E6%98%8E 代码里所涉及的APPID、APISecret、APIKey 皆从讯飞的控制台获取&…

ARM Linux DIY(十三)Qt5 移植

前言 板子带有屏幕&#xff0c;那当然要设计一下 GUI&#xff0c;对 Qt5 比较熟悉&#xff0c;那就移植它吧。 移植 Qt5 buildroot 使能 Qt5&#xff0c;这里我们只开启核心功能 gui module --> widgets module 编译 $ make ODIY_V3S/ qt5base编译报错&#xff1a;找不…

旅游门户/旅行社网站-pc+移动端+可小程序+app强大功能-适合运营周边游/国内游/出境游

很美观的一款旅游门户/旅行社网站-pc+移动端+强大功能-适合运营周边游/国内游/出境游/酒店/门票/签证/租车/攻略都有,看演示地址 可以封装APP 套餐一:源码+包安装=400 套餐二:全包服务 包服务器+域名+APP+免费认证小程序+H5+PC=1000 可做小程序+app,请提前联系卖家 主…

【C#】【源码】直接可用的远程桌面应用

【背景】 封闭环境无法拷贝外来的远程桌面软件&#xff0c;所以就直接自己用C#写一个。 【效果】 【说明】 本篇会给出完整的编程步骤&#xff0c;照着写就能拥有你自己的远程桌面应用&#xff0c;直接可以运行在局域网。 如果不想自己敲代码&#xff0c;也可以选择直接下载…

LeetCode 周赛上分之旅 #45 精妙的 O(lgn) 扫描算法与树上 DP 问题

⭐️ 本文已收录到 AndroidFamily&#xff0c;技术和职场问题&#xff0c;请关注公众号 [彭旭锐] 和 BaguTree Pro 知识星球提问。 学习数据结构与算法的关键在于掌握问题背后的算法思维框架&#xff0c;你的思考越抽象&#xff0c;它能覆盖的问题域就越广&#xff0c;理解难度…