流控组件Sentinel核心注解@SentinelResource中的参数fallback和blockHandler的使用方式
Posted IT挖掘机y
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了流控组件Sentinel核心注解@SentinelResource中的参数fallback和blockHandler的使用方式相关的知识,希望对你有一定的参考价值。
fallback顾名思义当Java程序运行发生错误时,由该参数定义的方法进行处理
@GetMapping(value = "/consumer/{id}")
@SentinelResource(value = "consumer", fallback = "handlerFallback")
public ResponseEntity<String> consumerData(@PathVariable("id")Integer id) {
ResponseEntity<String> entity = remoteService.getData(id);
if (id <= 0) {
throw new IllegalArgumentException("非法参数异常!");
} else if (entity.getData() == null) {
throw new NullPointerException("无响应数据,空指针异常!");
}
return entity;
}
public ResponseEntity<String> handlerFallback(Integer id, Throwable e) {
return new ResponseEntity<>(443, "程序处理异常,开始执行fallback数据-->" +e.getMessage());
}
blockHandler这个也很好明白,也就是当API违背控制台设置的阈值时,执行该参数定义的方法进行处理;说白了就是限流之后的处理
@GetMapping(value = "/consumer/{id}")
@SentinelResource(value = "consumer",blockHandler = "blockHandler")
public ResponseEntity<String> consumerData(@PathVariable("id")Integer id) {
ResponseEntity<String> entity = remoteService.getData(id);
if (id <= 0) {
throw new IllegalArgumentException("非法参数异常!");
} else if (entity.getData() == null) {
throw new NullPointerException("无响应数据,空指针异常!");
}
return entity;
}
public ResponseEntity<String> blockHandler(BlockException blockException) {
return new ResponseEntity<>(444, "QPS过高,服务开始熔断降级--->"+blockException.getMessage());
}
那么问题来了,如果同时发生Java运行错误和限流,那么会走哪个默认的方法呢?
@GetMapping(value = "/consumer/{id}")
@SentinelResource(value = "consumer", fallback = "handlerFallback", blockHandler = "blockHandler")
public ResponseEntity<String> consumerData(@PathVariable("id")Integer id) {
ResponseEntity<String> entity = remoteService.getData(id);
if (id <= 0) {
throw new IllegalArgumentException("非法参数异常!");
} else if (entity.getData() == null) {
throw new NullPointerException("无响应数据,空指针异常!");
}
return entity;
}
public ResponseEntity<String> handlerFallback(Integer id, Throwable e) {
return new ResponseEntity<>(443, "程序处理异常,开始执行fallback数据-->" +e.getMessage());
}
public ResponseEntity<String> blockHandler(Integer id, BlockException blockException) {
return new ResponseEntity<>(444, "QPS过高,服务开始熔断降级--->"+blockException.getMessage());
}
设置限流规则
当我持续刷新,它走的是blockHandler路线
记得在配置文件加入以下
feign:
sentinel:
enabled: true
以上是关于流控组件Sentinel核心注解@SentinelResource中的参数fallback和blockHandler的使用方式的主要内容,如果未能解决你的问题,请参考以下文章
预告第 89 期 Sentinel 面向云原生微服务的高可用流控防护组件