web-dev-qa-db-fra.com

Spring Cloud Gateway - Proxy/Transférer l'intégralité de la sous-partie de l'URL

J'utilise Spring Cloud Gateway 2.0.0.M6 pour tester une passerelle simple. Je veux juste qu'une URL soit transmise à une autre avec ** regex

Exemple 1:/integration/sbl/foo/bar => localhost: 4178/a-integration/sbl/foo/bar}

Exemple 2:/integration/sbl/baz/bad => localhost: 4178/a-integration/sbl/baz/bad}

Jusqu'à présent, j'ai écrit ce qui suit, mais il ne fait que le transmettre à http: // localhost: 4178/a-integration/

 @Bean
public RouteLocator routeLocator(RouteLocatorBuilder builder) {
    String test = "http://localhost:4178/a-integration/";

    return builder.routes()
            .route("integration-test",
                    r -> r.path("/integration/sbl/**")
                            .uri(test)
            )
            .build();
}

Comment puis-je corriger le code ci-dessus pour activer ce comportement? 

MODIFIER

J'ai essayé ce qui suit en fonction de la réponse ci-dessous

String samtykke = "http://localhost:4178/";

return builder.routes()

        .route("samtykke", r -> r
                .path("/gb-integration/sbl/**")
                .filters(f -> f.rewritePath("/gb-integration/sbl/(?<segment>.*)", "/gb-samtykke-integration/${segment}"))
                .uri(samtykke))
        .build();

et j'ai essayé un GET http: // localhost: 4177/gb-integration/sbl/api/sbl/revenu/ et attendu http: // localhost: 4178/gb-samtykke-integration/api/sbl/revenu/ retour mais ça n'a pas marché.

La sortie dit:

2018-02-23 09:46:35.197 TRACE 6364 --- [ctor-http-nio-2] o.s.c.g.h.p.RoutePredicateFactory        : Pattern "/gb-integration/sbl/**" matches against value "[path='/gb-integration/sbl/api/sbl/income/']"
2018-02-23 09:46:35.198 DEBUG 6364 --- [ctor-http-nio-2] o.s.c.g.h.RoutePredicateHandlerMapping   : Route matched: samtykke
2018-02-23 09:46:35.198 DEBUG 6364 --- [ctor-http-nio-2] o.s.c.g.h.RoutePredicateHandlerMapping   : Mapping [Exchange: GET http://localhost:4177/gb-integration/sbl/api/sbl/income/] to Route{id='samtykke', uri=http://localhost:4178/, order=0, predicate=org.springframework.cloud.gateway.handler.predicate.PathRoutePredicateFactory$$Lambda$245/1803714790@1d0042df, gatewayFilters=[OrderedGatewayFilter{delegate=org.springframework.cloud.gateway.filter.factory.RewritePathGatewayFilterFactory$$Lambda$247/485237151@77da026a, order=0}]}
2018-02-23 09:46:35.200 DEBUG 6364 --- [ctor-http-nio-2] o.s.c.g.handler.FilteringWebHandler      : Sorted gatewayFilterFactories: [OrderedGatewayFilter{delegate=GatewayFilterAdapter{delegate=org.springframework.cloud.gateway.filter.NettyWriteResponseFilter@5c534b5b}, order=-1}, OrderedGatewayFilter{delegate=org.springframework.cloud.gateway.filter.factory.RewritePathGatewayFilterFactory$$Lambda$247/485237151@77da026a, order=0}, OrderedGatewayFilter{delegate=GatewayFilterAdapter{delegate=org.springframework.cloud.gateway.filter.RouteToRequestUrlFilter@396639b}, order=10000}, OrderedGatewayFilter{delegate=GatewayFilterAdapter{delegate=org.springframework.cloud.gateway.filter.NettyRoutingFilter@a18649a}, order=2147483647}, OrderedGatewayFilter{delegate=GatewayFilterAdapter{delegate=org.springframework.cloud.gateway.filter.ForwardRoutingFilter@2b22a1cc}, order=2147483647}, OrderedGatewayFilter{delegate=GatewayFilterAdapter{delegate=org.springframework.cloud.gateway.filter.WebsocketRoutingFilter@62573c86}, order=2147483647}]
2018-02-23 09:46:35.232 TRACE 6364 --- [ctor-http-nio-2] o.s.c.g.filter.RouteToRequestUrlFilter   : RouteToRequestUrlFilter start
2018-02-23 09:46:35.314 TRACE 6364 --- [ctor-http-nio-1] o.s.c.g.filter.NettyWriteResponseFilter  : NettyWriteResponseFilter start
6
Shervin Asgari

Vous pouvez utiliser la fonctionnalité rewritePath dans vos filtres de chemin, comme spécifié dans la documentation disponible ici: 

https://cloud.spring.io/spring-cloud-gateway/single/spring-cloud-gateway.html#_rewritepath ofgateway_factory

Parties pertinentes:

5.12 Fabrique de filtres Gateway RewritePath

RewritePath GatewayFilter Factory utilise un paramètre regexp de chemin et un paramètre de remplacement. Ceci utilise des expressions régulières Java pour un manière flexible de réécrire le chemin de requête.

spring:   
  cloud:
     gateway:
       routes:
       - id: rewritepath_route
         uri: http://example.org
         predicates:
         - Path=/foo/**
         filters:
         - RewritePath=/foo/(?<segment>.*), /$\{segment}

Pour un chemin de requête de/foo/bar, cela définira le chemin sur/bar avant faire la demande en aval. Notez le $\qui est remplacé par $ en raison de la spécification YAML.

Dans votre exemple, cela ressemblerait à ceci:

@Bean
public RouteLocator routeLocator(RouteLocatorBuilder builder) {
    String test = "http://localhost:4178";

    return builder.routes()
            .route("integration-test", r -> r
                    .path("/integration/sbl/**")
                    .filters(f->f.rewritePath("/integration/(?<segment>.*)","/a-integration/${segment}"))
                    .uri(test)
                  )
            .build();
}
6
Boyen

Nous avions un problème similaire ici, et bien que je sois d’accord avec la réponse de Boyen, il peut être utile de signaler que le paramètre "uri" ignore le composant "path" de l’URI. Ce n'est pas clair dans la documentation (ou je ne l'ai pas trouvée au moins), j'espère donc que cela aidera les autres.

Supposons que vous souhaitiez rediriger toutes les demandes reçues sur/foo vers http://example.org/bar

Par exemple:/foo/x/y/z -> http://example.org/bar/x/y/z

Par exemple, cela fonctionne comme prévu:

spring:   
  cloud:
     gateway:
       routes:
       - id: rewritepath_route
         uri: http://example.org
         predicates:
         - Path=/foo/**
         filters:
         - RewritePath=/foo/(?<segment>.*), /bar/$\{segment}

Bien que cela ne fonctionne pas comme prévu (il ignore/barre):

spring:   
  cloud:
     gateway:
       routes:
       - id: rewritepath_route
         uri: http://example.org/bar
         predicates:
         - Path=/foo/**
         filters:
         - RewritePath=/foo/(?<segment>.*), /$\{segment}
0
Guillem Corominas

Veuillez trouver ci-dessous les deux types de configuration avec une configuration complète. Les deux méthodes produisent le même résultat.

Installer:

  • la passerelle fonctionne sur http://localhost:8090
  • un chemin de base appelé /context sert de point d'entrée de la passerelle
  • un service appelé my-resources fonctionnant sur http://localhost:8091/my-resources. Lorsque /my-resources est appelé sans paramètre, toutes les ressources sont renvoyées. Lorsqu'il est appelé avec un paramètre, il renvoie la ressource avec la variable RID correspondante (le cas échéant).

La passerelle est configurée pour que toutes les variables de chemin d'accès (éventuellement aucune) transmises à http://localhost:8090/context/my-resources/ soient transférées à uri http://localhost:8091/my-resources/.

Méthode 1: en utilisant application.yml

spring:
  cloud:
    gateway:
      routes:
      - id: route_id
        predicates:
        - Path=/context/my-resources/**
        filters:
        - RewritePath=/context/my-resources/(?<RID>.*), /my-resources/$\{RID}
        uri: http://localhost:8091

Méthode 2: en utilisant Java comme configuration

@Bean
public RouteLocator routes(RouteLocatorBuilder routeBuilder) {
    return routeBuilder.routes()
            .route("route_id",
                    route -> route
                            .path("/context/my-resources/**")
                            .filters(f -> f.rewritePath("/context/my-resources/(?<RID>.*)", "/my-resources/${RID}"))
                            .uri("http://localhost:8091")
            )
            .build();
}
0
avi.elkharrat