ToB企服应用市场:ToB评测及商务社交产业平台

标题: 熔断、限流、降级 —— SpringCloud Alibaba Sentinel [打印本页]

作者: 勿忘初心做自己    时间: 2023-10-11 14:25
标题: 熔断、限流、降级 —— SpringCloud Alibaba Sentinel
Sentinel 简介

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

限流算法

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

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

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

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


Sentinel Dashboard

Sentinel 提供一个轻量级的开源控制台,包含如下功能:
从 GitHub 可以下载 Sentinel 安装包:https://github.com/alibaba/Sentinel/
下载得到的是一个 jar 包(sentinel-dashboard-1.8.6.jar),可以直接通过 Java 命令启动,如 java -jar 方式运行,默认端口为 8080,通过 http://localhost:8080/ 访问,用户名和密码默认是 sentinel

客户端接入控制台

引入依赖
  1. <dependency>
  2.     <groupId>com.alibaba.cloud</groupId>
  3.     <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
  4. </dependency>
复制代码
配置文件配置如下:
  1. spring:
  2.     cloud:
  3.         sentinel:
  4.             transport:
  5.                 port: 18000  # 指定应用与sentinel控制台交互的端口
  6.                 dashboard: localhost:8080   # sentinel后台地址
  7.             eager: true        # 开启sentinel,默认开启
复制代码
Sentinel 限流

Sentinel 流量控制的原理是监控应用流量的 QPS 或并发线程数等指标,当达到指定的阈值时对流量进行控制,以避免被瞬时的流量高峰冲垮,从而保障应用的高可用性
使用注解方式实现限流如下:
  1. @Slf4j
  2. @RestController
  3. public class TestCon {
  4.     @GetMapping("/test/byResource")
  5.     @SentinelResource(value = "byResource", blockHandler = "handleException")
  6.     public void byResource() {
  7.         log.info("按资源名称限流");
  8.     }
  9.     public void handleException(BlockException exception) {
  10.         log.error("触发失败回调方法", exception);
  11.     }
  12. }
复制代码
@SentinelResource 注解用于定义资源,可选属性如下:
在 Sentinel 控制台的流控规则中,新增流控规则,如图:



免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4