本文主要是介绍使用Sentinel自定义返回和实现区分来源方式,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
《使用Sentinel自定义返回和实现区分来源方式》:本文主要介绍使用Sentinel自定义返回和实现区分来源方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教...
Sentinel自定义返回和实现区分来源
1. 自定义错误返回
因为流控和降级页面报的异常都是相同的,所以可以优化一下。
使用官方的接口blockExceptionHandler(2.2.7.RELEASE)、UrlBlockHandler(0.9.0.RELEASE)
定义处理类:
@Component
public class MyUrlBlockHandler implements BlockExceptionHandler {
@Ov编程erride
public void handle(HttpServletRequest httpServletRequest, HttpServletResponse response, BlockException ex) throws Exception {
ErrorMsg msg = null;
if (ex instanceof FlowException) {
msg = ErrorMsg.builder()
.status(100)
.msg("限流了")
.bphpuild();
} 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("apwww.chinasem.cnplication/json;charset=utf-8");
// spring mvc自带的json操作工具,叫jackson
new ObjectMapper()
.writeValue(
responsephp.getWriter(),
msg
);
}
}
@Data
@Builder
@AllArgsConst编程ructor
@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中
总结
这篇关于使用Sentinel自定义返回和实现区分来源方式的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!