本文实现sentinel对错误页面的优化
一、为什么要扩展?
在项目的实际开发中,我们在对接口限流和降级等等设定规则之后,一旦达到阈值之后页面就会给一段话,对于使用人员来说是很不友好的,所以我们需要来定义一个统一的返回
二、实现
2.1 创建一个统一返回的类
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
class ErrorMsg {
private Integer status;
private String msg;
}
2.2 创建类实现UrlBlockHandler
@Component
public class MyUrlBlockHandler implements UrlBlockHandler {
@Override
public void blocked(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, BlockException ex) throws IOException {
ErrorMsg errorMsg = null;
if (ex instanceof FlowException) {
// 流控异常
errorMsg = ErrorMsg.builder()
.status(100)
.msg("限流异常")
.build();
}else if (ex instanceof DegradeException) {
// 降级异常
errorMsg = ErrorMsg.builder()
.status(101)
.msg("降级异常")
.build();
}else if (ex instanceof ParamFlowException) {
// 热点异常
errorMsg = ErrorMsg.builder()
.status(102)
.msg("热点异常")
.build();
}else if (ex instanceof SystemBlockException) {
// 系统异常
errorMsg = ErrorMsg.builder()
.status(103)
.msg("系统异常")
.build();
}else if (ex instanceof AuthorityException) {
// 授权异常
errorMsg = ErrorMsg.builder()
.status(104)
.msg("授权异常")
.build();
}
httpServletResponse.setStatus(500);
httpServletResponse.setCharacterEncoding("utf-8");
httpServletResponse.setHeader("Content-Type","application/json;charset=utf-8");
httpServletResponse.setContentType("application/json;charset=utf-8");
new ObjectMapper()
.writeValue(
httpServletResponse.getWriter(),
errorMsg
);
}
}
三、验证
3.1启动项目
3.2 添加规则
3.3 刷新请求验证