Sentinel[超详细讲解]-4

🚓 主要讲解流控模式的 三种方式中的两种: 直接、链路🚀

1️⃣ 直接模式

🚎 直接模式:对资源本身进行限流,例如对某个接口进行限流,当该接口的访问频率超过设定的阈值时,直接拒绝新的请求。

接口限流➡️ :对某个接口进行限流,例如对订单创建接口进行限流,当该接口的访问频率超过设定的阈值时,直接拒绝新的请求。

实现步骤: 

1️⃣ 引入依赖:在项目中引入 Sentinel 相关依赖如com.alibaba.csp.sentinel.annotation.SentinelResource  等

2️⃣ 定义资源:指定要限流的资源名称,像示例中的 createOrder。

3️⃣ 配置规则:

import com.alibaba.csp.sentinel.annotation.SentinelResource;
import com.alibaba.csp.sentinel.slots.block.BlockException;
import com.alibaba.csp.sentinel.slots.block.RuleConstant;
import com.alibaba.csp.sentinel.slots.block.flow.FlowRule;
import com.alibaba.csp.sentinel.slots.block.flow.FlowRuleManager;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.List;
@Service
public class OrderService {private static final String RESOURCE_NAME = "createOrder";@PostConstructprivate void initFlowRules() {List<FlowRule> rules = new ArrayList<>();FlowRule rule = new FlowRule();rule.setResource(RESOURCE_NAME);rule.setGrade(RuleConstant.FLOW_GRADE_QPS);rule.setCount(10);rule.setControlBehavior(RuleConstant.CONTROL_BEHAVIOR_DEFAULT);rule.setLimitApp("default");rules.add(rule);FlowRuleManager.loadRules(rules);}@SentinelResource(value = RESOURCE_NAME, blockHandler = "createOrderBlockHandler")public String createOrder(String orderInfo) {return "订单创建成功: " + orderInfo;}public String createOrderBlockHandler(String orderInfo, BlockException ex) {return "请求过于频繁,请稍后再试!当前订单信息: " + orderInfo;}

上述代码在 OrderService 类中,initFlowRules 方法初始化限流规则,设置资源为 createOrder,基于 QPS 限流,阈值 10。createOrder 方法是业务逻辑,被限流时 createOrderBlockHandler 方法返回友好提示。

2️⃣ 链路模式

🚫 链路流控(Link Flow Control)是指对资源调用关系的入口进行流量控制。与普通流控不同,链路流控关注的是入口资源和被调用资源之间的关系。

使用步骤🚲

1️⃣ 在配置文件中启用链路流控模式

spring:cloud:sentinel:web-context-unify: false # 必须设置为false才能启用链路流控

 2️⃣ 定义流控规则

控制台:在Sentinel控制台中定义链路流控规则,指定入口资源和被调用资源的关系,以及流控规则。

import com.alibaba.csp.sentinel.slots.block.flow.FlowRule;
import com.alibaba.csp.sentinel.slots.block.flow.FlowRuleManager;
import javax.annotation.PostConstruct;
import java.util.Collections;public class LinkFlowRuleConfig {private static final String ENTRY_RESOURCE = "orderWeb";private static final String TARGET_RESOURCE = "orderService";@PostConstructpublic void initLinkFlowRules() {FlowRule rule = new FlowRule();rule.setResource(TARGET_RESOURCE); // 被保护的资源rule.setGrade(RuleConstant.FLOW_GRADE_QPS); // 基于QPSrule.setCount(10); // 阈值rule.setLimitApp(ENTRY_RESOURCE); // 限制的入口资源FlowRuleManager.loadRules(Collections.singletonList(rule));}
}

这里定义入口资源 orderWeb 和被保护资源 orderService,设置基于 QPS 阈值 10 的限流规则 ✌️

3️⃣ 业务代码适配example

import com.alibaba.csp.sentinel.Entry;
import com.alibaba.csp.sentinel.SphU;
import com.alibaba.csp.sentinel.slots.block.BlockException;
import org.springframework.stereotype.Service;@Service
public class OrderService {public String createOrder(String orderInfo) {// 1. 定义入口资源try (Entry entry = SphU.entry("orderWeb")) {// 2. 实际业务处理return doCreateOrder(orderInfo);} catch (BlockException e) {// 3. 处理流控逻辑return "创建订单请求被限流";}}@SentinelResource(value = "orderService", blockHandler = "orderServiceBlockHandler")private String doCreateOrder(String orderInfo) {// 业务逻辑return "订单创建成功: " + orderInfo;}public String orderServiceBlockHandler(String orderInfo, BlockException ex) {return "订单服务繁忙,请稍后再试";}
}

🈲 链路流控的注意事项

  1. 入口资源定义:必须明确定义入口资源,通常使用SphU.entry()@SentinelResource注解

  2. 配置要求:必须设置 🚑 spring.cloud.sentinel.web-context-unify=false

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

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

相关文章

工作记录 2017-03-24

工作记录 2017-03-24 序号 工作 相关人员 1 修改了邮件上的问题。 更新RD服务器。 郝 更新的问题 1、修改了New User时 init的保存。 2、文件的查询加了ID。 3、加了 patient insurance secondary 4、修改了payment detail的处理。 识别引擎监控 Ps (iCDA LOG :剔除…

裴蜀定理:整数解的奥秘

裴蜀定理&#xff1a;整数解的奥秘 在数学的世界里&#xff0c;裴蜀定理&#xff08;Bzout’s Theorem&#xff09;是数论中一个非常重要的定理&#xff0c;它揭示了二次方程和整数解之间的关系。它不仅仅是纯粹的理论知识&#xff0c;还在计算机科学、密码学、算法优化等多个…

python之 “__init__.py” 文件

提示&#xff1a;python之 “init.py” 文件 文章目录 前言一、Python 中 __init__.py 文件的理解1. What&#xff08;是什么&#xff09;2. Why&#xff08;为什么需要&#xff09;3. Where&#xff08;在哪里使用&#xff09;4. How&#xff08;如何使用&#xff09; 二、问题…

Gemini 2.5 Pro与Claude 3.7 Sonnet编程性能对比

AI领域的语言模型竞赛日趋白热化,尤其在编程辅助方面表现突出。 Gemini 2.5 Pro和Claude 3.7 Sonnet作为该领域的佼佼者,本文通过一系列编程测试与基准评估对两者的编码功能进行对比分析。 核心结论: • Gemini 2.5 Pro在SWE Bench硬核编程测试中以63.8%的通过率略胜Clau…

On Superresolution Effects in Maximum Likelihood Adaptive Antenna Arrays论文阅读

On Superresolution Effects in Maximum Likelihood Adaptive Antenna Arrays 1. 论文的研究目标与实际问题意义1.1 研究目标1.2 解决的实际问题1.3 实际意义2. 论文提出的新方法、模型与公式2.1 核心创新:标量化近似表达式关键推导步骤:公式优势:2.2 与经典方法的对比传统方…

GIT 撤销上次推送

注意&#xff1a;在执行下述操作之前先备份现有工作进度&#xff0c;如果不慎未保存&#xff0c;在代码编辑器中正在修改的文件下&#xff0c;使用CtrlZ 撤销试试 撤销推送的方法 情况 1&#xff1a;您刚刚推送到远程仓库 如果您的推送操作刚刚完成&#xff0c;并且没有其他…

透视飞鹤2024财报:如何打赢奶粉罐里的科技战?

去年乳制品行业压力还是不小的&#xff0c;尼尔森IQ指出2024年国内乳品市场仍处在收缩区间。但是&#xff0c;总有龙头能抗住压力&#xff0c;飞鹤最近交出的2024财报中就有很多亮点。 比如&#xff0c;2024年飞鹤营收207.5亿元、同比增长6%&#xff0c;净利润36.5亿元&#x…

解决STM32CubeMX中文注释乱码

本人采用【修改系统环境变量】的方法 1. 使用快捷键 win X&#xff0c;打开【系统R】&#xff0c;点击【高级系统设置】 2. 点击【环境变量】 3. 点击【新建】 4.按图中输入【JAVA_TOOL_OPTIONS】和【-Dfile.encodingUTF-8】&#xff0c;新建环境变量后重启CubeMX即可。 解释…

使用typescript实现游戏中的JPS跳点寻路算法

JPS是一种优化A*算法的路径规划算法&#xff0c;主要用于网格地图&#xff0c;通过跳过不必要的节点来提高搜索效率。它利用路径的对称性&#xff0c;只扩展特定的“跳点”&#xff0c;从而减少计算量。 deepseek生成的总是无法完整运行&#xff0c;因此决定手写一下。 需要注…

Jetpack Compose 状态管理指南:从基础到高级实践

在Jetpack Compose中&#xff0c;界面状态管理是构建响应式UI的核心。以下是Compose状态管理的主要概念和实现方式&#xff1a; 基本状态管理 1. 使用 mutableStateOf Composable fun Counter() {var count by remember { mutableStateOf(0) }Button(onClick { count }) {T…

vant4+vue3上传一个pdf文件并实现pdf的预览。使用插件pdf.js

注意下载的插件的版本"pdfjs-dist": "^2.2.228", npm i pdfjs-dist2.2.228 然后封装一个pdf的遮罩。因为pdf文件有多页&#xff0c;所以我用了swiper轮播的形式展示。因为用到移动端&#xff0c;手动滑动页面这样比点下一页下一页的方便多了。 直接贴代码…

Leetcode hot 100(day 4)

翻转二叉树 做法&#xff1a;递归即可&#xff0c;注意判断为空 class Solution { public:TreeNode* invertTree(TreeNode* root) {if(rootnullptr)return nullptr;TreeNode* noderoot->left;root->leftinvertTree(root->right);root->rightinvertTree(node);retu…

C,C++语言缓冲区溢出的产生和预防

缓冲区溢出的定义 缓冲区是内存中用于存储数据的一块连续区域&#xff0c;在 C 和 C 里&#xff0c;常使用数组、指针等方式来操作缓冲区。而缓冲区溢出指的是当程序向缓冲区写入的数据量超出了该缓冲区本身能够容纳的最大数据量时&#xff0c;额外的数据就会覆盖相邻的内存区…

大数据(4)Hive数仓三大核心特性解剖:面向主题性、集成性、非易失性如何重塑企业数据价值?

目录 背景&#xff1a;企业数据治理的困境与破局一、Hive数据仓库核心特性深度解析1. ‌面向主题性&#xff08;Subject-Oriented&#xff09;&#xff1a;从业务视角重构数据‌2. ‌集成性&#xff08;Integrated&#xff09;&#xff1a;打破数据孤岛的统一视图‌3. ‌非易失…

A股复权计算_前复权数据计算_终结章

目录 前置&#xff1a; 计算方法推导 数据&#xff1a; 代码&#xff1a; 视频&#xff1a; 前置&#xff1a; 1 本系列将以 “A股复权计算_” 开头放置在“随想”专栏 2 权息数据结合 “PostgreSQL_” 系列博文中的股票未复权数据&#xff0c;可以自行计算复权日数据 …

Nature:新发现!首次阐明大脑推理神经过程

人类具有快速适应不断变化的环境的认知能力。这种能力的核心是形成高级、抽象表示的能力&#xff0c;这些表示利用世界上的规律来支持泛化。然而&#xff0c;关于这些表征如何在神经元群中编码&#xff0c;它们如何通过学习出现以及它们与行为的关系&#xff0c;人们知之甚少。…

Kotlin 集合函数:map 和 first 的使用场景

Kotlin 提供了丰富的集合操作函数&#xff0c;使开发者可以更加简洁、高效地处理数据。其中&#xff0c;map 和 first 是两个常用的函数&#xff0c;分别用于转换集合和获取集合中的第一个元素。 1. map 的使用场景 场景 1&#xff1a;对象列表转换 在开发中&#xff0c;我们…

EIR管理中IMEI和IMSI信息的作用

在EIR&#xff08;设备身份注册&#xff09;管理中&#xff0c;IMEI&#xff08;国际移动设备身份码&#xff09;和IMSI&#xff08;国际移动用户识别码&#xff09;各自具有重要作用&#xff0c;以下是详细介绍&#xff1a; IMEI的作用 设备身份识别&#xff1a;IMEI是移动设…

MAUI开发第一个app的需求解析:登录+版本更新,用于喂给AI

vscode中MAUI框架已经搭好,用MAUI+c#webapi+orcl数据库开发一个app, 功能是两个界面一个登录界面,登录注册常用功能,另一个主窗体,功能先空着,显示“主要功能窗体”。 这是一个全新的功能,需要重零开始涉及所有数据表 登录后检查是否有新版本程序,自动更新功能。 1.用户…

KUKA机器人查看运行日志的方法

对于KUKA机器人的运行日志都是可以查看和导出的&#xff0c;方便查找问题。KUKA机器人的运行日志查看方法如下&#xff1a; 1、在主菜单下&#xff0c;选择【诊断】-【运行日志】-【显示】下打开&#xff1b; 2、显示出之前的机器人运行日志&#xff1b; 3、也可以通过【过滤器…