当前位置: 首页 > 知识库问答 >
问题:

Spring云网关无法正确转发

丌官玺
2023-03-14

我有一个Spring Boot应用程序正在尝试使用Spring Cloud Gateway访问一些微服务。我使用的代码基于以下位置的说明:

https://betterjavacode.com/programming/how-to-use-api-gateway-with-spring-cloud

基本上,我的应用程序复制了该站点上提供的代码,包括作者创建的两个测试微服务:

@RestController
@RequestMapping("/vendor")
public class VendorController
{
    @GetMapping("/total")
    public List vendors()
    {
        List list = new ArrayList<>();
        list.add("CJI Consultants");
        list.add("Signature Consultants");
        list.add("Deloitte");
        return list;
    }
}

@RestController
@RequestMapping("/customer")
public class CustomerController
{
    @GetMapping("/total")
    public List customers()
    {
        List list = new ArrayList<>();
        list.add("Microsoft");
        list.add("Amazon");
        list.add("Apple");
        return list;
    }
}

我的实际网关代码与作者的类似:

package com . betterjavacode . API gateway demo . config;

import org.springframework.cloud.gateway.route.RouteLocator;
import org.springframework.cloud.gateway.route.builder.RouteLocatorBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class SpringCloudConfig
{
    @Bean
    public RouteLocator gatewayRoutes(RouteLocatorBuilder routeLocatorBuilder)
    {
        return routeLocatorBuilder.routes()
                .route("customerModule", rt -> rt.path("/customer/**")
                        .uri("http://localhost:8081/"))
                .route("vendorModule", rt -> rt.path("/vendor/**")
                    .uri("http://localhost:8082/"))
                    .build();

    }
}

不幸的是,当我运行此应用程序时,请输入正确的 URL:

http://localhost:8080/vendor/total

http://localhost:8080/customer/total

我得到404个错误!

我似乎能够通过网关访问这两个微服务的唯一方法是将路径改为“/**”。例如,为了访问客户微服务,我必须更改:

。路由(“客户模块”,rt-

v.route("客户模块",rt -

然后我就可以看到客户微服务输出没有问题了。当然,我不能对两条路线使用相同的路径。看起来此网关只能处理一个使用“/**”路径的路由。

我在这里错过了什么吗?有人可以给出为什么这不能正常工作的想法吗?如何让此网关转发到它应该去的路径?

共有2个答案

张茂勋
2023-03-14

您可以尝试使用< code>StripPrefix参数。

return routeLocatorBuilder.routes()
                .route("customerModule", rt -> rt.path("/customer/**")
                        .filters(f -> f.stripPrefix(0))
                        .uri("http://localhost:8081/"))
                .route("vendorModule", rt -> rt.path("/vendor/**")
                    .filters(f -> f.stripPrefix(0))
                    .uri("http://localhost:8082/"))
                    .build();

或者您可以删除@RequestMapping(“/customer”)和@RequestMapping(“/vvendor”),因为它会在发送到下游之前删除前缀路径。

徐俊人
2023-03-14

我相信我已经解决了这个问题。原来,由于未知的原因,只要网关中使用了“/**”以外的路由,URI就不能包含HTTP前缀。

换言之,不是有路线:

route("customerModule", rt -> rt.path("/customer/**")
                    .uri("http://localhost:8081/"))

该路由应该没有HTTP前缀:

.route("customerModule", rt -> rt.path("/customer/**")
                    .uri("localhost:8081/"))

我不知道为什么会这样,但确实如此。只要我格式化不带前缀的uri,我就可以访问微服务。

我偶然发现了这一点。我很想知道为什么它是这样工作的,但至少应该记录这个需求。

 类似资料:
  • 我最近将microservices后端迁移到Spring boot v2.6.1 Spring cloud v2021.0.0(旧版本是v2.2.1.RELEASE)。 以前,设置包括发现服务器(Eureka)、网关(Zuul)和各种可通过网关从外部访问的微服务。所有这些都启用了TLS/安全端口,因此所有请求(发现、注册、网关转发等)都需要SSL信任存储配置。 由于Zuul在这个版本中不再受支持,

  • 我正在研究一个示例poc,我正在尝试集成Spring云api网关 在我的pom.xml中,我有 在我的应用程序中。yml我有 在我的主课上 我能够直接从它们各自的端口访问服务,但是当我试图从端口网关端口ie 9191访问api时,我得到 ***2022-09-08 16:23:34.644错误4128-[ctor-http-nio-3]a . w . r . e . abstracterrorwe

  • 我有一个带有一些endpoint的anexo API,比如: 如何将Spring Cloud Gateway与这些endpoint一起使用?

  • 问题内容: 我正在使用Play编写一个部署在Tomcat中的webapp。因为该应用程序不会处理大量数据,所以我在Hibernate中使用默认的H2数据库。当我想部署新版本的应用程序时,我关闭了tomcat,擦除了旧的webapp和WAR,添加了新的WAR,然后开始备份。 直到几天前,当我添加数据库组件时,它一直有效。现在,我经常无法重新部署该应用程序。当我删除旧目录时,它将使用以下结构自动重新生

  • 我为所有传入请求创建了全局路由,并使用AbstracTerrorWebExceptionHandler。 我的application.yml 运行应用程序时的日志: 谢谢你的帮助。