springCloud组件专题(四) --- sentinel

前言

        限流,熔断降级概念

        限流:顾名思义,就是对一个资源(服务或者接口都可以算资源)的访问进行限制。简单来说就是限制单位时间内允许资源被访问的次数。常见的算法就是令牌桶算法。

        降级:降级其实是一种资源优化策略,当服务器压力剧增时候,关闭某些服务接口或者页面,将服务器资源给到核心业务上,从而确保核心业务正常。常见的作法就是服务接口拒绝(调用接口直接返回某种错误码,然后前端显示忙碌稍后再试),延迟持久化(接口正常访问,但是接口的一些io操作异步进行或者直接丢队列里不进行,等有空闲资源再消费队列里的数据)

        熔断:熔断其实是一种预防微服务链路整体崩溃的措施,比如,某个服务调用链是A->B->C,假设此调用链是同步阻塞的,并且C是一个极耗时的操作,那么,当并发高时,就会出现很多请求卡在->C这一步。如此一来,轻则A的链接池被打满,导致后续服务进不来,重则服务器崩溃。对这类场景的预防措施,就叫熔断。常见做法和降级相同。

        sentinel的熔断保护方式:

        客户端请求到达资源后,进行熔断条件判断,如果达到熔断条件,则进入熔断,当进入熔断一定时间后(通常是配置的),进入半开状态,允许部分请求通过以检测资源的健康状态。如果这些请求成功,则关闭熔断器;如果失败,则再次打开熔断器。

        

        sentinel概念

        sentinel就是用来帮助我们实现熔断降级限流的组件。使用上来讲,它分为两部分一部分是控制台,一部分是核心库

        控制台就是一个web界面,我们通过启动sentinel控制台,能得到一个可视化的界面,在使用章节会详细说。

        核心库简单说就是我们服务引的jar包。

使用

        1.sentinal 的 dashboard部署

        step 1: 下载sentinel的jar包:

https://github.com/alibaba/Sentinel/releases

        ** sentinel已经很久没有更新了,下载最新的1.8.8就行 **

        step2:启动jar包  (其实sentinel也是个springboot项目)

java -Dserver.port=9725 -Dcsp.sentinel.dashboard.server=localhost:9725 -Dproject.name=sentinel-dashboard -jar sentinel-dashboard-1.8.8.jar

        启动成功可看到日志为:

        step3:访问sentinel的控制台  http://localhost:9725/  端口为刚才启动参数中的端口

        进入登录界面,默认用户名和密码都是sentinel

        登录成功后看到如下界面:

        

        2.服务集成sentinal

       ** 本章节继续前面几章节内容,如何创建boot服务不再赘述 **

        step1:引入依赖包 以admin服务(一个是spring cloud项目下的spring boot服务)为例

        <!-- sentinel依赖 --><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-sentinel</artifactId></dependency>

        step2:在配置文件中的 spring.cloud节点下新增配置

    sentinel:transport:eager: true # 是否提前触发 Sentinel 初始化dashboard: localhost:9725

启动服务,就可以看到,服务已经注册到了控制台(我使用不同端口启动了两个rui-admin,模拟一个集群,所以看到,服务后面的数字是2)

        3.dashboard中各种规则讲解

                3.1. 限流

                流控的设置通过点击下图箭头2处进入

              分几张图来介绍限流配置中的能力

              1)基础设置

   

       QPS: 每秒访问量

       并发线程数: 并发线程数量。理想情况下,一个用户的访问就是一个线程,所以这个模式的很多时候用于控制访问用户数量。

        集群:

        

                2)点击高级选项:

        直接:

                快速失败: 直接进行限流,再访问时候会报错我,无法访问资源

                warm up :热身,选择后会出来一个框,让选多少秒,意思就是,在一定秒数内,缓慢放开访问数量,在最终允许访问数量达到阈值。这种模式的意义在于,服务刚启动的时候,一些接口设置有缓存,由于服务刚启动,缓存中还没有值,需要缓慢的放开请求让缓存数据产生,然后再接纳大并发量,避免刚启动服务,瞬时来巨大的并发量导致异常。

                排队等待:排队等待的意思就是匀速的让请求进入资源,选择这个选项后,会选择一个超时时长,意思是超时等待多久的请求需要被拒绝。

                关联:

如图,关联资源的含义是,当关联的资源的访问达到阈值,对当前资源进行限流。最常见的场景就是,关联资源对数据库进行操作,比较消耗性能,当前资源也要获取数据库,这种情况下会使用关联。

                链路:

        该规则的含义就是,当入口资源的访问道道阈值,限制资源的访问。入口资源一般就是某个controller的mvc接口,资源一般是某个service的实现类方法。

                3.2. 熔断

        1.慢调用比例

最大RT:该资源最慢响应速度,单位是毫秒。

比例阀值:达到最大最大RT的请求和总请求的比例。

熔断时长:对该资源进行熔断的时间。

最小请求数:请求数量到达最小请求数量才会开始计算熔断

统计时长:一个时间范围,可以是每1分钟、每3小时。根据这个时间内的请求,来统计总请求和数

        2.异常比例

比例阀值:达到最大最大RT的请求和总请求的比例。

熔断时长:对该资源进行熔断的时间。

最小请求数:请求数量到达最小请求数量才会开始计算熔断

统计时长:一个时间范围,可以是每1分钟、每3小时。根据这个时间内的请求,来统计总请求和数

        3.异常数量:

跟上面一样,没啥说的

生产中的如何配置sentinel

        1. 利用nacos做配置持久化

        1.1. 为何使用nacos做持久化

        在上一节我们介绍了sentinel的限流和熔断的使用,通过dashboard,我们对资源配置了限流和熔断规则,但是这种配置是没有进行持久化的,当服务重启时,我们的配置会失效。因此,在实际生产中,需要对受保护资源进行可被持久化的配置。

        1.2. 使用nacos进行sentinel的持久化配置

        step1:引入依赖

        在前三篇的基础上,增加如下依赖:

        <!--以nacos作为sentinel数据源的依赖--><dependency><groupId>com.alibaba.csp</groupId><artifactId>sentinel-datasource-nacos</artifactId></dependency>

        step2:编写配置

        流控配置:

[{"resource":"/health/test", "limitApp":"default","grade":1,"count":2,"strategy":0,"controlBehavior":0,"clusterMode":false}
]

resource:表示要进行流量控制的资源,本例中为"/test flow rule",也就是对"/test flow rule"的访问进行流量控制

limitApp: 表示流量控制的针对范围,这里设置为"default”,表示针对默认组的应用进行流量控制;

grade: 表示流量控制的维度 0 代表根据并发数量来限流1 代表根据 QPS 来进行流量控制count: 表示允许通过的请求数,这里设置为 2,表示当请求超过 2次时,将触发流量控制;

strategy: 表示流量控制的策略

        0-直接        1-关联        2-链路
controlBehavior:表示流量控制的行为

        0-快速失败        1-Warm UP        2-排队等待
clusterMode: 表示是否使用集群模式,这里设置为 false,表示不使用集群模式

        熔断配置:

[{"resource":"/health/remotetest","limitApp":"default","grade": 1,"count": 0.3,"timeWindow": 10,"minRequestAmount":5}
]

        resource:表示要进行熔断降级控制的资源,本例中为"/health/remotetest",也就是对"/health/remotetest"的访问进行熔断降级控制;

        limitApp: 表示熔断降级控制的针对范围,这里设置为"default",表示针对默认组应用进行熔断降级控制;

        grade: 表示熔断降级控制的维度
                0-慢调用比例        1-异常比例        2-异常数策略
        count:代表20%异常比例
        timeWindow: 表示熔断时长10秒
        minRequestAmount: 表示在熔断前必须在时间窗口内通过的请求次数,本例中设置为5;

        step3:yml中增加sentinel配置

spring: application:name: rui-adminprofiles:# 环境配置active: dev# cloudcloud:# sentinelsentinel:transport:dashboard: localhost:9725eager: true # 是否提前触发 Sentinel 初始化datasource: # sentinel 持久化配置flow: # 流控nacos:server-addr: 127.0.0.1:8848data-id: sentinel-flow-rulesgroup-id: DEFAULT_GROUPrule-type: flowdegrade: # 熔断nacos:server-addr: 127.0.0.1:8848data-id: sentinel-degrade-rulesgroup-id: DEFAULT_GROUPrule-type: flow

        完成以上步骤后,启动服务,打开sentinel的dashboard,可以看到:

        2. 使用注解定义资源

        2.1.使用场景:  生产中,我们可能会对一些service级别,而非controller级别的方法做限流或熔断,需要将service定义为资源,并作一些自定义的配置。这种情况,就可以使用@SentinelResource这个注解来完成

        2.2. 使用方法介绍:

        直接再方法上加上@SentinelResource注解即可,例如:

@Service
public class TestService implements ITestService {@Override@SentinelResource(value = "annotition_resource")public String doSth() {return "do sth";}}

        之后,访问对应的调用的controller,然后打开控制台,就能看到该资源了

        2.3.SentinelResource 的其他属性

        该注解还支持另外两个属性,如下:

        HandlerClass代表一个异常处理类, Handler是具体的处理方法。

        实际上这个用的不多,异常的统一处理实际上会放在gateway中。我们用SentinelResource 的时候大多是为了标记一些无法自动识别的资源,对于handler这个功能大家了解一下这个注解还有这个能力就好。

        3.gateway整合sentinel

        实际开发中,很多时候我们直接将一个服务当作资源,对整个服务进行熔断,所以,很多情况会直接把sentinel集成到gateway服务中,如果要在gateway服务中集成sentinel,需要进行如下操作:(以对oath服务进行流控为例)

        step1:引入依赖:

        <!-- SpringCloud Alibaba Sentinel --><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-sentinel</artifactId></dependency><!-- SpringCloud Alibaba Sentinel Gateway --><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-alibaba-sentinel-gateway</artifactId></dependency>

        step2:同本章节刚讲过的持久化到nacos,配置对应的配置文件及编写sentinel的配置json。

        以对oauth服务限流为例:

        json:

[{"resource": "rui-auth","count": 500,"grade": 1,"limitApp": "default","strategy": 0,"controlBehavior": 0}
}

        yml配置:

    sentinel:# 取消控制台懒加载eager: truetransport:# 控制台地址dashboard: 127.0.0.1:8718# nacos配置持久化datasource:ds1:nacos:server-addr: 127.0.0.1:8848dataId: sentinel-ruoyi-gatewaygroupId: DEFAULT_GROUPdata-type: jsonrule-type: gw-flow

基本原理及工作流程

        1.基本原理

        Sentinel为springboot提供了一个starter依赖,引入这个依赖后,会实例化一个Interceptor拦截所有的http请求并进行埋点(Slot),所以,我们只需要引入了spring-cloud-starter-alibaba-sentinel这个依赖,所有的http接口就都会收到sentinel的保护。

        一张图简单说明Sentinel执行过程

        

        

        再说一下Sentinel的Slot,sentinel维护了一个SlotChains,请求进入后会一个个slot的向下执行,整个执行链路结束后才能正常进入请求,如果某一步校验不通过则执行对应熔断或者限流。

        用一张图说一下各个Slot:

        

        sentinel中,重要的几个插槽如上图所示,大致分为两类,一类是统计类,一类是做各种判定及业务功能。

        重点说一下StatisticSlot这个,它是核心sentinel核心之一,用于实现数据的统计。,面试中常问的滑动事件窗口算法就是它实现的。

        滑动时间窗口算法:

        其功能是为了统计过去一段时间内数据流量有多少。在此算法产生之前,我们统计用的是固定时间窗口算法,所谓固定时间窗口算法,就是按照秒/分这种时间来统计流量,比如固定出一秒的范围,然后看当前一秒内有多少请求。

        这种算法有一个缺陷,比如,规定秒流量最高400,在第一秒的第800-900毫秒,来了350个请求,然后在第一秒结束的第100毫秒-200毫秒,又来了350个请求。按照固定窗口算法,这个访问量是ok的,因为第一秒和第二秒流量都在范围内,但是实际上这700个请求是在400毫秒内就发生了,所以它实际上会给系统带来很大的压力。

        因此,就有了滑动时间窗口算法。滑动时间窗口算法,简单来说就是把一个固定时间切割,然后统计时候,由当前时间片向前推算。比如,仍然是统计1s内的流量,将1秒切割为10个时间窗口,每100毫秒是一个时间片,统计时,求当前时间片及当前时间片前面的9个时间片的流量和。以此方式,避免了固定时间窗口存在的问题。

        一张图理解滑动时间窗口:

        

面试常问

        sentinel其实就我的经验来看,问的公司不多,因为实际上很多公司根本用不到....,别看现在微服务,高并发喊得飞起,但是其实真的需要高并发保护的项目并不算多。

        1. sentinel的运行原理 (见本文 基本原理及工作流程)

        2. 滑动时间窗口算法 (见本文)

        3. sentinel的dashboard和服务是怎么通讯的?(http,短链接)

        4. 限流策略有哪些,熔断策略有哪些 (见本文 dashboard 中各种规则讲解)

        5.sentinel中如何自定义限流处理逻辑 (见本文 如何使用注解定义资源)

        6.sentinel的实时监控怎么实现的 (这个其实就结合sentinel服务和dashboard的通讯及各个统计Slot来说)

        7. sentinel如何保证自身的高可用 (就是聊sentinel的集群模式搭建)

sentinel目前的问题,个人感想

        Sentinel最大的问题就是阿里不维护了,项目在阿里手里,但是阿里已经很久没有更新项目了,到了1.8版本之后基本不动了,所以对于限流,熔断,除了Sentinel之外,需要再掌握个别的用来防身,比如resilience4j,

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

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

相关文章

IBM IMM1服务器硬件监控指标解读

在复杂多变的IT环境中&#xff0c;服务器的稳定运行对于保障业务的连续性至关重要。IBM IMM1&#xff08;Integrated Management Module 1&#xff09;作为IBM服务器的一个重要组件&#xff0c;提供了强大的远程管理和监控功能。 监控易作为一款专业的IT基础设施监控软件&#…

实际中路由器故障处理方法

1.路由器的部分功能无法实现 &#xff08;1&#xff09;故障现象&#xff1a;路由器配置完全正确&#xff0c;但是有些功能却不能实现。 &#xff08;2&#xff09;故障原因&#xff1a;如果是在确保路由器配置正确的前提下&#xff0c;那么问题应该就在路由器的软件系统上。 &…

【鸿蒙】ERROR_GET_BUNDLE_INSTALLER_FAILED

错误信息 [ERROR_GET_BUNDLE_INSTALLER_FAILED] Troubleshooting guide $ hdc file send D:\Huawei\devEcoProjects\entry\build\default\outputs\default\entry-default-unsigned.hap /sdcard/e8a215ea7be1444197e6a58ebda7721f/entry-default-unsigned.hap Error while Depl…

26.3 Django路由层

1. 路由作用 在Django中, URL配置(通常称为URLconf)是定义网站结构的基础, 它充当着Django所支撑网站的目录. URLconf是一个映射表, 用于将URL模式(patterns)映射到Python的视图函数或类视图上. 这种映射机制是Django处理HTTP请求的基础, 它决定了当客户端发送请求时, Django如…

什么是DND网络?

DND网络通常指的是“无人机网络”&#xff08;Drone Network&#xff09;&#xff0c;它是通过多个无人机&#xff08;Drones&#xff09;之间的相互连接和通信形成的网络系统。无人机网络是一种特殊类型的无线自组织网络&#xff08;Wireless Ad-hoc Network&#xff09;&…

Java中的线程安全与同步技术

Java中的线程安全与同步技术 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01;今天我们将深入探讨Java中的线程安全问题以及如何利用同步技术来保证多线程环境下的…

免费ddns工具,快解析DNS解析使用教程

DDNS&#xff08;Dynamic Domain Name Server&#xff09;,中文叫动态域名解析&#xff0c;主要用于没有固定公网ip的网络环境下&#xff0c;使用一个固定的域名&#xff0c;解析动态变化的ip地址&#xff0c;达到远程访问的目的。 众所周知&#xff0c;目前公网ip资源非常紧缺…

Golang | Leetcode Golang题解之第187题重复的DNA序列

题目&#xff1a; 题解&#xff1a; const L 10 var bin map[byte]int{A: 0, C: 1, G: 2, T: 3}func findRepeatedDnaSequences(s string) (ans []string) {n : len(s)if n < L {return}x : 0for _, ch : range s[:L-1] {x x<<2 | bin[byte(ch)]}cnt : map[int]in…

OLAP(联机分析处理)和OLTP(联机事务处理)详细介绍与发展历程

OLAP&#xff08;Online Analytical Processing&#xff0c;联机分析处理&#xff09;和OLTP&#xff08;Online Transaction Processing&#xff0c;联机事务处理&#xff09;是数据库系统中两种不同的处理模式&#xff0c;各自有不同的应用场景和技术特点。以下是对OLAP和OLT…

解决MNIST数据集下载慢,或者Http连接失败问题

下载MNIST数据集时遇到速度慢的问题 解决&#xff1a;手动从MNIST数据集的官方网站直接使用下载好的数据文件&#xff0c;放到指定目录下&#xff0c;再进行调取即可。 手动下载地址&#xff1a;MNIST官网 http://yann.lecun.com/exdb/mnist/ 【仍需要连接外网】 这里我提供…

【强化学习】DQN走迷宫(一)

书接上回&#xff0c;《【强化学习】Q-learning训练AI走迷宫》&#xff08;去年的&#xff09; 本节讲述在相同的环境下&#xff0c;使用DQN来走迷宫。&#xff08;假设我们已经了解相关基础。&#xff09; 一. 概念重温 1.1 什么是DQN&#xff1f; 让我们从颗粒度上对齐一下…

Mybatis分页查询,同时返回total

在垃圾项目中一般都是使用mybatis plus自动返回Page,但是涉及到多表联合或者等等情况最终还是要使用mybatis进行手写sql查询,所以有此文章以便后续使用查询. 首先mysql需要支持多条查询语句,在mysql配置url后加上: &allowMultiQueriestrue&useAffectedRowstrue Mapper…

C语言 | Leetcode C语言题解之第188题买卖股票的最佳时机IV

题目&#xff1a; 题解&#xff1a; int maxProfit(int k, int* prices, int pricesSize) {int n pricesSize;if (n 0) {return 0;}k fmin(k, n / 2);int buy[k 1], sell[k 1];memset(buy, 0, sizeof(buy));memset(sell, 0, sizeof(sell));buy[0] -prices[0];sell[0] 0…

上证所抓包实战

第 2 页jsonCallBack 回调函数Request Headers爬取股票列表下载时间戳Initiator在 Network 中抓到的包,有 Headers、Payload、Preview、Response、Initiator、Timing、Cookies 面板,从这些面板中获取有用的信息来写脚本。 上海证券交易所 https://www.sse.com.cn/assortment…

Rsync未授权访问-vulfocus

1.原理 Rsync是linux上文件传输的协议&#xff0c;如果有返回直接可以看到&#xff0c;部分主机使用协议的时候不会加密码&#xff0c;就容易造成未授权访问漏洞 2.复现 打开vulfocus.io,搜索rsync关键字&#xff0c;打开环境 在自己的主机上去连接远程服务器&#xff1a; r…

项目总结-前端路由hash和history

项目总结-前端路由hash和history router模块 路由需要实现的功能 当浏览器地址发生变化的时候&#xff0c;切换页面点击浏览器后退前进的时候&#xff0c;网页内容发生变化刷新浏览器&#xff0c;网页加载当前路由对应内容 路由主要是通过监听事件&#xff0c;并利用js实现…

【AI应用探讨】—小模型应用场景(总述)

目录 1. 线性模型 金融行业风险评估&#xff1a; 经济学分析与预测&#xff1a; 2. 决策树 信贷审批&#xff1a; 医疗诊断&#xff1a; 3. 朴素贝叶斯 垃圾邮件过滤&#xff1a; 社交媒体情感分析&#xff1a; 4. 小型神经网络 图像识别&#xff1a; 语音识别&…

软件开发教学:在线教育系统源码解析及教育培训小程序搭建实战

本篇文章&#xff0c;笔者将以“从零开始的软件开发教学”为主题&#xff0c;详细解析在线教育系统的源码&#xff0c;并通过实际操作来搭建一个教育培训小程序。 一、在线教育系统概述 在线教育系统是一个综合性的网络平台&#xff0c;旨在通过互联网提供教育资源和服务。该系…

13.爬虫---PyMongo安装与使用

13.PyMongo安装与使用 1.安装 PyMongo2.使用PyMongo2.1连接数据库和集合2.2增加数据2.3修改数据2.4查询数据2.5删除数据 3.总结 MongoDB 安装可以看这篇文章MongoDB安装配置教程&#xff08;详细版&#xff09; 1.安装 PyMongo PyMongo 是Python中用于连接MongoDB数据库的库&a…

系统架构师概述

引言 系统架构设计师是项目开发活动中的众多角色之一&#xff0c;它可以是一个小组或者一个人或者是一个团队&#xff0c;架构师包含建筑师&#xff0c;设计师&#xff0c;创造者&#xff0c;缔造者&#xff0c;可以说架构师就是我们社会各个领域的创造者和缔造者。从组织上划分…