gateway 与 spring-boot-starter-web 冲突问题

2022-07-02 12:58:12

gateway 与 spring-boot-starter-web 冲突问题

  • 环境:
    SpringCloud 版本 ---- Finchley.SR2
    SpringBoot 版本 ---- 2.0.6.RELEASE

  • 问题描述:
    将 zuul 网关升级为 gateway 时,引入gateway 依赖启动网关子项目报错

    • 引入的依赖:
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-gateway</artifactId>
    </dependency>
    • 启动网关报错
    Error starting ApplicationContext. To display the conditions report re-run your application with 'debug' enabled.
    2019-12-31 10:26:35.211 ERROR 13124 --- [           main] o.s.b.d.LoggingFailureAnalysisReporter   : 
    
    ***************************
    APPLICATION FAILED TO START
    ***************************
    
    Description:
    
    Parameter 0 of method modifyRequestBodyGatewayFilterFactory in org.springframework.cloud.gateway.config.GatewayAutoConfiguration required a bean of type 'org.springframework.http.codec.ServerCodecConfigurer' that could not be found.
    
    
    Action:
    
    Consider defining a bean of type 'org.springframework.http.codec.ServerCodecConfigurer' in your configuration.
    
    
    Process finished with exit code 1
  • 问题分析:

    • 查看控制台打印日志:

      可以看到是 web 依赖下的 tomcat 容器启动失败,且打印出 nio 异常。
    • 回顾一下 zuul 和 gateway 的区别
      • Zuul: 构建于 Servlet 2.5,兼容3.x,使用的是阻塞式的API,不支持长连接,比如 websockets。
      • Gateway构建于 Spring 5+,基于 Spring Boot 2.x 响应式的、非阻塞式的 API。同时,它支持 websockets,和 Spring 框架紧密集成
    • 报错原因:启动时默认使用了 spring-boot-starter-web 的内置容器,不支持非阻塞
  • 问题解决:
    有两种解决方式:
    1、 排除 web 内置容器

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
        <!-- Maven整个生命周期内排除内置容器,排除内置容器导出成war包可以让外部容器运行spring-boot项目-->
        <exclusions>
            <exclusion>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-tomcat</artifactId>
            </exclusion>
        </exclusions>
    </dependency>

    2、 使用 spring-webflux 模块,webflux 有一个全新的非堵塞的函数式 Reactive Web 框架,可以用来构建异步的、非堵塞的、事件驱动的服务

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-webflux</artifactId>
    </dependency>
  • 成功启动项目

  • 作者:Chen DingFeng
  • 原文链接:https://blog.csdn.net/weixin_43198403/article/details/103780376
    更新时间:2022-07-02 12:58:12