Sentinel如何使用BlockExceptionHandler实现限流/降级错误页面显示

1、修改配置项,打开对Spring MVC端点的保护

复制代码
spring.cloud.sentinel.filter.enabled=true

2、编写 BlockExceptionHandler的实现类

复制代码
MyUrlBlockHandler.java
java 复制代码
package com.codex.terry.sentinel.urlblockhandler;

/**
 * 文件名称: MyUrlBlockHandler.java
 * 编写人: yh.zeng
 * 编写时间: 2024/6/28 13:50
 * 文件描述: todo
 */

import com.alibaba.csp.sentinel.adapter.spring.webmvc.callback.BlockExceptionHandler;
import com.alibaba.csp.sentinel.slots.block.BlockException;
import com.alibaba.csp.sentinel.slots.block.authority.AuthorityException;
import com.alibaba.csp.sentinel.slots.block.degrade.DegradeException;
import com.alibaba.csp.sentinel.slots.block.flow.FlowException;
import com.alibaba.csp.sentinel.slots.block.flow.param.ParamFlowException;
import com.alibaba.csp.sentinel.slots.system.SystemBlockException;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@Component
@Slf4j
public class MyUrlBlockHandler implements BlockExceptionHandler
{
    @Override
    public void handle(HttpServletRequest request, HttpServletResponse response, BlockException e) throws Exception {

        ErrorMsg msg = null;
        if (e instanceof FlowException) {
            log.error("限流了");
            msg = ErrorMsg.builder()
                .status(100)
                .msg("限流了")
                .build();
        } else if (e instanceof DegradeException) {
            log.error("降级了 ");
            msg = ErrorMsg.builder()
                .status(101)
                .msg("降级了")
                .build();
        } else if (e instanceof ParamFlowException) {
            log.error("热点参数限流");
            msg = ErrorMsg.builder()
                .status(102)
                .msg("热点参数限流")
                .build();
        } else if (e instanceof SystemBlockException) {
            log.error("系统规则(负载/...不满足要求)");
            msg = ErrorMsg.builder()
                .status(103)
                .msg("系统规则(负载/...不满足要求)")
                .build();
        } else if (e instanceof AuthorityException) {
            log.error("授权规则不通过");
            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;
}
相关推荐
Deschen27 分钟前
设计模式-原型模式
java·设计模式·原型模式
麦麦鸡腿堡31 分钟前
Java的动态绑定机制(重要)
java·开发语言·算法
それども33 分钟前
SpringBootTest运行线程池被拒绝
java
介一安全1 小时前
【Frida Android】基础篇6:Java层Hook基础——创建类实例、方法重载、搜索运行时实例
android·java·网络安全·逆向·安全性测试·frida
xyy20251 小时前
Spring事务的传播方式
java·数据库·spring
@Kerry~1 小时前
phpstudy .htaccess 文件内容
java·开发语言·前端
roshy1 小时前
x86、arm、rsc-v指令集架构,指令集、OS、应用3者的关系
java·arm开发·架构
CRMEB系统商城1 小时前
CRMEB多商户系统(PHP)v3.3正式发布,同城配送上线[特殊字符]
java·开发语言·小程序·php
iナナ1 小时前
Java优选算法——位运算
java·数据结构·算法·leetcode
毕设源码-钟学长2 小时前
【开题答辩全过程】以 濒危动物保护管理系统为例,包含答辩的问题和答案
java·eclipse