我有一个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 -
然后我就可以看到客户微服务输出没有问题了。当然,我不能对两条路线使用相同的路径。看起来此网关只能处理一个使用“/**”路径的路由。
我在这里错过了什么吗?有人可以给出为什么这不能正常工作的想法吗?如何让此网关转发到它应该去的路径?
您可以尝试使用< 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”),因为它会在发送到下游之前删除前缀路径。
我相信我已经解决了这个问题。原来,由于未知的原因,只要网关中使用了“/**”以外的路由,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 运行应用程序时的日志: 谢谢你的帮助。