Sentinel实现热点词限流 | 带你读《Spring Cloud Alibaba(2019)》之十七

简介: 本节介绍fallback与blockHandler的区别,手动形式创建限流,控制台自定义形式

上一篇:sentinel怎样实现熔断降级? | 带你读《Spring Cloud Alibaba(2019)》之十六
下一篇:什么是分布式事务? | 带你读《Spring Cloud Alibaba(2019)》之十八

本文来自于《精通Spring Cloud Alibaba》课程的整理,讲师为余胜军,点击查看视频内容
本文系志愿者整理,供配合学习中心课程使用,不做商业用途。

Sentinel实现热点词限流

热点参数限流
https://github.com/alibaba/Sentinel/wiki/%E7%83%AD%E7%82%B9%E5%8F%82%E6%95%B0%E9%99%90%E6%B5%81

可以根据访问频繁的参数实现限流。

热点参数限流:对接口热词实现限流

fallback与blockHandler的区别

fallback是服务熔断或者业务逻辑出现异常执行的方法(1.6版本以上)
blockHandler 限流出现错误执行的方法。

手动形式创建限流

@RestController
@Slf4j
public class SeckillServiceImpl {

    public SeckillServiceImpl() {
        initSeckillRule();
    }

    /**
     * 秒杀路由资源
     */
    private static final String SEKILL_RULE = "seckill";

    /**
     * 秒杀抢购
     *
     * @return
     */
    @RequestMapping("/seckill")
    public String seckill(Long userId, Long orderId) {
        try {
            Entry entry = SphU.entry(SEKILL_RULE, EntryType.IN, 1, userId);
            return "秒杀成功";
        } catch (Exception e) {
            return "当前用户访问过度频繁,请稍后重试!";
        }
    }
    // seckill?userId=123456&orderId=644064779
    // seckill?userId=123456&orderId=644064779

    private void initSeckillRule() {
        ParamFlowRule rule = new ParamFlowRule(SEKILL_RULE)
                // 对我们秒杀接口第0个参数实现限流
                .setParamIdx(0)
                .setGrade(RuleConstant.FLOW_GRADE_QPS)
                // 每秒QPS最多只有1s
                .setCount(1);
        ParamFlowRuleManager.loadRules(Collections.singletonList(rule));
        log.info(">>>秒杀接口限流策略配置成功<<<");
    }
}

执行结果:
1.png

此时如果频繁访问:
2.png

此时利用这种方式限流是不灵活的。

控制台自定义形式

一、搭建环境:
3.png

4.png

二、编辑代码

@RequestMapping("/seckill")
@SentinelResource(value = SEKILL_RULE, fallback = "seckillFallback", blockHandler = "seckillBlockHandler")
public String seckill(Long userId, Long orderId) {
    return "秒杀成功";
}

执行结果:
5.png

新增动态规则:
5.png

参数索引表示我们方法传递的第一个参数;注意:该配置在重启之后不会保存。

但此时出现异常会直接显示页面崩溃,用户体验不好,我们可以使用全局捕获异常捕获修改限流出现错误:

@RestControllerAdvice
public class InterfaceExceptionHandler {
    @ResponseBody
    @ExceptionHandler(ParamFlowException.class)
    public String businessInterfaceException(ParamFlowException e) {
        return "您当前访问的频率过高,请稍后重试!";
    }
}

出现异常的执行结果:
6.png

VIP通道设置:调整访问频率即可:
7.png

此时其他窗口还是每秒钟可以访问一次,次数过多会提示“访问频率过高”,但是888窗口是“VIP”,它可以每秒钟访问10次!
8.png

相关文章
|
5月前
|
人工智能 Java Nacos
基于 Spring AI Alibaba + Nacos 的分布式 Multi-Agent 构建指南
本文将针对 Spring AI Alibaba + Nacos 的分布式多智能体构建方案展开介绍,同时结合 Demo 说明快速开发方法与实际效果。
4301 85
|
5月前
|
人工智能 运维 Java
Spring AI Alibaba Admin 开源!以数据为中心的 Agent 开发平台
Spring AI Alibaba Admin 正式发布!一站式实现 Prompt 管理、动态热更新、评测集构建、自动化评估与全链路可观测,助力企业高效构建可信赖的 AI Agent 应用。开源共建,现已上线!
6569 90
|
6月前
|
人工智能 Java 机器人
基于Spring AI Alibaba + Spring Boot + Ollama搭建本地AI对话机器人API
Spring AI Alibaba集成Ollama,基于Java构建本地大模型应用,支持流式对话、knife4j接口可视化,实现高隐私、免API密钥的离线AI服务。
5513 2
基于Spring AI Alibaba + Spring Boot + Ollama搭建本地AI对话机器人API
|
5月前
|
人工智能 监控 Java
Spring AI Alibaba实践|后台定时Agent
基于Spring AI Alibaba框架,可构建自主运行的AI Agent,突破传统Chat模式限制,支持定时任务、事件响应与人工协同,实现数据采集、分析到决策的自动化闭环,提升企业智能化效率。
Spring AI Alibaba实践|后台定时Agent
|
7月前
|
人工智能 Java 开发者
邀您参与 “直通乌镇” Spring AI Alibaba 开源竞技挑战赛!
邀您参与 “直通乌镇” Spring AI Alibaba 开源竞技挑战赛!

热门文章

最新文章