使用Sentinel自定义返回和实现区分来源方式

 更新时间:2025年04月02日 16:43:50   作者:Gangbb  
这篇文章主要介绍了使用Sentinel自定义返回和实现区分来源方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

Sentinel自定义返回和实现区分来源

1. 自定义错误返回

因为流控和降级页面报的异常都是相同的,所以可以优化一下。

使用官方的接口BlockExceptionHandler(2.2.7.RELEASE)、UrlBlockHandler(0.9.0.RELEASE)

定义处理类:

@Component
public class MyUrlBlockHandler implements BlockExceptionHandler {

    @Override
    public void handle(HttpServletRequest httpServletRequest, HttpServletResponse response, BlockException ex) throws Exception {
        ErrorMsg msg = null;
        if (ex instanceof FlowException) {
            msg = ErrorMsg.builder()
                    .status(100)
                    .msg("限流了")
                    .build();
        } else if (ex instanceof DegradeException) {
            msg = ErrorMsg.builder()
                    .status(101)
                    .msg("降级了")
                    .build();
        } else if (ex instanceof ParamFlowException) {
            msg = ErrorMsg.builder()
                    .status(102)
                    .msg("热点参数限流")
                    .build();
        } else if (ex instanceof SystemBlockException) {
            msg = ErrorMsg.builder()
                    .status(103)
                    .msg("系统规则(负载/...不满足要求)")
                    .build();
        } else if (ex instanceof AuthorityException) {
            msg = ErrorMsg.builder()
                    .status(104)
                    .msg("授权规则不通过")
                    .build();
        }
        // http状态码
        response.setStatus(500);
        response.setCharacterEncoding("utf-8");
        response.setHeader("Content-Type", "application/json;charset=utf-8");
        response.setContentType("application/json;charset=utf-8");
        // spring mvc自带的json操作工具,叫jackson
        new ObjectMapper()
                .writeValue(
                        response.getWriter(),
                        msg
                );
    }
}

@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
class ErrorMsg {
    private Integer status;
    private String msg;
}

效果:

2. 实现区分来源

使用RequestOriginParser接口

@Component
public class MyRequestOriginParser implements RequestOriginParser {
    @Override
    public String parseOrigin(HttpServletRequest request) {
        // 从请求参数中获取名为 origin 的参数并返回
        // 如果获取不到origin参数,那么就抛异常

        String origin = request.getParameter("origin");
        if (StringUtils.isBlank(origin)) {
            throw new IllegalArgumentException("origin must be specified");
        }
        return origin;
    }
}

访问:http://127.0.0.1:8010/shares/1

控制台:

加上参数就可以了:

新加授权规则

再访问就不行了:

新增流控规则

换个名字就不会被限流

真实项目中一般把需要的参数放在请求header

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • httpclient的disableConnectionState方法工作流程

    httpclient的disableConnectionState方法工作流程

    这篇文章主要为大家介绍了httpclient的disableConnectionState方法工作流程源码解读,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-11-11
  • MyBatis-Plus更新对象时将字段值更新为null的四种常见方法

    MyBatis-Plus更新对象时将字段值更新为null的四种常见方法

    MyBatis-Plus 是一个 MyBatis 的增强工具,在简化开发、提高效率方面表现非常出色,而,在使用 MyBatis-Plus 更新对象时,默认情况下是不会将字段值更新为 null 的,如果你需要将某些字段的值更新为 null,有几种方法可以实现,本文将介绍几种常见的方法
    2024-11-11
  • 推荐几款非常实用的IDEA插件小结

    推荐几款非常实用的IDEA插件小结

    这篇文章主要介绍了推荐几款非常实用的IDEA插件小结,解决你开发中可望而又不好找的插件,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-01-01
  • Springboot mybatisplus如何解决分页组件IPage失效问题

    Springboot mybatisplus如何解决分页组件IPage失效问题

    这篇文章主要介绍了Springboot mybatisplus如何解决分页组件IPage失效问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-08-08
  • 详解大数据处理引擎Flink内存管理

    详解大数据处理引擎Flink内存管理

    Flink是jvm之上的大数据处理引擎,jvm存在java对象存储密度低、full gc时消耗性能,gc存在stw的问题,同时omm时会影响稳定性。针对频繁序列化和反序列化问题flink使用堆内堆外内存可以直接在一些场景下操作二进制数据,减少序列化反序列化消耗。本文带你详细理解其原理。
    2021-05-05
  • java线程池ThreadPoolExecutor实现原理详解

    java线程池ThreadPoolExecutor实现原理详解

    这篇文章主要介绍了java线程池ThreadPoolExecutor实现原理详解,ThreadPoolExecutor是线程池实现类,会动态创建多个线程,并发执行提交的多个任务,需要的朋友可以参考下
    2023-12-12
  • JDK1.8下载、安装和环境配置超详细教程(最新最完整)

    JDK1.8下载、安装和环境配置超详细教程(最新最完整)

    jdk1.8是一款功能强大的Java语音软件开发工具包,JDK是学好Java的第一步,本文重点给大家介绍JDK1.8下载、安装和环境配置教程,需要的朋友可以参考下
    2022-11-11
  • Java实现数组反转翻转的方法实例

    Java实现数组反转翻转的方法实例

    本篇文章主要介绍了Java实现数组反转翻转的方法实例,详细的介绍了3种实现方法,有兴趣的可以了解一下。
    2017-04-04
  • 如何基于SpringWeb MultipartFile实现文件上传、下载功能

    如何基于SpringWeb MultipartFile实现文件上传、下载功能

    在做项目时,后端经常采用上传文件组件MultipartFile,下面这篇文章主要给大家介绍了关于如何基于SpringWeb MultipartFile实现文件上传、下载功能的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2024-07-07
  • java Timer测试定时调用及固定时间执行代码示例

    java Timer测试定时调用及固定时间执行代码示例

    这篇文章主要介绍了java Timer测试定时调用及固定时间执行代码示例,分享了相关代码示例,小编觉得还是挺不错的,具有一定借鉴价值,需要的朋友可以参考下
    2018-02-02

最新评论