在同一项目中实施 Spring 云网关
Implementing Spring Cloud Gateway In The Same Project
我在我的 spring 启动微服务中为其他微服务提供了一个 api,我想在这个微服务前面放一个 spring-cloud-gateway。
我已经查看了著名的 spring 文档 (https://spring.io/guides/gs/gateway/),但据我所知,它要求我在单独的项目中启动云网关。但是我想 运行 我的微服务中的 RouteLocator bean。不是在一个单独的项目中,而是在同一个项目中。
当我在同一个项目中使用它时,我得到这样的警告
"Spring MVC found on classpath, which is incompatible with Spring Cloud Gateway at this time. Please remove spring-boot-starter-web dependency."
后来,正如他在警告中所说,我删除了 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: Failed to process import candidates for configuration class [com.company operations.Service operationsApplication]; nested exception is org.spring. .core.NestedIOException: Failed to load class [javax.servlet.Filter]; nested exception is java.lang.ClassNotFoundException: javax.servlet.Filter
".
我们从项目中删除了应该提供 web api 服务的核心库 :D
请问,我可以在同一个项目中使用云网关吗?不用的原因和逻辑是什么?
如果不能在同一个项目中使用,那么gateway的大家熟知的做法应该如何,是应该在每个api微服务前面放一个gateway,还是应该有一个我项目中的单个网关由多个微服务组成?
您可以在同一项目中启动网关,但这是一个基于 webflux 的项目。
来自 documentation
Spring Cloud Gateway is built on Spring Boot 2.x, Spring WebFlux, and Project Reactor. As a consequence, many of the familiar synchronous libraries (Spring Data and Spring Security, for example) and patterns you know may not apply when you use Spring Cloud Gateway. If you are unfamiliar with these projects, we suggest you begin by reading their documentation to familiarize yourself with some of the new concepts before working with Spring Cloud Gateway.
和
Spring Cloud Gateway requires the Netty runtime provided by Spring Boot and Spring Webflux. It does not work in a traditional Servlet Container or when built as a WAR.
所以你应该使用 spring-boot-starter-webflux
而不是 spring-boot-starter-web
。
或者,如果您需要使用传统的 Spring MVC,请考虑使用 Spring Netflix Zuul。该项目目前处于维护模式,Spring Gateway 是它的继任者,但它应该可以工作。
添加到 regarding using Spring MVC, in the case that your project uses spring-boot >=2.4, spring-cloud-netflix-zuul won't be compatible since it is not included with spring-cloud as of version 2020.0。
在这种情况下,一种可能的替代方法是在使用 spring-cloud-gateway-mvc 的 MVC 项目中使用 spring-cloud-gateway 设置代理,它与 spring-boot 兼容-starter-web.
我在我的 spring 启动微服务中为其他微服务提供了一个 api,我想在这个微服务前面放一个 spring-cloud-gateway。
我已经查看了著名的 spring 文档 (https://spring.io/guides/gs/gateway/),但据我所知,它要求我在单独的项目中启动云网关。但是我想 运行 我的微服务中的 RouteLocator bean。不是在一个单独的项目中,而是在同一个项目中。
当我在同一个项目中使用它时,我得到这样的警告
"Spring MVC found on classpath, which is incompatible with Spring Cloud Gateway at this time. Please remove spring-boot-starter-web dependency."
后来,正如他在警告中所说,我删除了 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: Failed to process import candidates for configuration class [com.company operations.Service operationsApplication]; nested exception is org.spring. .core.NestedIOException: Failed to load class [javax.servlet.Filter]; nested exception is java.lang.ClassNotFoundException: javax.servlet.Filter ".
我们从项目中删除了应该提供 web api 服务的核心库 :D
请问,我可以在同一个项目中使用云网关吗?不用的原因和逻辑是什么?
如果不能在同一个项目中使用,那么gateway的大家熟知的做法应该如何,是应该在每个api微服务前面放一个gateway,还是应该有一个我项目中的单个网关由多个微服务组成?
您可以在同一项目中启动网关,但这是一个基于 webflux 的项目。 来自 documentation
Spring Cloud Gateway is built on Spring Boot 2.x, Spring WebFlux, and Project Reactor. As a consequence, many of the familiar synchronous libraries (Spring Data and Spring Security, for example) and patterns you know may not apply when you use Spring Cloud Gateway. If you are unfamiliar with these projects, we suggest you begin by reading their documentation to familiarize yourself with some of the new concepts before working with Spring Cloud Gateway.
和
Spring Cloud Gateway requires the Netty runtime provided by Spring Boot and Spring Webflux. It does not work in a traditional Servlet Container or when built as a WAR.
所以你应该使用 spring-boot-starter-webflux
而不是 spring-boot-starter-web
。
或者,如果您需要使用传统的 Spring MVC,请考虑使用 Spring Netflix Zuul。该项目目前处于维护模式,Spring Gateway 是它的继任者,但它应该可以工作。
添加到
在这种情况下,一种可能的替代方法是在使用 spring-cloud-gateway-mvc 的 MVC 项目中使用 spring-cloud-gateway 设置代理,它与 spring-boot 兼容-starter-web.