在同一个项目中实现 Spring Cloud Gateway
Posted
技术标签:
【中文标题】在同一个项目中实现 Spring Cloud Gateway【英文标题】:Implementing Spring Cloud Gateway In The Same Project 【发布时间】:2021-06-16 21:21:42 【问题描述】:我在我的spring boot微服务中为其他微服务提供了一个api,我想在这个微服务前面放一个spring-cloud-gateway。
我已经查看了著名的 Spring 文档 (https://spring.io/guides/gs/gateway/),但据我了解,它需要我在单独的项目中启动云网关。但我想在我的微服务中运行 RouteLocator bean。不是在一个单独的项目中,而是在同一个项目中。
当我在同一个项目中使用它时,我会收到这样的警告
“在classpath上发现Spring MVC,此时与Spring Cloud Gateway不兼容,请移除spring-boot-starter-web依赖。”
后来,正如他在警告中所说,我删除了 spring-boot-starter-web 依赖项,甚至进入了其他项目,像这样将它们排除在外
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web-services</artifactId>
<exclusions>
<exclusion>
<artifactId>spring-boot-starter-web</artifactId>
<groupId>org.springframework.boot</groupId>
</exclusion>
</exclusions>
</dependency>
这一次我逻辑上得到了错误
“org.springframework.beans.factory.BeanDefinitionStoreException:无法处理配置类[com.company operations.Service operationsApplication]的导入候选;嵌套异常是org.spring。.core.NestedIOException:无法加载类[javax .servlet.Filter]; 嵌套异常是 java.lang.ClassNotFoundException: javax.servlet.Filter ”。
我们从项目中删除了应该提供 web api 服务的核心库:D
那么,我可以在同一个项目中使用云网关吗?不使用的原因和逻辑是什么?
如果不能在同一个项目中使用,网关的众所周知的做法应该怎么做,我应该在每个api微服务前面放一个网关,还是我的项目中应该有一个单独的网关,由多个微服务?
【问题讨论】:
【参考方案1】:您可以在同一个项目中启动网关,但这是一个基于 webflux 的项目。 来自documentation
Spring Cloud Gateway 基于 Spring Boot 2.x、Spring WebFlux 和 Project Reactor 构建。因此,当您使用 Spring Cloud Gateway 时,您所知道的许多熟悉的同步库(例如 Spring Data 和 Spring Security)和模式可能并不适用。如果您不熟悉这些项目,我们建议您在使用 Spring Cloud Gateway 之前先阅读他们的文档以熟悉一些新概念。
和
Spring Cloud Gateway 需要 Spring Boot 和 Spring Webflux 提供的 Netty 运行时。它不适用于传统的 Servlet 容器或构建为 WAR。
所以你应该使用spring-boot-starter-webflux
而不是spring-boot-starter-web
。
或者,如果您需要使用传统的 Spring MVC,请考虑使用Spring Netflix Zuul。该项目目前处于维护模式,Spring Gateway 是它的继任者,但它应该可以工作。
【讨论】:
【参考方案2】:补充sawim's answer关于使用Spring MVC,如果您的项目使用spring-boot >=2.4,spring-cloud-netflix-zuul将不兼容,因为它is not included with spring-cloud as of version 2020.0。
在这种情况下,一种可能的替代方法是在使用 spring-cloud-gateway-mvc 的 MVC 项目中使用 spring-cloud-gateway 设置代理,这与 spring-boot-starter-web 兼容。
【讨论】:
以上是关于在同一个项目中实现 Spring Cloud Gateway的主要内容,如果未能解决你的问题,请参考以下文章
Spring Cloud Azure 4.0 GA – 实现 Spring 框架与 Azure 服务的无缝集成
在我的 android 应用中实现 Google Cloud Messaging