wake-up-neo.com

Spring Cloud Gateway - Proxy/Weiterleiten des gesamten untergeordneten Teils der URL

Ich verwende Spring Cloud Gateway 2.0.0.M6, um ein einfaches Gateway zu testen. Ich möchte nur, dass eine URL mit ** Regex an eine andere URL weitergeleitet wird

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

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

Bisher habe ich folgendes geschrieben, aber es leitet nur an 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();
}

Wie kann ich den obigen Code beheben, um dieses Verhalten zu aktivieren? 

EDIT

Ich habe das folgende anhand der Antwort versucht

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();

und ich habe versucht, ein GET http: // localhost: 4177/GB-Integration/sbl/api/sbl/einkommen/ und erwartet http: // localhost: 4178/gb-samtykke-integration/api/sbl/Einkommen/ zurück aber es hat nicht funktioniert.

Die Ausgabe sagt:

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/[email protected], gatewayFilters=[OrderedGatewayFilter{delegate=org.springframework.cloud.gateway.filter.factory.RewritePathGatewayFilterFactory$$Lambda$247/[email protected], 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=or[email protected]5c534b5b}, order=-1}, OrderedGatewayFilter{delegate=org.springframework.cloud.gateway.filter.factory.RewritePathGatewayFilterFactory$$Lambda$247/[email protected], order=0}, OrderedGatewayFilter{delegate=GatewayFilterAdapter{delegate=o[email protected]396639b}, order=10000}, OrderedGatewayFilter{delegate=GatewayFilterAdapter{deleg[email protected]a18649a}, order=2147483647}, OrderedGatewayFilter{delegate=GatewayFilterAdapter{delegat[email protected]2b22a1cc}, order=2147483647}, OrderedGatewayFilter{delegate=GatewayFilterAdapter{delegate=[email protected]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

Sie können die Funktion "rewritePath" in Ihren Pfadfiltern verwenden, wie in der hier angegebenen Dokumentation angegeben: 

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

Relevante Teile:

5.12 RewritePath GatewayFilter Factory

Die RewritePath GatewayFilter Factory verwendet einen Pfadregexp-Parameter und einen Ersatzparameter. Hierbei werden reguläre Java-Ausdrücke für eine .__ verwendet. flexible Möglichkeit, den Anforderungspfad neu zu schreiben.

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

Bei einem Anforderungspfad von/foo/bar wird der Pfad auf/bar vor .__ festgelegt. die nachgelagerte Anfrage machen. Beachten Sie das $ \, das durch $ .__ ersetzt wird. wegen der YAML-Spezifikation.

In Ihrem Beispiel würde das so aussehen:

@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

Wir hatten hier ein ähnliches Problem, und obwohl ich mit Boyens Antwort einverstanden bin, kann es nützlich sein, darauf hinzuweisen, dass der Parameter "uri" die Komponente "path" der URI ignoriert. Dies ist in der Dokumentation nicht klar (oder ich habe es zumindest nicht gefunden), also hoffe ich, dass es anderen hilft.

Angenommen, Sie möchten alle unter/foo eingegangenen Anfragen an http://example.org/bar weiterleiten.

Zum Beispiel:/foo/x/y/z -> http://example.org/bar/x/y/z

Dies funktioniert zum Beispiel wie erwartet:

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

Während dies NICHT wie erwartet funktioniert (ignoriert/bar):

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

Nachfolgend finden Sie die beiden Konfigurationsarten mit vollständiger Konfiguration. Beide Methoden führen zum gleichen Ergebnis.

Konfiguration:

  • das Gateway läuft auf http://localhost:8090
  • ein Basispfad namens /context dient als Einstiegspunkt des Gateways
  • ein Dienst namens my-resources, der auf http://localhost:8091/my-resources ausgeführt wird. Wenn /my-resources ohne Parameter aufgerufen wird, werden alle Ressourcen zurückgegeben. Wenn es mit einem Parameter aufgerufen wird, gibt es die Ressource mit der entsprechenden RID zurück (falls vorhanden).

Das Gateway ist so konfiguriert, dass alle an http://localhost:8090/context/my-resources/ übertragenen Pfadvariablen (möglicherweise keine) an uri http://localhost:8091/my-resources/ weitergeleitet werden.

Methode 1: Verwenden von 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

Methode 2: Java-ähnliche Konfiguration verwenden

@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