sentinel小记

news/2025/2/24 8:12:39

sentinel_0">sentinel小记

1、被处理的接口

  • java">/**
         * 分页获取题目列表(封装类)
         *
         * @param questionQueryRequest
         * @param request
         * @return
         */
        @PostMapping("/list/page/vo")
        public BaseResponse<Page<QuestionVO>> listQuestionVOByPage(@RequestBody QuestionQueryRequest questionQueryRequest,
                                                                   HttpServletRequest request) {
            long current = questionQueryRequest.getCurrent();
            long size = questionQueryRequest.getPageSize();
            // 限制爬虫,限制每页最多 20 条数据
            ThrowUtils.throwIf(size > 20, ErrorCode.PARAMS_ERROR);
    
            //对ip进行限流
            String ip = request.getRemoteAddr();
            Entry entry = null;
            try {
                entry = SphU.entry("listQuestionVOByPage", EntryType.IN, 1, ip);
                //被保护的用户
                // 查询数据库
                Page<Question> questionPage = questionService.page(new Page<>(current, size), questionService.getQueryWrapper(questionQueryRequest));
                // 获取封装类
                return ResultUtils.success(questionService.getQuestionVOPage(questionPage, request));
            } catch (Throwable ex) {
                // 处理业务异常
                if (!BlockException.isBlockException(ex)){
                    Tracer.trace(ex);
                    return ResultUtils.error(ErrorCode.SYSTEM_ERROR, "系统错误");
                }
                if (ex instanceof DegradeException) {
                    // 降级操作
                    return handleFallback(questionQueryRequest, request, ex);
                }
                // 限流操作
                return ResultUtils.error(ErrorCode.SYSTEM_ERROR, "访问过于频繁,情稍后再试");
            } finally {
                if (entry != null) {
                    entry.exit(1, ip);
                }
            }
    
        }
    
        /**
         * listQuestionBankVOByPage 降级操作:直接返回本地数据
         * 处理的是业务本身的异常
         */
        public BaseResponse<Page<QuestionVO>> handleFallback(@RequestBody QuestionQueryRequest questionQueryRequest,
                                                                 HttpServletRequest request, Throwable ex) {
            // 可以返回本地数据或空数据
            return ResultUtils.success(null);
        }
    

2、熔断和限流规则例子

  • java">/**
     * @author zzj
     * 限流规则管理器
     */
    
    @Component
    public class SentinelRulesManager {
    
        @PostConstruct
        public void initRules() {
            initFlowRules();
            initDegradeRules();
        }
    
        // 限流规则
        public void initFlowRules() {
            // 单 IP 查看题目列表限流规则
            ParamFlowRule rule = new ParamFlowRule("listQuestionVOByPage")
                    .setParamIdx(0) // 对第 0 个参数限流,即 IP 地址
                    .setCount(60) // 每分钟最多 60 次
                    .setDurationInSec(60); // 规则的统计周期为 60 秒
            ParamFlowRuleManager.loadRules(Collections.singletonList(rule));
        }
    
        // 降级规则
        public void initDegradeRules() {
            // 单 IP 查看题目列表熔断规则
            DegradeRule slowCallRule = new DegradeRule("listQuestionVOByPage")
                    .setGrade(CircuitBreakerStrategy.SLOW_REQUEST_RATIO.getType())
                    .setCount(0.2) // 慢调用比例大于 20%
                    .setTimeWindow(60) // 熔断持续时间 60 秒
                    .setStatIntervalMs(30 * 1000) // 统计时长 30 秒
                    .setMinRequestAmount(10) // 最小请求数
                    .setSlowRatioThreshold(3); // 响应时间超过 3 秒
    
            DegradeRule errorRateRule = new DegradeRule("listQuestionVOByPage")
                    .setGrade(CircuitBreakerStrategy.ERROR_RATIO.getType())
                    .setCount(0.1) // 异常率大于 10%
                    .setTimeWindow(60) // 熔断持续时间 60 秒
                    .setStatIntervalMs(30 * 1000) // 统计时长 30 秒
                    .setMinRequestAmount(10); // 最小请求数
    
            // 加载规则
            DegradeRuleManager.loadRules(Arrays.asList(slowCallRule, errorRateRule));
        }
    }
    
    

3、正常请求—>限流

  • 当请求到61次时,进行限流

  • image-20250223155016502

  • image-20250223155022248

4、触发熔断

  • 请求一个不存在的值,触发异常熔断

    • image-20250223155502968
  • 随后进入熔断降级操作,返回空对象

    • image-20250223155652645
    • 正常请求也返回空对象
      • image-20250223160717714
  • 但是我在熔断期间请求数频繁时又会触发限流,并且返回限流规则,无法返回降级规则

    • image-20250223155818532
    • 这里可知,限流的优先级是要高于熔断的,并且两个规则是独立的。


http://www.niftyadmin.cn/n/5864104.html

相关文章

Docker启动ES容器打包本地镜像

文章目录 1、安装 Docker2、下载镜像3、查看已下载的镜像4、 保存和加载镜像5、.tar 文件与 Docker 镜像的关系6、如何从 .tar 文件加载 Docker 镜像7、为什么需要 .tar 文件&#xff1f;8、ES 8.x版本无法启动8.1 问题原因8.2 解决方案8.3 提交容器为新镜像 1、安装 Docker 如…

Vue2 和 Vue3 的响应式原理对比

Object.defineProperty 与 Proxy 对比 前言一、Vue2 的响应式原理二、Vue3 的响应式原理三、性能优化总结 前言 响应式系统是 Vue 框架的核心机制之一&#xff0c;通俗易懂的来说 vue2需要手动登记&#xff0c;只有被用到的才会被记录&#xff0c;vue3全自动监控。 一、Vue2 …

一周学会Flask3 Python Web开发-Jinja2模板基本使用

锋哥原创的Flask3 Python Web开发 Flask3视频教程&#xff1a; 2025版 Flask3 Python web开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili 我们平台开发web系统&#xff0c;必须用到网页&#xff0c;单纯的静态网页无法满足我们的需求。我们可以使用模版引擎技术&am…

智能优化算法:莲花算法(Lotus flower algorithm,LFA)介绍,提供MATLAB代码

一、 莲花算法 1.1 算法原理 莲花算法&#xff08;Lotus flower algorithm&#xff0c;LFA&#xff09;是一种受自然启发的优化算法&#xff0c;其灵感来源于莲花的自清洁特性和授粉过程。莲花的自清洁特性&#xff0c;即所谓的“莲花效应”&#xff0c;是由其叶片表面的微纳…

《GNU/Linux Shell命令全解析》

前言: Shell&#xff08;如Bash、Zsh&#xff09;是一个用户应用程序&#xff0c;通过系统调用接口与内核空间进行交互,运行在所示位置在用户空间中。 GNU/Linux内核架构简易图: 1.基础命令行操作 1.1 Shell功能定义 命令行解释器&#xff1a;Shell解释用户输入的命令&#x…

【环境配置】maven,mysql,node.js,vue的快速配置与上手

【环境配置】maven,mysql,node.js,vue的快速配置与上手 我们在利用springbootvue来进行全栈项目开发时&#xff0c;需要做很多的准备工作&#xff0c;其中maven,mysql,node,js和vue的配置是必不可少的。 本期我们尽可能精简地介绍它们的配置以及快速上手。 1.maven 1.1.下载…

推荐一款AI大模型托管平台-OpenWebUI

推荐一款AI大模型托管平台-OpenWebUI 1. OpenWebUI 1. OpenWebUI什么? 官网地址&#xff1a;https://openwebui.com/ GitHub地址&#xff1a; https://github.com/open-webui/open-webui Open WebUI 是一个可扩展、功能丰富且用户友好的自托管 AI 平台&#xff0c;旨在完全离…

PnP——根据3D与2d图片估计相机运动

引入 当知道n个3D空间点及其投影位置和2d像素点时&#xff0c;如何估计相机的位姿。PnP(Perspective-n-Point) 是求解3D到2D点对运动的方法。 直接线性变换&#xff08;DLT&#xff09; 问题描述 已知一组3D点 P i ( X i , Y i , Z i , 1 ) ⊤ \mathbf{P}_i (X_i, Y_i, …