在同一项目中实现spring云网关

3zwjbxry  于 2021-07-16  发布在  Java
关注(0)|答案(1)|浏览(530)

我在springboot微服务中为其他微服务提供了一个api,我想在这个微服务前面放一个springcloud网关。
我已经审阅了著名的spring文档(https://spring.io/guides/gs/gateway/)但据我所知,它需要我在一个单独的项目中启动云网关。但是我想在我的微服务中运行routelocatorbean。不是在一个单独的项目中,而是在同一个项目中。
当我在同一个项目中使用它时,会得到这样的警告
“在类路径上发现了SpringMVC,此时它与SpringCloudGateway不兼容。请删除spring boot starter web依赖关系。“
后来,正如他在警告中所说,我删除了springbootstarterweb依赖项,甚至在其他项目中也删除了它,像这样将它们排除在外

<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”。
我们从应该提供webapi服务的项目中删除了核心库:d

因此,我可以在同一个项目中使用云网关吗?不使用它的原因和逻辑是什么?

如果不可能在同一个项目中使用它,那么众所周知的gateway实践应该是怎样的,我应该在每个api微服务前面放置一个网关,还是应该在我的项目中有一个由多个微服务组成的网关?

ecfdbz9o

ecfdbz9o1#

您可以在同一个项目中启动gateway,但这是一个基于webflux的项目。来自文档
SpringCloudGateway构建在SpringBoot2.x、SpringWebFlux和ProjectReactor上。因此,当您使用springcloudgateway时,许多您熟悉的同步库(例如spring数据和Spring Security )和模式可能不适用。如果您不熟悉这些项目,我们建议您在使用springcloudgateway之前先阅读它们的文档,熟悉一些新概念。

SpringCloudGateway需要SpringBoot和SpringWebFlux提供的netty运行时。它不能在传统的servlet容器中工作,也不能在构建为war时工作。
所以你应该用 spring-boot-starter-webflux 而不是 spring-boot-starter-web .
或者,如果您需要使用传统的springmvc,可以考虑使用springnetflixzuul。这个项目目前处于维护模式,springgateway是它的继承者,但它应该可以工作。

相关问题