熔断、限流、降级 —— SpringCloud Alibaba Sentinel

Sentinel 简介

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

Sentinel 提供了两个服务组件:

  • Sentinel 用来实现微服务系统中服务熔断、降级等功能
  • Sentinel Dashboard 用来监控微服务系统中流量调用等情况

限流算法

限流的方式有很多,常用的有计数器、漏桶和令牌桶等

1. 计数器

采用计数器是一种比较简单的限流算法,一般会限制一秒钟能够通过的请求数。比如限流 QPS 为 100,算法的实现思路就是从第一个请求进来开始计时,在接下来的 1 秒内每来一个请求就把计数加 1,如果累加的数字达到了 100,后续的请求就会被全部拒绝。等到 1 秒结束后,把计数恢复成 0,重新开始计数。如果在单位时间 1 秒内的前 10 毫秒处理了 100 个请求,那么后面的 990 毫秒会请求拒绝所有的请求,我们把这种现象称为突刺现象

2. 漏桶算法

漏桶算法的思路很简单,一个固定容量的漏桶按照常量固定速率流出水滴。如果桶是空的,就不需要流出水滴。我们可以按照任意速率流入水滴到漏桶。如果流入的水滴超出了桶的容量,流入的水滴就会溢出(被丢弃),而漏桶容量是不变的。漏桶算法提供了一种机制,通过它可以让突发流量被整形,以便为网络提供稳定的流量

3. 令牌桶算法

令牌桶算法是比较常见的限流算法之一,可以使用它进行接口限流。令牌按固定的速率被放入令牌桶中,当桶装满时,新添加的令牌会被丢弃或拒绝。当请求到达时,将从桶中删除 1 个令牌。令牌桶中的令牌不仅可以被移除,还可以往里添加,所以为了保证接口随时有数据通过,必须不停地往桶里加令牌。由此可见,往桶里加令牌的速度决定了数据通过接口的速度。我们通过控制往令牌桶里加令牌的速度来控制接口的流量

4. 漏桶算法和令牌桶算法的区别
  • 漏桶算法是按照常量固定选率流出请求的,流入请求速率任意,当流入的请求数累积到漏桶容量时,新流入的请求被拒绝
  • 令牌桶算法是按照固定速率往桶中添加令牌的,请求是否被处理需要看桶中的令牌是否足够,当令牌数减为零时,拒绝新的请求
  • 令牌桶算法允许突发请求,只要有令牌就可以处理,允许一定程度的突发流量
  • 漏桶算法限制的是常量流出速率,从而使突发流入速率平滑

Sentinel Dashboard

Sentinel 提供一个轻量级的开源控制台,包含如下功能:

  • 查看机器列表以及健康情况:收集 Sentinel 客户端发送的心跳包,用于判断机器是否在线
  • 监控(单机和集群):通过 Sentinel 客户端暴露的监控 API,定期拉取并且聚合应用监控信息,最终可以实现秒级的实时监控
  • 规则管理和推送:统一管理推送规则
  • 鉴权:在生产环境中,鉴权非常重要,这里每个开发者需要根据自己的实际情况进行定制

从 GitHub 可以下载 Sentinel 安装包:https://github.com/alibaba/Sentinel/

下载得到的是一个 jar 包(sentinel-dashboard-1.8.6.jar),可以直接通过 Java 命令启动,如 java -jar 方式运行,默认端口为 8080,通过 http://localhost:8080/ 访问,用户名和密码默认是 sentinel


客户端接入控制台

引入依赖

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

配置文件配置如下:

spring:cloud:sentinel:transport:port: 18000  # 指定应用与sentinel控制台交互的端口dashboard: localhost:8080   # sentinel后台地址eager: true	# 开启sentinel,默认开启

Sentinel 限流

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

使用注解方式实现限流如下:

@Slf4j
@RestController
public class TestCon {@GetMapping("/test/byResource")@SentinelResource(value = "byResource", blockHandler = "handleException")public void byResource() {log.info("按资源名称限流");}public void handleException(BlockException exception) {log.error("触发失败回调方法", exception);}
}

@SentinelResource 注解用于定义资源,可选属性如下:

  • value:指定资源名称

  • blockHandler / blockHandlerClass:指定处理 BlockExccption 异常函数名称。函数要求必须是 public,返回类型与原方法必须一致,函数参数类型需要和原方法相匹配并在最后加 BlockException 类型的参数,函数默认和原方法在同一个类中。若希望使用其他类的函数可配置 blockHandlerClass,并指定 blockHandlerClass 里面的方法,注意对应的函数必需为 static 函数,否则无法解析

    // TestCon.java
    @GetMapping("/test/byResource")
    @SentinelResource(value = "byResource", blockHandler="handleBolckForTest", blockHandlerClass={BlockHandlerClassTest})
    public void byResource() {log.info("按资源名称限流");
    }// BlockHandlerClassTest.java
    public static String handleBolckForTest(String name,int age, BlockException exception){xxxxx
    }
    
  • fallback / fallbackClass:用于在抛出异常的时候提供 fallback 处理逻辑,可以针对所有类型的异常(除了 exceptionsToIgnore 里面排除掉的异常类型)进行处理,返回值类型必须与原函数返回值类型一致,方法参数列表需要和原函数一致,或者可以额外多一个 Throwable 类型的参数用于接收对应的异常,fallback 函数默认需要和原方法在同一个类中,若希望使用其他类的函数,则可以指定 fallbackClass 为对应的类的 Class 对象,注意对应的函数必需为 static 函数,否则无法解析

在 Sentinel 控制台的流控规则中,新增流控规则,如图:

在这里插入图片描述

  • 资源名:需要和 @SentineResource 注解的 value 属性值保持一致
  • 针对来源:默认 default,表示对所有来源进行限流,有时候我们会希望根据上级微服务或者请求来源进行限流,可以根据自身的需求进行相应的配置
  • 阈值类型:Sentinel 限流策略有两种统计类型,一种是统计并发线程数,另一种是统计 QPS
    • 当 QPS 超过某个阈值的时候,采取措施进行流量控制,包括:
      • 直接拒绝:默认的流量控制方式,当 QPS 超过任意规则的阈值,新的请求会被立即拒绝并抛出 FlowExccption
      • Warm Up:预热/冷启动方式,在系统长期处于低水位的情况下,当流量突然增加时,直接把系统拉升到高水位可能瞬间把系统压垮,通过冷启动让通过的流量缓慢增加,在一定时间内逐渐增加到阈值上限,给冷系统一个预热的时间,避免冷系统被压垮
      • 匀速排队:严格控制请求通过的间隔时间,即让请求以均匀的速度通过,对应的是漏桶算法
  • 流控模式:
    • 直接:接口达到限流条件时,开启限流
    • 关联:当指定接口关联的接口达到限流条件时,开启对指定接口开启限流,举例:设置关联资源为 byResource2,那么当 byResource2 达到限流条件时,byResource 将不可用
    • 链路:当从某个接口过来的资源达到限流条件时,开启限流,举例:有两个接口 getResource1 和 getResource2 能调用 byResource 资源,如果设置了 getResource1 并达到限流条件,那么将无法再通过 getResource1 调用 byResource,而 getResource2 不受影响

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

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

相关文章

AAU-net: 用于超声图像中乳腺病变分割的自适应注意力U-Net

AAU-net 期刊分析摘要贡献方法整体框架1.Hybrid Adaptive Attention Module2.Channel Self-Attention Block3.Spatial Self-Attention Block![在这里插入图片描述](https://img-blog.csdnimg.cn/629948402dc647d2b61817db3cd203f1.png) 实验1.消融实验1.1 Architecture Ablatio…

《protobuf》基础语法3

文章目录 默认值更新规则保留字段未知字段 默认值 在反序列化时&#xff0c;若被反序列化的二进制序列中不包含某个字段&#xff0c;则在反序列化时&#xff0c;就会设置对应默认值。不同的类型默认值不同&#xff1a; 类型默认值字符串“”布尔型false数值类型0枚举型0设置了…

基于风驱动优化的BP神经网络(分类应用) - 附代码

基于风驱动优化的BP神经网络&#xff08;分类应用&#xff09; - 附代码 文章目录 基于风驱动优化的BP神经网络&#xff08;分类应用&#xff09; - 附代码1.鸢尾花iris数据介绍2.数据集整理3.风驱动优化BP神经网络3.1 BP神经网络参数设置3.2 风驱动算法应用 4.测试结果&#x…

Zookeeper经典应用场景实战(一)

文章目录 1、Zookeeper Java客户端实战1.1、 Zookeeper 原生Java客户端使用1.2、 Curator开源客户端使用 2、 Zookeeper在分布式命名服务中的实战2.1、 分布式API目录2.2、 分布式节点的命名2.3、 分布式的ID生成器 3、Zookeeper实现分布式队列3.1、 设计思路3.2、 使用Apache …

Springboot学生成绩管理系统idea开发mysql数据库web结构java编程计算机网页源码maven项目

一、源码特点 springboot 学生成绩管理系统是一套完善的信息系统&#xff0c;结合springboot框架和bootstrap完成本系统&#xff0c;对理解JSP java编程开发语言有帮助系统采用springboot框架&#xff08;MVC模式开发&#xff09;&#xff0c;系统 具有完整的源代码和数据库&…

Android:实现手机前后摄像头预览同开

效果展示 一.概述 本博文讲解如何实现手机前后两颗摄像头同时预览并显示 我之前博文《OpenGLES&#xff1a;GLSurfaceView实现Android Camera预览》对单颗摄像头预览做过详细讲解&#xff0c;而前后双摄实现原理其实也并不复杂&#xff0c;粗糙点说就是把单摄像头预览流程写两…

TikTok环保运动:短视频平台上的可持续发展

在当今社交媒体的繁荣时代&#xff0c;TikTok已经成为全球范围内年轻一代最喜爱的短视频分享平台之一。 数以亿计的用户在这里分享他们的创造力、生活片段和喜好。然而&#xff0c;随着全球环保意识的不断增强&#xff0c;TikTok也成为了一个独特的环境&#xff0c;倡导可持续…

Node-RED系列教程-25node-red获取天气

安装节点:node-red-contrib-weather 节点图标如下: 使用说明:node-red-contrib-weather (node) - Node-RED 流程图中填写经度和纬度即可。 演示: json内容: {

【重磅】这就是元宇宙碰撞的后果

筹备了一年多——朋友们&#xff0c;它终于来了&#xff01; 我们刚刚宣布官方 Aavegotchi x Sandbox 在 X 上共享元宇宙体验。 10 月 25 日在 The Sandbox 上线&#xff0c;有两份可领取的空投。 Gotchi 游戏即将爆发。你们兴奋吗&#xff1f;

氟化钡镜片

氟化钡晶体具有良好的光学透过性能&#xff0c;在0.15μm-14.5μm的光谱范围内&#xff0c;可以用作紫外和红外光学窗口。同时&#xff0c;又具有优良的闪烁性能&#xff0c;成为高能物理与核物理、核医学等领域中重要的晶体材料。 特此记录 anlog 2023年10月7日

Linux 逻辑卷

目录 一、认识 1、概念 2、术语&#xff1a; 1&#xff09;物理存储设备 2&#xff09;物理卷 3&#xff09;卷组 4&#xff09;PE物理区域 5&#xff09;逻辑卷 6&#xff09;LE逻辑区域 7&#xff09;VGDA卷组描述符区域 二、部署逻辑卷 1、物理卷管理 2、卷组…

防御安全第五次作业

1. 什么是数据认证&#xff0c;有什么作用&#xff0c;有哪些实现的技术手段&#xff1f; 数据认证是指保证数据的真实性、完整性和可信度&#xff0c;以确保数据不被篡改或伪造。其作用包括但不限于&#xff1a; 保护关键数据不被恶意篡改或损坏 提供数据来源的可靠性和安全性…

E: Unable to locate package XXX

问题描述&#xff1a; 当使用 apt-get install XXX 安装包时&#xff0c;出现错误 E: Unable to locate package XXX 解决方法&#xff1a; apt-get update apt-get install XXX

为什么append到父节点后的子节点发生修改,父节点打印出来的也会变化

今天走查前端代码&#xff0c;发现历史代码写出来的不规范&#xff0c;但是他还是在生产运行了很久的代码&#xff0c;仔细思量后发现&#xff0c;其实原理是对的&#xff0c;只是看起来不美观&#xff0c;不易读而已。 废话不说&#xff0c;先上demo代码 <!DOCTYPE html&g…

【Spring Boot】创建一个 Spring Boot 项目

创建一个 Spring Boot 项目 1. 安装插件2. 创建 Spring Boot 项目3. 项目目录介绍和运行注意事项 1. 安装插件 IDEA 中安装 Spring Boot Helper / Spring Assistant / Spring Initializr and Assistant插件才能创建 Spring Boot 项⽬ &#xff08;有时候不用安装&#xff0c;直…

维修派单系统好用吗?如何实现数字化后勤管理?

在当今社会&#xff0c;各种设备和设施的正常运转对于单位和组织来说至关重要。然而&#xff0c;由于各种因素的影响&#xff0c;设备和设施在日常运行过程中难免会出现故障。这时&#xff0c;高效的维修服务就显得尤为重要。而“的修”维修派单系统&#xff0c;就是一种专为维…

2023八股每日一题(九月份)

文章目录 9月13日【JDK、JRE、JVM之间的区别】9月14日【什么是面向对象&#xff1f;】9月15日【和equals比较】9月16日【final 关键字的作用】9月17日【String、StringBuffer、StringBuilder】9月18日【重载和重写的区别】9月19日【接口和抽象类的区别】9月20日【List和Set的区…

力扣第572题 另一棵树的子树 c++深度(DFS)注释版

题目 572. 另一棵树的子树 简单 给你两棵二叉树 root 和 subRoot 。检验 root 中是否包含和 subRoot 具有相同结构和节点值的子树。如果存在&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 二叉树 tree 的一棵子树包括 tree 的某个节点和这个节点的所有…

数据挖掘(3)特征化

从数据分析角度&#xff0c;DM分为两类&#xff0c;描述式数据挖掘&#xff0c;预测式数据挖掘。描述式数据挖掘是以简介概要的方式描述数据&#xff0c;并提供数据的一般性质。预测式数据挖掘分析数据建立模型并试图预测新数据集的行为。 DM的分类&#xff1a; 描述式DM&#…

为什么企业都在申报“高新技术”?有以下十大好处!

随着信息技术时代的迅速发展&#xff0c;很多企业为了能够在同行中脱颖而出&#xff0c;都会选择办理一些和企业相关的资质证书&#xff0c;以便提升企业的核心竞争力&#xff0c;今天同邦信息科技的小编就告诉大家为什么那么多企业都选择申报“高新技术”企业&#xff1f; 首先…