【问题标题】:jHipster gateway downstream prefixjHipster 网关下游前缀
【发布时间】:2022-01-28 00:21:38
【问题描述】:

我正在将旧的 jHipster 网关更新到 7.5.0 版本。新版本使用 Spring Cloud Gateway(带有 Eureka),而旧版本使用 Zuul。在以前的版本中,使用名为“foo”的服务和路径“bar”的服务发现将在网关上注册它而没有任何前缀,因此可以通过以下方式访问它:

GATEWAY_URL/foo/bar

现在所有服务都使用“services/”前缀注册,结果需要调用以下网址:

GATEWAY_URL/services/foo/bar

我找不到对此负责的配置。我找到了一个属性 spring.webservices.path,但是将其更改为其他值不会产生任何更改,并且在 Spring Boot 2.6.3 中它的值不能为空或“/”(但我不确定这是否是我应该的属性检查)。我还尝试了 spring.cloud.gateway.routes 形式:

spring:
webservices:
    path: /test
main:
    allow-bean-definition-overriding: true
cloud:
    gateway:
        discovery:
            locator:
                enabled: true
        routes:
            - id: user-service-route
              uri: lb://user
              predicates:
                  - Path=/user/**

但没有任何运气。我也不确定这是 jHipster 问题还是 SCG

我需要更改它,以便使用我的 API 的其他系统不需要更新它们的路径,我知道我之前总是可以添加 nginx 以便它会重写路径但感觉不正确。

【问题讨论】:

  • 据我所知,在迁移到 Spring Cloud Gateway 之前,此更改也在 JHipster Zuul 中完成。
  • 这可能是真的,我使用的是非常旧的版本 - 从文件中我看到它是使用 4.6.2 生成器生成的,所以肯定发生了很多变化,但这意味着它可能是jHipster负责
  • 我不这么认为,我个人会尝试在 DiscoveryClientRouteDefinitionLocator 类中带有断点的调试器下运行
  • 是的,这正是我所做的,我发现这是由作为 SCG 的一部分的 GatewayDiscoveryClientAutoConfiguration 完成的自动配置的情况。它使用默认谓词定义 DiscoveryLocatorProperties bean: PredicateDefinition{name='Path', args={pattern='/'+serviceId+'/**'}} 所以最后我创建了自定义 WebFilter ,它将我的旧服务路径映射到新的随着时间的推移,我将更新客户端以使用新的路由路径:)

标签: jhipster netflix-eureka spring-cloud-gateway jhipster-gateway


【解决方案1】:

此行为由 SCG 自动配置 - GatewayDiscoveryClientAutoConfiguration 完成,它使用谓词注册 DiscoveryLocatorProperties bean:

PredicateDefinition{name='Path', args={pattern='/'+serviceId+'/**'}}

我不想更改自动配置,所以我做了 WebFilter,它作为第一个执行并改变请求路径

public class ServicesFilter implements WebFilter {

private final ServicesMappingConfigration mapping;

public ServicesFilter(ServicesMappingConfigration mapping) {
    this.mapping = mapping;
}

@Override
public Mono<Void> filter(ServerWebExchange exchange, WebFilterChain chain) {
    RequestPath path = exchange.getRequest().getPath();
    if (path.elements().size() > 1) {
        PathContainer pathContainer = path.subPath(1, 2);
        if (mapping.getServices().contains(pathContainer.value())) {
            ServerHttpRequest mutatedRequest = exchange
                .getRequest()
                .mutate()
                .path("/services" + exchange.getRequest().getPath())
                .build();
            ServerWebExchange mutatedExchange = exchange.mutate().request(mutatedRequest).build();
            return chain.filter(mutatedExchange);
        }
    }

    return chain.filter(exchange);
}}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-06-10
    • 1970-01-01
    • 2020-05-13
    • 1970-01-01
    • 2021-07-20
    • 2016-08-13
    • 2018-12-10
    • 2019-10-26
    相关资源
    最近更新 更多