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

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";
    @PostConstruct
    private 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";
    
    @PostConstruct
    public void initLinkFlowRules() {
        FlowRule rule = new FlowRule();
        rule.setResource(TARGET_RESOURCE); // 被保护的资源
        rule.setGrade(RuleConstant.FLOW_GRADE_QPS); // 基于QPS
        rule.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

相关文章:

  • 【linux】malloc函数申请过程理解
  • HTML中一些需要注意的要点
  • 设计模式(结构性)-代理模式
  • GaussDB高安全—全密态数据库
  • Android SystemProperties 读写机制详解和案例使用
  • 长城汽车联手宇树科技,KPaaS如何赋能制造业数字化升级?
  • # 实时人脸识别系统:基于 OpenCV 和 Python 的实现
  • vue: easy-cron扩展-更友好地显示表达式
  • 【学习篇】pandas进行数据清洗
  • Vue 组件 - 动态组件
  • 蓝牙数字音频和模拟音频优劣势对比?
  • Redis-16.在Java中操作Redis-Spring Data Redis使用方式-操作有序集合类型的数据
  • hive数据仓库
  • arcgis jsapi 4.31 调用geoserver 发布的wms服务
  • Anaconda和Pycharm的区别,以及如何选择两者
  • JVM 学习计划表(2025 版)
  • 01_使用Docker将Coding上项目部署到k8s平台
  • STM32 FATFS - 在SDIO的SD卡中运行fatfs
  • Redis 缓存基础数据类型详解
  • Qt5.14.2+mingw64编译OpenCV3.4.14一次成功记录
  • 上海市委常委会扩大会议传达学习习近平总书记考察上海重要讲话和在部分省区市“十五五”时期经济社会发展座谈会上的重要讲话精神
  • 综合治理食品添加剂滥用问题,国务院食安办等六部门联合出手
  • 马斯克的胜利?OpenAI迫于压力放弃营利性转型计划
  • 中国医药科技出版社回应发布“男性患子宫肌瘤”论文:正在核查
  • 女租客欠租后失联,房东开门后无处下脚:40平公寓变垃圾场
  • 被炒热的“高潮针”:超适应症使用,安全性和有效性存疑