深入理解Sentinel系列-1.初识Sentinel

  • 👏作者简介:大家好,我是爱吃芝士的土豆倪,24届校招生Java选手,很高兴认识大家
  • 📕系列专栏:Spring源码、JUC源码、Kafka原理、分布式技术原理
  • 🔥如果感觉博主的文章还不错的话,请👍三连支持👍一下博主哦
  • 🍂博主正在努力完成2023计划中:源码溯源,一探究竟
  • 📝联系方式:nhs19990716,加我进群,大家一起学习,一起进步,一起对抗互联网寒冬👀

文章目录

  • 限流的作用
  • 限流的算法
    • 计数器
    • 滑动窗口
    • 漏桶
    • 令牌桶
  • 限流的实现
  • Sentinel
    • 服务熔断
    • demo
    • Sentinel中的流量控制

对于后端来说,我们需要提供一些接口去进行交互,比如登陆注册,支付下单等这样的一些功能,所以我们需要搭建一个整体的架构,早期的话可能没那么复杂,就是通过ssm框架组成的架构,然后通过部署tomcat来提供一个端口,随着整个并发量上去之后,我们需要去提供高性能的服务。

当我们的客户端,用户量的访问大了之后,对于后端系统的并发量会更高,并发量越高对于后端整个处理的能力就是一个挑战,因为我们需要保证,用户从10个到10000个的时候,我们需要提供给用户的是 它的响应时间不能超过多少。因为用户的操作是存在一个心理预期的,这就是所谓的用户体验。其次就是系统是否能够支撑这么大的量,是否会挂掉,挂掉之后网站无法提供对外服务的情况下,你无法产生商业价值。

比如说双十一零点的时候,那一瞬间瞬时的流量一定会大于正常时间的吞吐量,所以需要采用一定的机制来限流

限流的作用

  • 保护系统避免被瞬时流量冲垮
  • 预防恶意请求(如果自己公司不提供安全的话,可以去买高防的服务器)

  • 针对请求进行限制

服务器能支撑的连接数是多少

接口的处理能力(QPS/TPS),可以使用Jmeter来测试平均响应时间

资源限制(cpu(线程池)、内存、网络资源)


  • 如何控制流量

限流的指标(可以容纳的流量、已经容纳的流量、可以接受的流量) 阈值(基于这个指标)

限流的过程(通过算法来实现)

限流的结果(处理策略)

限流的算法

计数器

(Zookeeper:RequestThrottle 限流阀)、线程池大小、连接数大小

滑动窗口

实际上发送方和接收方都维护了一个滑动窗口

在这里插入图片描述

当发送端发送了一个数据包,等到接收端接收到后,接收端窗口开始滑动,发送端需要等待返回后才能滑动

在这里插入图片描述

其限流的核心就是流量只能在这个窗口里面,但是在tcp里面,其窗口是可以灵活的扩大的,其会根据当前网络拥挤的程度来决定窗口大小。

最大只能发送五个(阈值),超过了就不能发送了

在这里插入图片描述

所以说io通信是一个阻塞通信其实就是这样,基于数据包处理的结果,等到这个数据返回,如果数据一直不返回,那么这个时候请求是阻塞的。

漏桶

(用来控制传输速率的)本质上控制的是发送者的速度

在这里插入图片描述

流入水滴的速率代表的是请求,而滴出水滴的速度代表是处理的请求,不管来的请求有多少,但是能够处理的请求就这么多。

漏桶算法的特点:

  • 水的流出速度是固定的
  • 桶的大小也是固定的

令牌桶

在这里插入图片描述

其恒定的生成速率决定了并发数,假如说我每秒生成10个令牌,那么我的qps 就是 10

令牌桶对比漏桶的区别是,其能够处理瞬时突发流量,而不像漏桶一样,流出的速度是固定的。

令牌桶的设计:

  • 桶的大小

  • 令牌标记

  • 定时任务生成令牌

  • 提供令牌获取的接口

限流的实现

Semphore 信号量

分布式限流

其大小怎么计算呢?通过压测来进行计算

//单机实现
//令牌桶算法RateLimiter rateLimiter=RateLimiter.create(10); //TPS=10public void doRequest(){if(rateLimiter.tryAcquire()){ //获取令牌System.out.println("success");}else{System.out.println("failed");}}
// 令牌桶不需要释放,处理完后自动丢弃

Sentinel

Sentinel 是阿里中间件团队开源的,面向分布式服务架构的轻量级高可用流量控制组件,主要以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度来帮助用户保护服务的稳定性。

在这里插入图片描述

其中对于Sentinel最重要的两个东西:

  • 资源(需要被保护的东西)
  • 规则(限流的规则/熔断规则)

在这里插入图片描述

所有的流量经过这个组件后,会根据这个规则去控制这个流量来进行处理。

而熔断是一个这样的概念:

在这里插入图片描述

上图存在很多相互调用的情况,里面存在很多服务调用的链路,当Service D出现故障,会导致G F阻塞,间接的又会导致A B阻塞,如果特别多的请求阻塞在这里之后,会占用特别多的资源,内存、服务器、cpu的资源,这时候会导致服务器因为大量的资源被占用而导致其他问题。

当出现这种情况的时候,会触发一种熔断的方式,熔断以后会触发降级。

服务熔断

Sentinel的服务熔断有两种方式:基于响应时间的熔断和基于异常比率的熔断。基于响应时间的熔断是根据服务的响应时间来判断是否需要熔断,当服务的响应时间超过设定的阈值时,触发熔断。基于异常比率的熔断是根据服务的异常比率来判断是否需要熔断,当服务的异常比率超过设定的阈值时,触发熔断。这两种方式可以根据具体的业务场景和需求来选择使用。

demo

public static void main(String[] arg) {initFlowRule(); //初始化限流规则while(true){//ResourceName表示资源,控制访问流量的点/*try(Entry entry=SphU.entry("helloWorld")){System.out.println("hello world");}catch (BlockException e){System.out.println("被拒绝");}*/if (SphO.entry("helloWorld")) {System.out.println("Hello World");SphO.exit();// 释放}}}private static void initFlowRule(){List<FlowRule> rules=new ArrayList<>();FlowRule flowRule=new FlowRule();flowRule.setResource("helloWorld"); //针对那个资源设置规则flowRule.setGrade(RuleConstant.FLOW_GRADE_QPS);//QPS或者并发数flowRule.setCount(5); //QPS=5rules.add(flowRule);FlowRuleManager.loadRules(rules);}

Demo 运行之后,我们可以在日志 ~/logs/csp/${appName}-metrics.log.xxx 里看到下面的输出:`

-timestamp- -date time - -resource- 5表示, 通过的请求, block: 被拒绝的请
求 ,
1600608724000|2023-09-20 21:32:04|helloWorld|5|6078|5|0|5|0|0|0
1600608725000|2023-09-20 21:32:05|helloWorld|5|32105|5|0|0|0|0|0
1600608726000|2023-09-20 21:32:06|helloWorld|5|41084|5|0|0|0|0|0
1600608727000|2023-09-20 21:32:07|helloWorld|5|72211|5|0|0|0|0|0
1600608728000|2023-09-20 21:32:08|helloWorld|5|60828|5|0|0|0|0|0
1600608729000|2023-09-20 21:32:09|helloWorld|5|41696|5|0|0|0|0|0

@RestController
public class SentinelController {@AutowiredTestService testService;@GetMapping("/hello/{name}")public String sayHello(@PathVariable("name") String name){return testService.doTest(name);}
}@Service
public class TestService {@SentinelResource(value = "doTest",blockHandler ="blockHandler",fallback = "fallback") //声明限流的资源public String doTest(String name){return "hello , "+name;}public String blockHandler(String name, BlockException e){ //降级,限流触发的return "被限流了";}// 降级和限流是不一样的,限流可以触发降级,降级是因为已经被触发了// 降级是第三方业务调用的时候,针对下游的一个返回// 限流是针对当前服务访问的限制// 这两个配置只会调用一个public String fallback(String name){ //降级,熔断触发的return "被降级了";}}@SpringBootApplication
public class SpringbootSentinelApplication {public static void main(String[] args) {initFlowRule();SpringApplication.run(SpringbootSentinelApplication.class, args);}private static void initFlowRule(){List<FlowRule> rules=new ArrayList<>();FlowRule flowRule=new FlowRule();flowRule.setResource("doTest"); //针对那个资源设置规则flowRule.setGrade(RuleConstant.FLOW_GRADE_QPS);//QPS或者并发数flowRule.setCount(5); //QPS=5rules.add(flowRule);FlowRuleManager.loadRules(rules);}}

Sentinel中的流量控制

维度 + 规则 + 资源

不管是通过什么样的方式,其核心原理就是,监控应用流量的qps或者并发线程数的指标,然后去判断这些指标的阈值去对流量进行控制,防止瞬时流量高峰导致系统被压垮。

SphU.entry(resourceName) ->

正常,则通过

被限制,抛出 FlowException( FlowException extends BlockException)

同一个资源也可以创建不同的规则,这个主要是通过List rules=new ArrayList<>();实现的,如果有多个规则,会去遍历,如果发现那个规则被触发则就执行,否则就顺利通过。

一个规则由什么组成?

  • resource 资源
  • count 阈值
  • grade 类型(基于QPS 还是 并发线程数)
  • limitApp,针对的调用来源.
  • strategy , 调用关系限流
  • controlBehavior . (直接拒绝, 冷启动,匀速排队)

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

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

相关文章

低多边形游戏风格3D模型纹理贴图

在线工具推荐&#xff1a; 3D数字孪生场景编辑器 - GLTF/GLB材质纹理编辑器 - 3D模型在线转换 - Three.js AI自动纹理开发包 - YOLO 虚幻合成数据生成器 - 三维模型预览图生成器 - 3D模型语义搜索引擎 当谈到游戏角色的3D模型风格时&#xff0c;有几种不同的风格&#xf…

《安富莱嵌入式周报》第328期:自主微型机器人,火星探测器发射前失误故障分析,微软推出12周24期免费AI课程,炫酷3D LED点阵设计,MDK5.39发布

周报汇总地址&#xff1a;嵌入式周报 - uCOS & uCGUI & emWin & embOS & TouchGFX & ThreadX - 硬汉嵌入式论坛 - Powered by Discuz! 更新一期视频教程&#xff1a; 【实战技能】 单步运行源码分析&#xff0c;一期视频整明白FreeRTOS内核源码框架和运行…

模电·放大电路的分析方法——图解法

放大电路的分析方法——图解法 静态工作点的分析电压放大倍数的分析波形非线性失真的分析直流负载线与交流负载线图解法的适用范围 在实际测出放大管的输入特性、输出特性和已知放大电路中其它各元件参数的情况下&#xff0c;利用作图的方法对放大电路进行分析即为图解法。 静…

BUU SQL COURSE 1

四 发现有登录框&#xff0c;爆破半天也爆破不出来&#xff0c;只能从别的地方下手了 F12一下 发现了一个传参 进去发现id可以传参&#xff0c;sql注入一下试试 前三个都有回显&#xff0c;当id4的时候页面没有回显了&#xff0c;正好验证 了页面 有三个新闻 当order by 3的时…

CSPNet: A New Backbone that can Enhance Learning Capability of CNN(2019)

文章目录 -Abstract1 Introduction2 Related workformer work 3 Method3.1 Cross Stage Partial Network3.2 Exact Fusion Model 4 Experiments5 Conclusion 原文链接 源代码 - 梯度信息重用&#xff08;有别于冗余的梯度信息&#xff09;可以减少计算量和内存占用提高效率&am…

内存学习——堆(heap)

目录 一、概念二、自定义malloc函数三、Debug运行四、heap_4简单分析4.1 heap管理链表结构体4.2 堆初始化4.3 malloc使用4.4 free使用 一、概念 内存分为堆和栈两部分&#xff1a; 栈&#xff08;Stack&#xff09;是一种后进先出&#xff08;LIFO&#xff09;的数据结构&…

Flutter自定义下拉选择框dropDownMenu

利用PopupMenuButton和PopupMenuItem写了个下拉选择框&#xff0c;之所以不采用系统的&#xff0c;是因为自定义的更能适配项目需求&#xff0c;话不多说&#xff0c;直接看效果 下面直接贴出代码、代码中注释写的都很清楚&#xff0c;使用起来应该很方便&#xff0c;如果有任何…

Navicat 技术指引 | 适用于 GaussDB 分布式的数据生成功能

Navicat Premium&#xff08;16.3.3 Windows 版或以上&#xff09;正式支持 GaussDB 分布式数据库。GaussDB 分布式模式更适合对系统可用性和数据处理能力要求较高的场景。Navicat 工具不仅提供可视化数据查看和编辑功能&#xff0c;还提供强大的高阶功能&#xff08;如模型、结…

得帆云助力容百科技构建CRM系统,实现LTC全流程管理

宁波容百新能源科技股份有限公司 宁波容百新能源科技股份有限公司&#xff08;以下简称“容百科技”&#xff09;于2014年9月建立&#xff0c;是高科技新能源材料行业的跨国型集团公司。专业从事锂电池正极材料的研发、生产和销售&#xff0c;于2019年登陆上交所科创板&#x…

Docker 部署 2FAuth 服务

拉取最新版本的 2FAuth 镜像&#xff1a; $ sudo docker pull 2fauth/2fauth:latest在本地预先创建好 2fauth 目录, 用于映射 2FAuth 容器内的 /2fauth 目录。 使用以下命令, 在 前台 运行 2FAuth 容器: $ sudo docker run -it --rm --name 2fauth -p 10085:8000/tcp -v /ho…

阻抗控制下机器人接触刚性环境振荡不稳定进行阻抗调节

在阻抗控制下&#xff0c;当机器人接触刚性环境时&#xff0c;可能会出现振荡不稳定的情况。这可以通过调整机器人的阻抗参数来进行调节。 阻抗接触 阻抗参数中的质量、阻尼和刚度都会对机器人控制系统的性能和稳定性产生重要影响。质量主要影响系统的惯性&#xff0c;从而影响…

打破常规思维:Scrapy处理豆瓣视频下载的方式

概述 Scrapy是一个强大的Python爬虫框架&#xff0c;它可以帮助我们快速地开发和部署各种类型的爬虫项目。Scrapy提供了许多方便的功能&#xff0c;例如请求调度、数据提取、数据存储、中间件、管道、信号等&#xff0c;让我们可以专注于业务逻辑&#xff0c;而不用担心底层的…

如何用Qt配置git项目并上传Gitee

1.进入到Qt项目文件夹内&#xff0c;打开 “Git Bash Here” 2.初始化&#xff0c;在“Git Bash Here”中输入 git init 3.加入所有文件&#xff0c;在“Git Bash Here”中输入 git add . (需要注意&#xff0c;git add 后面还有一个点) 4.添加备注&#xff0c;git com…

Hive数据库系列--Hive数据类型/Hive字段类型/Hive类型转换

文章目录 一、Hive数据类型1.1、数值类型1.2、字符类型1.3、日期时间类型1.4、其他类型1.5、集合数据类型1.5.1、Struct举例1.5.2、Array举例1.5.3、Map举例 二、数据类型转换2.1、隐式转换2.2、显示转换 三、字段类型的使用3.1、DECIMAL(precision&#xff0c;scale) 本章主要…

linux驱动开发——内核调试技术

目录 一、前言 二、内核调试方法 2.1 内核调试概述 2.2 学会分析内核源程序 2.3调试方法介绍 三、内核打印函数 3.1内核镜像解压前的串口输出函数 3.2 内核镜像解压后的串口输出函数 3.3 内核打印函数 四、获取内核信息 4.1系统请求键 4.2 通过/proc 接口 4.3 通过…

ES 如何将国际标准时间格式进行格式化与调整时区

需求&#xff0c;日志收集的时候&#xff0c;时间格式是国际标准时间格式。形如yyyy-MM-ddTHH:mm:ss.SSS。 &#xff08;2023-12-05T02:45:50.282Z&#xff09;这个时区也不对&#xff0c;那如何将此类型的时间&#xff0c;进行格式化呢&#xff1f; 本篇文章体统一个案例&…

STM32F103的启动过程及BootLoader作用

1.STM32的启动过程 1.1 复位后的启动模式选择 我们知道的复位方式有三种&#xff1a;上电复位&#xff0c;硬件复位和软件复位。当产生复位&#xff0c;并且离开复位状态后&#xff0c;CM3 内核做的第一件事就是读取下列两个32 位整数的值&#xff1a; &#xff08;1&#xff0…

大数据技术6: 大数据技术栈

前言&#xff1a;大数据相关的技术名词特别多&#xff0c;这些技术栈之间的关系是什么&#xff0c;对初学者来说很难找到抓手。我一开始从后端转大数据的时候有点懵逼&#xff0c;整体接触了一遍之后才把大数据技术栈给弄明白了。 一、大数据技术栈 做大数据开发&#xff0c;无…

「Python编程基础」第7章:字符串操作

文章目录 一、回顾二、新手容易踩坑的引号三、转义字符四、多行字符串写法五、注释六、字符串索引和切片七、字符串的in 和 not in八、字符串拼接九、转换大小写十、合并字符串join()十一、分割字符串split()十二、字符串替换 replace()十三、字符串内容判断方法十四、字符串内…

使用MetaMask + Ganache搭建本地私有网络并实现合约部署与互动

我使用Remix编写合约&#xff0c;MetaMask钱包工具和Ganache搭建了一个私有网络&#xff0c;并且实现了合约的部署和互动。 在前面的博客中提到了 Remix在线环境及钱包申请 以及 Solidity的基本语法 &#xff0c;没看过的小伙伴可以点击链接查看一下&#xff0c;都是在本专栏下…