• Spring Cloud - 通过 Gateway webflux 编程实现网关异常处理


    一、webflux 编程实现网关异常处理


    我们知道在某一个服务中出现异常,可以通过 @ControllerAdvice + @ExceptionHandler 来统一异常处理,即使是在微服务架构中,我们也可以将上述统一异常处理放入到公共的微服务中,这样哪一个微服务需要,直接引入模块即可。  但是如果我们的 网关微服务 出现了异常,该怎么处理呢?

    步骤如下:

    1. 在网关微服务中创建一个类,添加 @Configuration 注解将其作为配置类.
    2. 实现自定义 ErrorWebExceptionHandler 接口,重写 handle 方法.
    3. 在 handle 方法中实现统一异常处理.

    代码注释如下:

    1. @Slf4j
    2. @Configuration
    3. public class GlobalExceptionConfig implements ErrorWebExceptionHandler {
    4. @Autowired
    5. private ObjectMapper objectMapper;
    6. /**
    7. * 全局异常处理
    8. * @param exchange 交换器(request, response)
    9. * @param ex 出现异常时的异常对象
    10. * @return
    11. */
    12. @Override
    13. public Mono handle(ServerWebExchange exchange, Throwable ex) {
    14. Map result = new HashMap<>();
    15. //1.获取响应对象
    16. ServerHttpResponse response = exchange.getResponse();
    17. //2. response 是否结束(一般不用,可以用来处理多个异常的场景)
    18. if(response.isCommitted()) {
    19. return Mono.error(ex);
    20. }
    21. //3.设置响应头类型(JSON)
    22. response.getHeaders().setContentType(MediaType.APPLICATION_JSON);
    23. //4.设置响应状态码
    24. if (ex instanceof IllegalTokenException) {
    25. //是我们自定义的异常
    26. response.setStatusCode(HttpStatus.FORBIDDEN);
    27. } else {
    28. //不是我们自定义的异常,就通过 "服务器异常" 来处理
    29. response.setStatusCode(HttpStatus.INTERNAL_SERVER_ERROR);
    30. }
    31. //5.处理统一异常响应
    32. return response.writeWith(Mono.fromSupplier(() -> {
    33. DataBufferFactory bufferFactory = response.bufferFactory();
    34. result.put("msg", ex.getMessage());
    35. try {
    36. return bufferFactory.wrap(objectMapper.writeValueAsBytes(result));
    37. } catch (JsonProcessingException e) {
    38. throw new RuntimeException(e);
    39. }
    40. }));
    41. }
    42. }
    • IllegalTokenException:是我们自定义的异常,通常在上述代码的第四步中,就需要根据我们判断 ex 属于我们的哪种自定义异常,然后进行对应的状态码处理.
    • Mono.fromSupplier():是一个函数式接口,参数这里通过一 lamada 表达式实现(无参,返回值是一个 Mono)泛型. 这里要实现的逻辑就是把异常的响应进行封装.
    • bufferFactory.wrap:这里就是按照 webflux 编程的方式,参数是 json 格式(通过 ObjectMapper 转化),得到一个 Mono 对象.

    那么,如果在网关的中抛出了异常,如下:

  • 相关阅读:
    uniapp 连接夜神安卓模拟器真机调试
    服务器部署 CentOS、VeraCrypt、Docker、主从MySQL、Redis、备份等
    手机NFC录入门禁数据,实现手机开门
    JUnit5单元测试提示“Not tests were found”错误
    【LeetCode刷题笔记】双指针
    sqli-labs注入方法总结
    【Harmony OS】【JAVA UI】鸿蒙系统中怎么使用Parcel进行存储数据或数据传递
    ssh远程连接不了虚拟机ubuntu
    2.21 haas506 2.0开发教程 - TTS - Text To Speech (320开发板)
    AI for Security:智能化安全对抗的困境
  • 原文地址:https://blog.csdn.net/CYK_byte/article/details/134267726