Spring Cloud 通过 Gateway webflux实现网关异常处理

 更新时间:2023年11月07日 16:54:04   作者:陈亦康  
在某一个服务中出现异常,通过@ControllerAdvice + @ExceptionHandler 统一异常处理,即使在微服务架构中,也可以将上述统一异常处理放入到公共的微服务中,这样哪一个微服务需要,直接引入模块,本文重点介绍Spring Cloud 通过 Gateway webflux实现网关异常处理,一起看看吧

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

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

步骤如下:

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

代码注释如下:

@Slf4j
@Configuration
public class GlobalExceptionConfig implements ErrorWebExceptionHandler {
    @Autowired
    private ObjectMapper objectMapper;
    /**
     * 全局异常处理
     * @param exchange 交换器(request, response)
     * @param ex 出现异常时的异常对象
     * @return
     */
    @Override
    public Mono<Void> handle(ServerWebExchange exchange, Throwable ex) {
        Map<String, String> result = new HashMap<>();
        //1.获取响应对象
        ServerHttpResponse response = exchange.getResponse();
        //2. response 是否结束(一般不用,可以用来处理多个异常的场景)
        if(response.isCommitted()) {
            return Mono.error(ex);
        }
        //3.设置响应头类型(JSON)
        response.getHeaders().setContentType(MediaType.APPLICATION_JSON);
        //4.设置响应状态码
        if (ex instanceof IllegalTokenException) {
            //是我们自定义的异常
            response.setStatusCode(HttpStatus.FORBIDDEN);
        } else {
            //不是我们自定义的异常,就通过 "服务器异常" 来处理
            response.setStatusCode(HttpStatus.INTERNAL_SERVER_ERROR);
        }
        //5.处理统一异常响应
        return response.writeWith(Mono.fromSupplier(() -> {
            DataBufferFactory bufferFactory = response.bufferFactory();
            result.put("msg", ex.getMessage());
            try {
                return bufferFactory.wrap(objectMapper.writeValueAsBytes(result));
            } catch (JsonProcessingException e) {
                throw new RuntimeException(e);
            }
        }));
    }
}

IllegalTokenException:是我们自定义的异常,通常在上述代码的第四步中,就需要根据我们判断 ex 属于我们的哪种自定义异常,然后进行对应的状态码处理.

Mono.fromSupplier():是一个函数式接口,参数这里通过一 lamada 表达式实现(无参,返回值是一个 Mono)泛型. 这里要实现的逻辑就是把异常的响应进行封装.bufferFactory.wrap:这里就是按照 webflux 编程的方式,参数是 json 格式(通过 ObjectMapper 转化),得到一个 Mono 对象.

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

到此这篇关于Spring Cloud - 通过 Gateway webflux 编程实现网关异常处理的文章就介绍到这了,更多相关Spring Cloud Gateway网关异常内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • java实现ReadWriteLock读写锁的示例

    java实现ReadWriteLock读写锁的示例

    ReadWriteLock是Java并发包中的接口,定义了读锁和写锁,读锁允许多线程同时访问共享资源,而写锁则要求独占,这种机制适用于读多写少的场景,可以提高并发效率同时保证数据一致性,本文就来详细的介绍一下如何实现,感兴趣的可以了解一下
    2024-09-09
  • java system类使用方法示例 获取系统信息

    java system类使用方法示例 获取系统信息

    这篇文章主要介绍了java system类使用方法,该类中的方法都是静态的。不能被实例化,没有对外提供构造函数,该类可以获取系统信息
    2014-01-01
  • Spring中自定义Schema如何解析生效详解

    Spring中自定义Schema如何解析生效详解

    Spring2.5在2.0的基于Schema的Bean配置的基础之上,再增加了扩展XML配置的机制。通过该机制,我们可以编写自己的Schema,并根据自定义的Schema用自定的标签配置Bean,下面这篇文章主要介绍了关于Spring中自定义Schema如何解析生效的相关资料,需要的朋友可以参考下
    2018-07-07
  • Spring WebFlux的使用指南

    Spring WebFlux的使用指南

    这篇文章主要介绍了Spring WebFlux的使用指南,帮助大家更好的理解和学习使用Spring框架,感兴趣的朋友可以了解下
    2021-05-05
  • JAVA返回PDF文件流并进行下载的实现方法

    JAVA返回PDF文件流并进行下载的实现方法

    这篇文章主要给大家介绍了关于JAVA返回PDF文件流并进行下载的实现方法,PDF文件流下载是通过HTTP协议将服务器上的PDF文件以流的方式发送给客户端,供客户端保存到本地磁盘或直接在浏览器中打开,需要的朋友可以参考下
    2024-02-02
  • 如何将复杂SQL转换成Java对象的实例讲解

    如何将复杂SQL转换成Java对象的实例讲解

    转换复杂SQL到Java代码,我们需要确定数据库连接方式和工具,使用JDBC的API来连接数据库、执行SQL语句,复杂SQL语句可以被拆分为多个步骤,每个步骤执行一个特定的操作,通过将SQL语句拆分为多个步骤,我们可以更好地理解复杂SQL的逻辑,并且更容易将其转换为Java代码
    2024-05-05
  • Java打乱数组元素简单代码例子

    Java打乱数组元素简单代码例子

    在Java编程中,我们经常需要对数组进行乱序操作(即将数组中的元素随机打乱顺序),这篇文章主要给大家介绍了关于Java打乱数组元素的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2024-03-03
  • Kafka利用Java实现数据的生产和消费实例教程

    Kafka利用Java实现数据的生产和消费实例教程

    这篇文章主要给大家介绍了关于Kafka利用Java实现数据的生产和消费的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。
    2018-01-01
  • java实现象棋小游戏

    java实现象棋小游戏

    这篇文章主要为大家详细介绍了java实现象棋小游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-01-01
  • Java中的Fork/Join框架使用详解

    Java中的Fork/Join框架使用详解

    这篇文章主要介绍了Java中的Fork/Join框架使用详解,Fork/Join 框架:就是在必要的情况下,将一个大任务,进行<BR>拆分(fork)成若干个小任务(拆到不可再拆时),再将一个个<BR>的小任务运算的结果进行 join 汇总,需要的朋友可以参考下
    2024-01-01

最新评论