Spring Cloud Alibaba Sentinel 集成与限流实战(6)

Spring Cloud Alibaba 工程搭建(1)
Spring Cloud Alibaba 工程搭建连接数据库(2)
Spring Cloud Alibaba 集成 nacos 以及整合 Ribbon 与 Feign 实现负载调用(3)
Spring Cloud Alibaba Ribbon 负载调用说明(4)
Spring Cloud Alibaba 核心理论 CAP与BASE理论简单理解(5)

目录

什么是Sentinel?

  • 阿里巴巴开源的分布式系统流控工具
  • 以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性
  • 丰富的应用场景:消息削峰填谷、集群流量控制、实时熔断下游不可用应用等
  • 完备的实时监控:Sentinel 同时提供实时的监控功能
  • 提供开箱即用的与其它开源框架/库的整合模块,例如与 Spring Cloud、Dubbo、gRPC 的整合
  • 官网:home | Sentinel (sentinelguard.io)

核心概念:

  • 资源:是 Sentinel 中的核心概念之一,可以是java程序中任何内容,可以是服务或者方法甚至代码,总结起来就是我们要保护的东西
  • 规则:定义怎样的方式保护资源,主要包括流控规则、熔断降级规则等
    官方详细介绍 introduction | Sentinel (sentinelguard.io)

Sentinel 服务

  • Sentinel 分为两个部分
    • 核心库(Java 客户端)不依赖任何框架/库,能够运行于所有 Java 运行时环境,同时对 Dubbo、Spring Cloud 等框架也有较好的支持。
    • 控制台(Dashboard)基于 Spring Boot 开发,打包后可以直接运行,不需要额外的 Tomcat 等应用容器。

Sentinel 控制台搭建

官方文档:https://github.com/alibaba/Sentinel/wiki/控制台
控制台包含如下功能:

  • 查看机器列表以及健康情况:收集 Sentinel 客户端发送的心跳包,用于判断机器是否在线。
  • 监控 (单机和集群聚合)通过 Sentinel 客户端暴露的监控 API,定期拉取并且聚合应用监控信息,最终可以实现秒级的实时监控。
  • 规则管理和推送:统一管理推送规则。
  • 鉴权:生产环境中鉴权非常重要。这里每个开发者需要根据自己的实际情况进行定制。
//启动 Sentinel 控制台需要 JDK 版本为 1.8 及以上版本,
//-Dserver.port=8858 用于指定 Sentinel 控制台端口为 8858 
//默认用户名和密码都是 sentinel
​
java -Dserver.port=8858 -Dcsp.sentinel.dashboard.server=localhost:8858 -Dproject.name=sentinel-dashboard -jar sentinel-dashboard-1.8.0.jar

注意:

  • 如果是在 linux 系统上面,需要记得打开对应的端口防火墙
  • 如果是在 windows 上面,就要注意使用管理员模式运行命令行(另外需要使用 jdk 11),我本地是使用 jdk 17 的时候,启动报错

登录的用户名和密码:默认用户名和密码都是 sentinel
sentinel 控制台

程序集成 Sentinel

在 demo-order、demo-video 的 pom 文件中增加依赖

<!--添加sentinel客户端-->
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>

修改对应的配置文件

#dashboard: 8080 控制台端口
#port: 9999 本地启的端口,随机选个不能被占用的,与dashboard进行数据交互,会在应用对应的机器上启动一个 Http Server,
# 该 Server 会与 Sentinel 控制台做交互, 若被占用,则开始+1一次扫描spring:cloud:sentinel:transport:dashboard: 127.0.0.1:8858 port: 9999

微服务注册上去后,由于Sentinel是懒加载模式,所以需要访问微服务后才会在控制台出现
我们访问下: localhost:9000/api/v1/video_order/findById?videoId=30
访问请求

然后就可以看到 sentinel 的控制台上面增加了对应的模块信息了,我们多请求几次,可以看到 实时监控下面是有对应的数据收集
数据收集

基于QPS限流配置实战

我们是初步了解下怎么设置,先找到对应的模块的资源,然后设置流控规则,从这里可以看到,我们可以对指定的接口去设置流控,这个设置的颗粒度还是比较细的
找到资源路径

新增流控规则,这里我们为了方便于查看效果,就给一个单击阈值为:2新增流控规则

新增完了之后,可以在流控规则这里找到
流控规则

再次访问 localhost:9000/api/v1/video_order/findById?videoId=30,这次我们点击刷新的时候点击快一点:
流控报错

Sentinel流量控制功能

有了初步的操作之后,我们来简单的了解下 sentinel 的流控功能,首先我们先了解下什么是流量控制(flow control)?

原理是监控应用流量的 QPS 或并发线程数等指标,当达到指定的阈值时对流量进行控制,以避免被瞬时的流量高峰冲垮,从而保障应用的高可用性。

面板参数

面板参数
参数说明

  • 针对来源:Sentinel 可以针对调用者进行限流,填写具体微服务名时,指定对此微服务进行限流 (就是可以指定是哪个来源的进行限流,不是这个来源的不限流),默认值为 default(不区分来源,全部限制)。
  • 阈值类型/单机阈值:用于限制和控制流量的一种度量标准的类型,可以为 QPS(Queries Per Second,每秒请求数)也可以为“并发线程数”。
    • QPS:每秒请求达到此值开始限流。
    • 并发线程数:请求此资源的线程达到某个值时限流。每个请求分配一个线程,当请求执行时间长时,很快就会触发限流,相反如果线程执行速度快,那么限流触发就会概率就会比较小。
  • 流控模式:流量控制模式。
    • 直接:接口达到限流条件时,直接限流。
    • 关联:当关联的资源达到阈值时,就限流自己。
    • 链路:指定资源从入口资源进来的流量,如果达到阈值,就进行限流。
  • 流控效果:流量控制效果。
    • 快速失败:该方式是默认的流量控制方式,比如 QPS 超过任意规则的阈值后,新的请求就会被立即拒绝,拒绝方式为抛出 FlowException。这种方式适用于对系统处理能力确切已知的情况下,比如通过压测确定了系统的准确水位时。
    • 排队等待(也叫匀速通过):排队等待会严格控制请求通过的间隔时间,让请求稳定且匀速的通过,可以用来处理间隔性突发的高流量。例如抢票软件,在某一秒或者一分钟内有大量的请求到来,而接下来的一段时间里处于空闲状态,我们希望系统能够在接下来的空余时间里也能出去这些请求,而不是直接拒绝。在设置排队等待时,需要填写超时时间。
    • Warm Up:此项叫做预热或者冷启动方式,此模式主要是防止流量突然增加时,直接把系统拉升到高水位可能瞬间把系统压垮,通过"冷启动",让通过的流量缓慢增加,在一定时间内逐渐增加到阈值上限,给冷系统一个预热的时间,避免冷系统被压垮。当使用 Warm Up 模式时,我们还需要指定启动时开放的 QPS 比例(DEFAULT_COLD_FACTOR,默认值为 3,代表 30%),以及系统预热所需时长(warmUpPeriodSec,默认值是 10 秒)。

限流页面当“是否集群”选中之后,就会是这样的界面:
集群勾选
其中最后一项“失败退化”中的 Token Server 含义如下:Token Server 是 Sentinel 用于集群流量控制的关键组件,它负责分发令牌并进行流量控制。当 Sentinel 的应用程序配置为集群限流模式时,它会向 Token Server 请求令牌,然后根据令牌情况来进行流量控制。 如果 Token Server 不可用,可能是由于网络故障、Token Server 实例崩溃等原因,这时候无法从 Token Server 获取令牌。Token Server 配置的含义如下:

  • 当配置选项为"是"时:表示当 Token Server 不可用时,Sentinel 会自动切换为单机限流模式。在单机限流模式中,Sentine 会从本地的限流规则进行流量控制,不再依赖 Token Server。这样可以保证即使 Token Server 不可用,也能够继续对流量进行限制。
  • 当配置选项为"否"时:表示当 Token Server 不可用时,Sentinel 不会自动切换为单机限流模式,流量控制会被暂停,即无法进行限流,可能会导致服务负载过高。

基于并发线程数限流

首先,在 OrderController 增加测试代码

@RequestMapping("list")
public Map list() throws InterruptedException {TimeUnit.SECONDS.sleep(5);return Map.of("title", "互联网架构之JAVA虚拟机JVM零基础到高级实战", "price", 199.00, "createTime", new Date());
}

然后测试访问下:http://localhost:9000/api/v1/video_order/list
测试访问
接着,配置对应的流控规则:
找到对应的资源
这里我们选择线程数,单机阈值为 1
设置阈值
重新请求 http://localhost:9000/api/v1/video_order/list,浏览器刷新两次
线程流控

流控效果-Warm Up 与 排队等待

Warm Up:冷启动/预热,如果系统在此之前⻓期处于空闲的状态,我们希望处理请求的数量是缓步的增多,经过预期的时间以后,到达系统处理请求个数的最⼤值。比如说,我们设置下面的值:就表示经过10s 达到最大阈值 90
流控规则
结合一个图再理解下
warm up

匀速排队
严格控制请求通过的间隔时间,也即是让请求以均匀的速度通过,对应的是漏桶算法,主要用于处理间隔性突发的流量,如消息队列,想象一下这样的场景,在某一秒有大量的请求到来,而接下来的几秒则处于空闲状态,我们希望系统能够在接下来的空闲期间逐渐处理这些请求,而不是在第一秒直接拒绝多余的请求
时间轴

注意:

  • 匀速排队等待策略是 Leaky Bucket 算法结合虚拟队列等待机制实现的。
  • 匀速排队模式暂时不支持 QPS > 1000 的场景
    官方文档: 流量控制 · alibaba/Sentinel Wiki (github.com)

熔断与降级

上面我们说了下流控相关的,这里我们开始讲讲面试经常问到的熔断与降级,熔断降级(虽然是两个概念,基本都是互相配合):

  • 对调用链路中不稳定的资源进行熔断降级也是保障高可用的重要措施之一
  • 对不稳定的弱依赖服务调用进行熔断降级,暂时切断不稳定调用,避免局部不稳定因素导致整体的雪崩
  • 熔断降级作为保护自身的手段,通常在客户端(调用端)进行配置、

什么是 Sentinel 降级规则 ? 官方文档,点击这里查看 ,总的来说:就是配置一定规则,然后满足之后就对服务进行熔断降级

熔断策略

慢调用比例(响应时间)

选择以慢调用比例作为阈值,需要设置允许的慢调用 RT(即最大的响应时间),请求的响应时间大于该值则统计为慢调用。
- 比例阈值:
- 熔断时长:超过时间后会尝试恢复
- 最小请求数:熔断触发的最小请求数,请求数小于该值时即使异常比率超出阈值也不会熔断
降级规则
这里对上面的规则进行说明,熔断触发的最小请求数为 5:

  • 请求数 < 5,即使异常比率超出阈值也不会熔断
  • 请求数 >= 5,就是表示只要有一个请求(比例阈值设置为 0.1 体现)的最大相应时间为 100毫秒(最大 RT 设置100体现),就熔断10s(熔断时长体现)

异常比例
当单位统计时长内请求数目大于设置的最小请求数目,并且异常的比例大于阈值,则接下来的熔断时长内请求会自动被熔断

  • 比例阈值
  • 熔断时长:超过时间后会尝试恢复。
  • 最小请求数:熔断触发的最小请求数,请求数小于该值时,即使异常比率超出阈值也不会熔断。
    异常比例

异常数
当单位统计时长内的异常数目超过阈值之后会自动进行熔断

  • 异常数:
  • 熔断时长:超过时间后会尝试恢复
  • 最小请求数:熔断触发的最小请求数,请求数小于该值时即使异常比率超出阈值也不会熔断
    异常数

熔断的状态

服务熔断一般有三种状态

  • 熔断关闭(Closed):服务没有故障时,熔断器所处的状态,对调用方的调用不做任何限制
  • 熔断开启(Open):后续对该服务接口的调用不再经过网络,直接执行本地的fallback方法
  • 半熔断(Half-Open):所谓半熔断就是尝试恢复服务调用,允许有限的流量调用该服务,并监控调用成功率
    熔断的状态

熔断的恢复:

  • 经过熔断时长后熔断器会进入探测恢复状态(HALF-OPEN 状态)尝试恢复服务调用,允许有限的流量调用该服务,并监控调用成功率。
  • 如果成功率达到预期,则说明服务已恢复,进入熔断关闭状态;如果成功率仍旧很低,则重新进入熔断状态

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

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

相关文章

信创基础软件之中间件

信创基础软件之中间件 中间件概述 中间件是一种应用于分布式系统的基础软件&#xff0c;位于应用与操作系统、数据库之间&#xff0c;主要用于解决分布式环境下数据传输、数据访问、应用调度、系统构建和系统集成、流程管理等问题&#xff0c;是分布式环境下支撑应用开发、运…

Unity 性能优化之光照优化(七)

提示&#xff1a;仅供参考&#xff0c;有误之处&#xff0c;麻烦大佬指出&#xff0c;不胜感激&#xff01; 文章目录 前言一、测试目的一、实时光源是什么&#xff1f;二、开始测试1.场景中只有一个光照的数值情况2.添加4个点光源后4.结果 总结 前言 实时光源数量越多&#x…

短信清空了!华为手机短信删除了怎么恢复?

“有没有人知道这是怎么回事呀&#xff0c;原先有一千多条未读一直放着没管&#xff0c;昨天根本没打开短信这个软件&#xff0c;今晚突然发现只剩一条了&#xff0c;是华为手机自动清理了吗&#xff01;到底该怎么恢复呀&#xff1f;我真崩溃&#xff01;” 在日常生活中&…

将jar包部署到CentOS7操作系统

1、手工部署项目 1、在IDEA中开发SpringBoot项目并打成jar包 &#xff08;通过Maven进行打包&#xff09; &#xff08;在target目录下的 jar包&#xff09; 2、将jar包上传到Linux服务器 # 创建目录&#xff0c;将项目jar包放到此目录 mkdir /usr/local/app 具体操作步骤&a…

力扣每日一练(螺旋矩阵)

54. 螺旋矩阵 - 力扣&#xff08;LeetCode&#xff09; 给你一个 m 行 n 列的矩阵 matrix &#xff0c;请按照 顺时针螺旋顺序 &#xff0c;返回矩阵中的所有元素。 示例 1&#xff1a; 输入&#xff1a;matrix [[1,2,3],[4,5,6],[7,8,9]] 输出&#xff1a;[1,2,3,6,9,8,7,4,…

Android Ant编译环境配置(Win)

1、 载ant包: 2、设置环境变量&#xff1a; 3、检查是否设置成功及版本 4、执行命令&#xff1a; android update project -p . -n “projectname”&#xff08;例如&#xff1a;android update project --target 1 -p . -n “Couplet”&#xff09;(只输入红色部分也是可以的…

Liunx磁盘管理(下)

中篇&#xff1a;https://blog.csdn.net/Lzcsfg/article/details/138355036 一.逻辑卷 逻辑卷&#xff08;Logical Volume&#xff09;是逻辑卷管理 (LVM) 中的一个概念&#xff0c;它为 Linux 系统中的存储管理提供了更大的灵活性和可扩展性。LVM 允许你将物理存储设备&…

vue2 webpack-dev-server Unknown promise rejection reason

在vue.config.js中添加如下配置&#xff0c;重启项目即可 module.exports defineConfig({devServer: {client: {overlay: false,},} })参考

Ranni: Taming Text-to-Image Diffusion for Accurate Instruction Following

Ranni: Taming Text-to-Image Diffusion for Accurate Instruction Following abstract 我们引入了一个语义面板作为解码文本到图像的中间件&#xff0c;支持生成器更好地遵循指令 Related work 最近的工作还通过包含额外的条件&#xff08;如补全掩码[15&#xff0c;45]、…

社区养老服务|基于Springboot+vue的社区养老服务平台设计与实现(源码+数据库+文档)

社区养老服务平台 目录 基于Java的社区养老服务平台设计与实现 一、前言 二、系统设计 三、系统功能设计 1用户信息管理 2 服务信息管理 3服务申请管理 4公告信息管理 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取&#…

Vue进阶之Vue项目实战(二)

Vue项目实战 构建基础框架路由 项目&#xff08; v1.0,base-app-layer&#xff09;导航 router物料编排选型 插件化插件化平时写代码场景 配置器开发 构建基础框架 路由 路由分类&#xff1a; memoryHistory&#xff1a;内存路由&#xff0c;路由信息记录在内存中&#xff0…

【NodeMCU实时天气时钟温湿度项目 2】WIFI模式设置及连接

第一专题内容&#xff0c;请参考&#xff1a; 【NodeMCU实时天气时钟温湿度项目 1】连接点亮SPI-TFT屏幕和UI布局设计-CSDN博客 NodeMCU是一个基于乐鑫ESP8266的开源IoT物联网硬件开发平台&#xff0c;支持WIFI功能&#xff0c;使用方法简单&#xff0c;受到越来越多来…