首页 > 其他分享 >熔断、限流、降级 —— SpringCloud Alibaba Sentinel

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

时间:2023-10-01 16:45:28浏览次数:49  
标签:令牌 请求 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 不受影响

标签:令牌,请求,SpringCloud,Alibaba,算法,限流,Sentinel,漏桶
From: https://www.cnblogs.com/Yee-Q/p/17738965.html

相关文章

  • SpringCloud微服务学习笔记(二)【Feign,Gateway,Docker】
    Feign先来看我们以前利用RestTemplate发起远程调用的代码:存在下面的问题:•代码可读性差,编程体验不统一•参数复杂URL难以维护Feign是一个声明式的http客户端,官方地址:https://github.com/OpenFeign/feign其作用就是帮助我们优雅的实现http请求的发送,解决上面提到的问题。基......
  • Go每日一库之162:throttled(轻量级限流工具)
    throttled是一个非常轻量且易扩展的限流组件,我们可以将它轻松地集成到应用程序中,以实现限流和配额管理的能力。简介throttled(https://github.com/throttled/throttled)基于通用信元速率算法实现了对资源的访问速率限制,资源可以是特定的URL、用户或者任何自定义的形式,可以很......
  • 声明式调用 —— SpringCloud OpenFeign
    Feign简介SpringCloudFeign是一个HTTP请求调用的轻量级框架,可以以Java接口注解的方式调用HTTP请求,而不用通过封装HTTP请求报文的方式直接调用Feign通过处理注解,将请求模板化,当实际调用的时候传入参数,根据参数再应用到请求上,进而转化成真正的请求第一个Feign程......
  • SpringCloud
    目录Springcloud介绍注册中心(Eureka)背景注册中心案例总结负载均衡(Ribbon)测试使用负载均衡RibbonRibbon负载均衡流程Ribbon的IRule常见负载均衡策略Ribbon的使用方法远程调用(OpenFeign)Feign使用连接池注册中心(Nacos)测试配置集群命名空间Nacos非临时实例配置中心(Nacos)客......
  • springcloud gateway 获取响应体进行加密操作,byte[]转换String乱码
    记录一下困扰一星期的问题!在全局过滤器中,获取响应体进行加密操作,在拿到byte[]之后转成String,控制台打印出来是乱码,编码也加了UTF-8还是报错。publicMono<Void>filter(ServerWebExchangeexchange,GatewayFilterChainchain){ServerHttpResponseoriginalResponse=ex......
  • SpringCloud之配置中心&swagger聚合
    1.什么是服务配置中心首先我们来看一下,微服务架构下关于配置文件的一些问题:1.配置文件相对分散。在一个微服务架构下,配置文件会随着微服务的增多变的越来越多,而且分散在各个微服务中,不好统一配置和管理。2.配置文件无法区分环境。微服务项目可能会有多个环境,例如:测......
  • 使用Guava实现单体应用限流
    一、概述服务器流量控制一直都是一个非常重要的问题。因为服务器是有性能瓶颈的,所以后台的接口也有其性能瓶颈,当辛辛苦苦的把多级缓存做好后,觉得可以承受高并发了的时候,服务突然就蹦了,可能是缓存爆掉了,也可能是数据库宕机了。造成这些问题的大多数原因就是流量太高了的问题。......
  • springcloud微服务03-heima2023
    在微服务远程调用的过程中,还存在几个问题需要解决。首先是业务健壮性问题:例如在之前的查询购物车列表业务中,购物车服务需要查询最新的商品信息,与购物车数据做对比,提醒用户。大家设想一下,如果商品服务查询时发生故障,查询购物车列表在调用商品服务时,是不是也会异常?从而导致购物车......
  • .net webapi限流记录
     一,WebApiThrottleASP.NETWebAPIratelimiterforIISandOwinhostinghttps://github.com/stefanprodan/WebApiThrottle 二,AspNetCoreRateLimitASP.NETCoreratelimitingmiddlewarehttps://github.com/stefanprodan/AspNetCoreRateLimit......
  • 基于 COLA 架构的 Spring Cloud Alibaba(六) Spring Cloud Gateway
    在之前的篇章中,我们访问账户服务、商品服务、订单服务时,都要分别指定服务对应的端口进行访问。在实际应用中,服务的实际端口是不对外暴露的。如果要搭建更多的服务,那么我们对服务的访问将要维护更多的端口和访问路径。对此,本篇将介绍使用SpringCloudGateway对服务入口进行统一管......