本文共 2525 字,大约阅读时间需要 8 分钟。
在微服务架构中,传统的全局异常处理方式可能无法满足所有场景,特别是在网关层面遇到的异常。以下将详细讲解如何实现全局异常处理,并解决网关层面异常的处理问题。
在单体Spring Boot项目中,全局异常处理可以通过配置@RestControllerAdvice和@ExceptionHandler来实现统一处理。这种方式适用于项目内部的异常捕捉和处理,但在微服务架构中,尤其是在网关层面遇到的异常无法被捕获,因此需要额外处理。
以下是一个典型的全局异常处理示例:
@Slf4j@RestControllerAdvicepublic class RestExceptionHandler { @ExceptionHandler(Exception.class) @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR) public ResultData exception(Exception e) { log.error("全局异常信息 ex={}", e.getMessage(), e); return ResultData.fail(ReturnCode.RC500.getCode(), e.getMessage()); }} 在微服务架构中,网关作为入口点,常常会遇到无法被传统异常处理机制捕获的异常,例如JWT解析失败或服务下线等。为了解决这些问题,我们需要自定义异常处理逻辑。
我们可以定义一个全局异常处理器,继承自DefaultErrorWebExceptionHandler,并重写handler()方法,返回自定义的响应格式。
@Slf4j@Order(-1)@Configuration@RequiredArgsConstructorpublic class GlobalErrorWebExceptionHandler implements ErrorWebExceptionHandler { private final ObjectMapper objectMapper; @Override public Mono handle(ServerWebExchange exchange, Throwable ex) { ServerHttpResponse response = exchange.getResponse(); if (response.isCommitted()) { return Mono.error(ex); } response.getHeaders().setContentType(MediaType.APPLICATION_JSON); if (ex instanceof ResponseStatusException) { response.setStatusCode(((ResponseStatusException) ex).getStatus()); } return response.writeWith(Mono.fromSupplier(() -> { try { return objectMapper.writeValueAsBytes(ResultData.fail(500, ex.getMessage())); } catch (JsonProcessingException e) { log.error("Error writing response", ex); return new byte[0]; } })); }} DefaultErrorWebExceptionHandler的类,重写handler()方法,返回自定义的响应格式。@Data@ApiModel(value = "统一返回结果封装", description = "接口返回统一结果")public class ResultData { @ApiModelProperty(value = "状态码") private int status; @ApiModelProperty(value = "响应信息") private String message; @ApiModelProperty(value = "后端返回结果") private T data; @ApiModelProperty(value = "后端响应状态") private boolean success; @ApiModelProperty(value = "响应时间戳") private long timestamp; public ResultData() { this.timestamp = System.currentTimeMillis(); }} 通过以上配置,可以实现网关层面的异常拦截,并返回符合预期的数据格式。测试结果如下:
这种方式可以有效处理网关层面无法被传统异常处理机制捕获的异常,确保返回格式一致性和可读性。
希望以上内容对您有所帮助,欢迎在评论区留言交流!
转载地址:http://tucoz.baihongyu.com/