Sentinel默认返回 Blocked by Sentinel (flow limiting)
,状态码419
如果github下载不下来可以到我上传的资源上下载
-
源码中
Sentinel-master\sentinel-adapter\sentinel-spring-webmvc-adapter\src\main\java\com\alibaba\csp\sentinel\adapter\spring\webmvc\callback\DefaultBlockExceptionHandler.java
这个类是默认处理异常阻塞的,如何知道的,嘿嘿,直接源码中全局搜索返回关键字
可以看到实现方法中三个参数 HttpServletRequest request, HttpServletResponse response, BlockException e -
进入BlockException 类 可以看到注释大致意思:抽象异常,表示由于流量控制、断路或触发系统保护而被Sentinel阻止。
-
查看层级结构 idea快捷键 control + h 或者右键类进入
-
可以看到4个继承类,对应关系如下
-
从源码中查看只要实现BlockExceptionHandler类可以自定义异常处理,只需要判断handle方法中BlockException 参数是否分别是FlowException、DegradeException、SystemBlockException等等的示例即可,代码如下仅供参考
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.extern.slf4j.Slf4j;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Component;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* 自定义熔断异常类
*/
@Slf4j // log日志
@Component // 注入到spring容器中
public class MyBlockExceptionHandler implements BlockExceptionHandler {
@Override
public void handle(HttpServletRequest request, HttpServletResponse response, BlockException e) throws Exception {
log.info("UrlBlockHandler.....................................");
// 自定义封装的类,可以定义
Result restObject = null;
if (e instanceof FlowException) {
// 限流
restObject = ResultUtils.wrapFail(5001,"接口限流");
} else if (e instanceof DegradeException) {
// 降级
restObject = ResultUtils.wrapFail(5002,"服务降级");
} else if (e instanceof ParamFlowException) {
// 热点参数
restObject = ResultUtils.wrapFail(5003,"热点参数限流");
} else if (e instanceof SystemBlockException) {
// 系统保护
restObject = ResultUtils.wrapFail(5004,"触发系统保护规则");
} else if (e instanceof AuthorityException) {
// 授权规则
restObject = ResultUtils.wrapFail(5005,"授权规则不通过");
}
//返回json数据
response.setStatus(200);
response.setCharacterEncoding("utf-8");
response.setContentType(MediaType.APPLICATION_JSON_VALUE);
//springmvc 的一个json转换类 (jackson)
new ObjectMapper().writeValue(response.getWriter(), restObject);
//重定向
//response.sendRedirect("http://www.baidu.com");
}
}
!!!!SpringCloudAlibaba项目集成代码示例!!!