博客
关于我
SpringCloud Alibaba微服务实战二十四 - SpringCloud Gateway的全局异常处理
阅读量:629 次
发布时间:2019-03-14

本文共 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();    }}

    测试结果

    通过以上配置,可以实现网关层面的异常拦截,并返回符合预期的数据格式。测试结果如下:

    • JWT解析异常:返回状态码500,消息为"无法解析访问令牌"。
    • 服务下线异常:返回状态码503,消息为"服务不可用"。

    这种方式可以有效处理网关层面无法被传统异常处理机制捕获的异常,确保返回格式一致性和可读性。

    希望以上内容对您有所帮助,欢迎在评论区留言交流!

    转载地址:http://tucoz.baihongyu.com/

    你可能感兴趣的文章
    OAuth2.0_JWT令牌介绍_Spring Security OAuth2.0认证授权---springcloud工作笔记147
    查看>>
    OAuth2.0_介绍_Spring Security OAuth2.0认证授权---springcloud工作笔记137
    查看>>
    OAuth2.0_完善环境配置_把资源微服务客户端信息_授权码存入到数据库_Spring Security OAuth2.0认证授权---springcloud工作笔记149
    查看>>
    OAuth2.0_授权服务配置_Spring Security OAuth2.0认证授权---springcloud工作笔记140
    查看>>
    OAuth2.0_授权服务配置_令牌服务和令牌端点配置_Spring Security OAuth2.0认证授权---springcloud工作笔记143
    查看>>
    OAuth2.0_授权服务配置_客户端详情配置_Spring Security OAuth2.0认证授权---springcloud工作笔记142
    查看>>
    OAuth2.0_授权服务配置_密码模式及其他模式_Spring Security OAuth2.0认证授权---springcloud工作笔记145
    查看>>
    OAuth2.0_授权服务配置_资源服务测试_Spring Security OAuth2.0认证授权---springcloud工作笔记146
    查看>>
    OAuth2.0_环境介绍_授权服务和资源服务_Spring Security OAuth2.0认证授权---springcloud工作笔记138
    查看>>
    OAuth2.0_环境搭建_Spring Security OAuth2.0认证授权---springcloud工作笔记139
    查看>>
    oauth2.0协议介绍,核心概念和角色,工作流程,概念和用途
    查看>>
    OAuth2授权码模式详细流程(一)——站在OAuth2设计者的角度来理解code
    查看>>
    oauth2登录认证之SpringSecurity源码分析
    查看>>
    OAuth2:项目演示-模拟微信授权登录京东
    查看>>
    OA系统多少钱?OA办公系统中的价格选型
    查看>>
    OA系统选型:选择好的工作流引擎
    查看>>
    OA让企业业务流程管理科学有“据”
    查看>>
    OA项目之会议通知(查询&是否参会&反馈详情)
    查看>>
    OA项目之我的会议(会议排座&送审)
    查看>>
    OA项目之我的会议(查询)
    查看>>