gateway与spring-boot-starter-web冲突问题的解决
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.fig.GatewayAutoConfiguration required a bean of type 'org.dec.ServerCodecConfigurer' that could not be found.
Action:
Consider defining a bean of type 'org.dec.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>
成功启动项⽬
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.fig.GatewayAutoConfiguration required a bean of type 'org.dec.ServerCodecConfigurer' that could not be found.
Action:
Consider defining a bean of type 'org.dec.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>
springcloud和springboot<artifactId>spring-boot-starter-web</artifactId>
</dependency>
以上为个⼈经验,希望能给⼤家⼀个参考,也希望⼤家多多⽀持。