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

快速理解微服务中Sentinel怎么实现限流

Sentinel是通过动态管理限流规则,根据定义的规则对请求进行限流控制。

一.实现步骤

1.定义资源:在Sentinel中,资源可以是URL、方法等,用于标识需要进行限流的请求;(在Sentinel中,需要我们去告诉Sentinel哪些资源需要被限流)

    // 原本的业务方法
    @SentinelResource(blockHandler = "blockHandlerForGetUser")
    public User getUserById(String id) {
        return new User("admin");
    }

    // blockHandler函数,原方法调用被限流/降级/系统保护的时候调用
    public User blockHandlerForGetUser(String id, BlockException ex) {
        throw new RuntimeException("系统繁忙,请稍后再试");
    }

上面这个getUserById这个方法使用了@SentinelResource注解,就告诉了Sentinel,该方法需要进行限流处理,里面的Value值代表当触发了限流操作后,就会来回调这个自定义方法,这个自定义方法可以是一个自定义的提示,也可以是一直自定义的逻辑处理。

2.配置限流规格:在Sentinel的配置文件中定义资源的限流规则,规则可以包括资源名称、限流阈值、限流模式(令牌桶或漏桶)等;(当Sentinel知道了要对什么资源目标进行限流以后,我们就需要针对这个目标配置一个限流规则,明确在什么条件下触发限流)

    private static void initFlowQpsRule() {
        List<FlowRule> rules = new ArrayList<>();
        FlowRule rule1 = new FlowRule(); // 创建一个流控规则
        rule1.setResource(resource); // 设置要限流的资源名称
        rule1.setcount(20); // 设置最大QPS为20
        rule1.setGrade(RuleConstant.FLOWGRADE QPS); // 设置限流的维度为 QPS
        rule1.setLimitApp("default"); // 设置限制的应用名称为"default"
        rules.add(rule1); // 将规则添加到规则列表中
        FlowRuleManager.loadRules(rules); // 加载规则列表,使限流规则生效
    }

首先创建一个流控的规则FlowRule,然后这是限流的资源名字、QPS、限流的维度(选择以什么方式进行统计),最后将这个规则加载到规则列表里面,这个时候就代表我们当前的这个规则里面的QPS最大为20,如果超出了20,就要被触发限流。

3.监控流量:Sentinel会监控每个资源的流量情况,包括请求的QPS(每秒请求数)、线程数、响应时间等。(当配置完限流规则后,就可以在Sentinel的Web控制页面来查看每个资源的流量请求,也就是说可以在Web端实时的查看我们标记的这些资源它的实际情况是什么样的)

4.限流的控制:当请求到达时,Sentinel会根据资源的限流规则判断是否需要进行限流控制,如果请求超过了限流阈值,则可以进行限制、拒绝或进行其他降级处理。 

这就是Sentinel实现限流的几个步骤。

二.限流算法

Sentinel 使用滑动窗口限流算法来实现限流。

滑动窗口限流算法是一种基于时间窗口的限流算法,它将一段时间划分为多个时间窗口,并在每个时间窗口内统计请求的数量,通过动态地调整时间窗口的大小和滑动步长(也就是可以动态调整限制大小和统计的时间区间),可以更精确地控制请求的通过速率。


http://www.kler.cn/a/410924.html

相关文章:

  • Pytorch微调深度学习模型
  • 道品智能科技移动式水肥一体机:农业灌溉施肥的革新之选
  • React(五)——useContecxt/Reducer/useCallback/useRef/React.memo/useMemo
  • 《硬件架构的艺术》笔记(五):低功耗设计
  • leetcode hot100【LeetCode 238.除自身以外数组的乘积】java实现
  • 蓝桥杯不知道叫什么题目
  • elasticsearch的索引管理
  • 深度学习基础01_深度学习概述参数初始化激活函数
  • mvn-mac操作小记
  • AIGC-----AIGC在虚拟现实中的应用前景
  • 七天掌握SQL--->第四天:事务处理与并发控制
  • shell编程3,参数传递+算术运算
  • 【论文复现】半监督学习与数据增强
  • 【Axure高保真原型】天气模板
  • Apache Maven Assembly 插件简介
  • Redis设计与实现第14章 -- 服务器 总结(命令执行器 serverCron函数 初始化)
  • Text、Data、BSS、Heap、Stack
  • PDF工具集套装 PDFgear v2.1.8 免费中文版
  • Vue 项目中 Axios 的封装方向探索
  • CBK8软件开发安全
  • 文件导入-使用java反射修改日期数据
  • 预告|ROS中超好用固定翼仿真开源平台即将上线!
  • CSS实现两组item中间边框不重复,且边框为渐变色
  • VXLAN详解
  • 【系统架构设计师】真题论文: 论软件架构建模技术与应用(包括解题思路和素材)
  • LLM | 论文精读 | CVPR | FairCLIP:追求视觉语言学习中的公平性