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