欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

gateway与spring-boot-starter-web冲突问题的解决

程序员文章站 2022-06-26 09:20:05
gateway与spring-boot-starter-web 冲突环境:springcloud 版本 ---- finchley.sr2springboot 版本 ---- 2.0.6.releas...

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

问题分析:

查看控制台打印日志:

gateway与spring-boot-starter-web冲突问题的解决

可以看到是 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>

成功启动项目

gateway与spring-boot-starter-web冲突问题的解决

gateway 网关版本冲突问题

1、spring-cloud版本

<spring-cloud.version>finchley.release</spring-cloud.version>

2、sprring-boot版本

<version>2.0.3.release</version>

3、错误描述

error starting applicationcontext. to display the conditions report re-run your application with 'debug' enabled.
2019-05-21 16:53:50.138 error 15308 --- [ 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.

4、原因

<dependency>
    <groupid>org.springframework.boot</groupid>
    <artifactid>spring-boot-starter-web</artifactid>
</dependency>

<dependency>
     <groupid>org.springframework.cloud</groupid>
     <artifactid>spring-cloud-starter-gateway</artifactid>
 </dependency>

版本冲突

5、解决

可以删除:

<dependency>
  <groupid>org.springframework.boot</groupid>
  <artifactid>spring-boot-starter-web</artifactid>
</dependency>

以上为个人经验,希望能给大家一个参考,也希望大家多多支持。