当前位置: 首页 > news >正文

SpringCloud Alibaba Sentinel 流量控制之流控模式实践总结

官网文档:https://sentinelguard.io/zh-cn/docs/flow-control.html

wiki地址:https://github.com/alibaba/Sentinel/wiki/%E6%B5%81%E9%87%8F%E6%8E%A7%E5%88%B6

本文版本:spring-cloud-starter-alibaba:2.2.0.RELEASE

在这里插入图片描述
在这里插入图片描述

如下图所示,我们可以针对某个资源添加流控规则,流控模式有直接、关联和链路。

在这里插入图片描述

【1】直接

添加流控规则如下,阈值类型为QPS,单机阈值为1。表示1秒钟内查询1次就是OK,若超过次数1,就直接-快速失败,报默认错误。
在这里插入图片描述

浏览器频繁访问 :http://localhost:8401/testA ,将会抛出异常信息Blocked by Sentinel (flow limiting)。

在这里插入图片描述

需要说明的是,在未做持久化前,每次服务实例的重启都会清空流控规则。

【2】关联

当两个资源之间具有资源争抢或者依赖关系的时候,这两个资源便具有了关联。

比如对数据库同一个字段的读操作和写操作存在争抢,读的速度过高会影响写得速度,写的速度过高会影响读的速度。如果放任读写操作争抢资源,则争抢本身带来的开销会降低整体的吞吐量。

可使用关联限流来避免具有关联关系的资源之间过度的争抢。举例来说,read_db 和 write_db 这两个资源分别代表数据库读写,我们可以给 read_db 设置限流规则来达到写优先的目的:设置 FlowRule.strategy 为 RuleConstant.RELATE 同时设置 FlowRule.ref_identity 为 write_db。这样当写库操作过于频繁时,读数据的请求会被限流。

简单来说就是:当与A关联的资源B达到阀值后,就限流A自己。

如下,我们给资源B设置规则:QPS/1

在这里插入图片描述

我们给资源A修改规则:即只有当B触发限流时,A的QPS/1这个规则才生效

在这里插入图片描述

如下下图所示,如果B未触发限流,那么A的QPS/1是不生效的。
在这里插入图片描述

然后同时请求资源A、资源B,使B达到阈值,此时A也会返回错误信息。

在这里插入图片描述

【3】链路

在这里插入图片描述
简单来讲,资源的链路入口方将会受规则控制,其他的调用不关心。

添加pom文件

<dependency><groupId>com.alibaba.csp</groupId><artifactId>sentinel-web-servlet</artifactId>
</dependency>

添加配置类:

@Configuration
public class FilterContextConfig {@Beanpublic FilterRegistrationBean sentinelFilterRegistration() {FilterRegistrationBean registration = new FilterRegistrationBean();registration.setFilter(new CommonFilter());registration.addUrlPatterns("/*");// 入口资源关闭聚合registration.addInitParameter(CommonFilter.WEB_CONTEXT_UNIFY, "false");registration.setName("sentinelFilter");registration.setOrder(1);return registration;}
}

定义一个service资源:

@Service
public class JaneService {// 定义限流资源@SentinelResource("common")public String common(){return "common";}
}

定义controller:

@Autowired
JaneService janeService;@GetMapping("/testA")
public String testA(){janeService.common();return "testA";
}@GetMapping("/testB")
public String testB(){janeService.common();return "testB";
}

给common添加链路规则:
在这里插入图片描述
这样频繁请求testA将会报错,但是频繁请求testB正常,说明我们的链路控制生效。

在这里插入图片描述

http://www.lryc.cn/news/384404.html

相关文章:

  • 【高考志愿】电子科学与技术
  • 2024.06.26【读书笔记】|医疗科技创新流程(前言)【AI增强版】
  • kubernetes Job yaml文件解析
  • php goto解密脚本源码
  • 2023: 芒种集•序言
  • Camera定制修改
  • LeetCode 算法:验证二叉搜索树 c++
  • SpringBoot优点达项目实战:获取系统配置接口(三)
  • 【C语言】字符/字符串+内存函数
  • 上下文管理器在Python中的妙用
  • 【PWN · TcachebinAttack | UAF】[2024CISCN · 华中赛区] note
  • Java数据脱敏
  • 【Java Web】三大域对象
  • 【Linux】进程信号_3
  • LongRAG:利用长上下文大语言模型提升检索生成效果
  • go中的方法 func-----数据类型
  • 408计算机网络--物理层
  • 十年,亚马逊云科技合作伙伴网络开启AI新征程
  • 基于Spring Boot的在线医疗咨询平台的设计与实现【附源码】
  • 星坤Type-A连接器:创新快充技术,引领电子连接!
  • 入门JavaWeb之 Response 下载文件
  • Java自定义注解校验token并直接返回给前端状态
  • C++ | Leetcode C++题解之第200题岛屿数量
  • Linux安全配置
  • vue实现不预览PDF的情况下打印pdf文件
  • C++ | Leetcode C++题解之第199题二叉树的右视图
  • [leetcode]圆圈中最后剩下的数字/ 破冰游戏
  • mysql数据库的管理
  • Java项目分层(持续更新中)
  • 2024年软件测试面试题大全【答案+文档】