安装运行Sentinel的jar包
导入依赖
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
yaml配置
启动项目,访问任意接口即可
通过页面配置流控
@RequestMapping("get")
@SentinelResource(value = "get", blockHandler = "getBlockHandler")
public String get() {
return "hello sentinel";
}
public String getBlockHandler(BlockException e) {
e.printStackTrace();
return "流控";
}
根据QPS配置流控
根据线程数流控
添加一个睡眠时间,方便测试
配置规则
统一异常处理
@Data
public class Result<T> {
private Integer code;
private String msg;
private T data;
public Result(Integer code, String msg) {
this.code = code;
this.msg = msg;
}
public static Result error(Integer code, String msg) {
return new Result(code, msg);
}
}
@Slf4j
@Component
public class MyBlockExceptionHandler implements BlockExceptionHandler {
@Override
public void handle(
HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, BlockException e
) throws Exception {
log.info("BlockExceptionHandler BlockException========{}", e.getRule());
Result r = null;
if (e instanceof FlowException) {
r = Result.error(100, "接口限流了");
} else if (e instanceof DegradeException) {
r = Result.error(101, "服务降级了");
} else if (e instanceof ParamFlowException) {
r = Result.error(102, "热点参数限流了");
} else if (e instanceof SystemBlockException) {
r = Result.error(103, "触发系统保护规则了");
} else if (e instanceof AuthorityException) {
r = Result.error(104, "授权规则不通过");
}
// 返回Json数据
httpServletResponse.setStatus(500);
httpServletResponse.setCharacterEncoding("utf-8");
httpServletResponse.setContentType(MediaType.APPLICATION_JSON_VALUE);
new ObjectMapper().writeValue(httpServletResponse.getWriter(), r);
}
}
注释掉注解,测试是否配置成功
重启后配置流控规则,然后测试