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

这篇具有很好参考价值的文章主要介绍了熔断、限流、降级 —— 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 控制台的流控规则中,新增流控规则,如图:

熔断、限流、降级 —— SpringCloud Alibaba Sentinel文章来源地址https://www.toymoban.com/news/detail-711966.html

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

到了这里,关于熔断、限流、降级 —— SpringCloud Alibaba Sentinel的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Sentinel 降级、限流、熔断

    在现代分布式系统中,如何有效地保护系统免受突发流量和故障的影响,是每个开发人员和架构师都需要思考的重要问题。在这样的背景下,Sentinel作为一个强大的系统保护和控制组件,为我们提供了降级、限流、熔断等多种策略,帮助我们更好地保障系统的稳定性和可用性

    2024年01月24日
    浏览(41)
  • SpringMvc集成开源流量监控、限流、熔断降级、负载保护组件Sentinel

    前言:作者查阅了Sentinel官网、51CTO、CSDN、码农家园、博客园等很多技术文章都没有很准确的springmvc集成Sentinel的示例,因此整理了本文,主要介绍SpringMvc集成Sentinel 随着微服务的流行,服务和服务之间的稳定性变得越来越重要。Sentinel 是面向分布式、多语言异构化服务架构的

    2024年02月05日
    浏览(61)
  • 【Springcloud】Sentinel熔断和降级

    服务的稳定是公司可持续发展的重要基石,随着业务量的快速发展,一些平时正常运行的服务,会出现各种突发状况,而且在分布式系统中,每个服务本身又存在很多不可控的因素,比如线程池处理缓慢,导致请求超时,资源不足,导致请求被拒绝,又甚至直接服务不可用、

    2024年02月09日
    浏览(46)
  • 【Spring Cloud】Sentinel流量限流和熔断降级的讲解

    🎉🎉欢迎来到我的CSDN主页!🎉🎉 🏅我是Java方文山,一个在CSDN分享笔记的博主。📚📚 🌟推荐给大家我的专栏《Spring Cloud》。🎯🎯 👉点击这里,就可以查看我的主页啦!👇👇 Java方文山的个人主页 🎁如果感觉还不错的话请给我点赞吧!🎁🎁 💖期待你的加入,一起

    2024年01月23日
    浏览(46)
  • 商城-学习整理-高级-商城业务-Sentinel&限流&熔断&降级&Sleuth+Zipkin链路追踪(二十二)

    什么是熔断 A 服务调用 B 服务的某个功能,由于网络不稳定问题,或者 B 服务卡机,导致功能时间超长。如果这样子的次数太多。我们就可以直接将 B 断路了(A 不再请求 B 接口),凡是调用 B 的直接返回降级数据,不必等待 B 的超长执行。 这样 B 的故障问题,就不会级联影

    2024年02月11日
    浏览(43)
  • 聊一聊服务治理三板斧:限流、熔断、降级和go-sentinel的实现

    我们知道,对于一个项目之初,我们不可能上来就按几千的并发去配置,为什么?两个方面,第一个是成本高。第二个是维护难度大。即便是天猫淘宝这种,也是采用的动态扩容的方式来应对双十一。那么一个项目如何应对突然的高并发,我们有哪些常用的措施和处理呢?我

    2024年01月19日
    浏览(44)
  • 熔断降级与限流在开源SpringBoot/SpringCloud微服务框架的最佳实践

    前期内容导读: Java开源RSA/AES/SHA1/PGP/SM2/SM3/SM4加密算法介绍 Java开源AES/SM4/3DES对称加密算法介绍及其实现 Java开源AES/SM4/3DES对称加密算法的验证说明 Java开源RSA/SM2非对称加密算法对比介绍 Java开源RSA非对称加密算法实现 Java开源SM2非对称加密算法实现 Java开源接口微服务代码框架

    2024年02月12日
    浏览(48)
  • SpringCloud.04.熔断器Hystrix( Spring Cloud Alibaba 熔断(Sentinel))

    目录 熔断器概述 使用Sentinel工具 什么是Sentinel 微服务集成Sentinel 配置provider文件,在里面加入有关控制台的配置 实现一个接口的限流 基本概念 重要功能 Sentinel规则 流控规则 简单配置 配置流控模式 配置流控效果 降级规则 @SentinelResource的使用 Feign整合Sentinel 由于Hystrix已经停

    2024年01月19日
    浏览(42)
  • SpringCloud之Gateway整合Sentinel服务降级和限流

    1.下载Sentinel.jar可以图形界面配置限流和降级规则 地址:可能需要翻墙 下载jar文件 2.引入maven依赖 3.写个自动注入Resource的过滤器类(可以不写注解直接使用) 4.写配置文件 application.properties 5.cmd命令行启动jar文件访问localhost:18080页面,自己设置QPS java -jar -server.port=18080 sentinel-dash

    2024年02月07日
    浏览(41)
  • Java之SpringCloud Alibaba【四】【微服务 Sentinel服务熔断】

    Java之SpringCloud Alibaba【一】【Nacos一篇文章精通系列】 跳转 Java之SpringCloud Alibaba【二】【微服务调用组件Feign】 跳转 Java之SpringCloud Alibaba【三】【微服务Nacos-config配置中心】 跳转 Java之SpringCloud Alibaba【四】【微服务 Sentinel服务熔断】 跳转 Java之SpringCloud Alibaba【五】【微服务

    2024年02月12日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包