web-dev-qa-db-ja.com

Spring Cloud Gateway-URLのサブ部分全体のプロキシ/転送

Spring Cloud Gateway 2.0.0.M6を使用して、単純なゲートウェイをテストしています。 **正規表現でURLを別のURLに転送したいだけです

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

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

これまでのところ、次のように書きましたが、転送先は 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();
}

上記のコードを修正してこの動作を有効にするにはどうすればよいですか?

[〜#〜] edit [〜#〜]

私は以下の応答に基づいて以下を試しました

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

そして、GET http:// localhost:4177/gb-integration/sbl/api/sbl/income / を試してみました http:// localhost:4178/gb-samtykke- integration/api/sbl/income / 戻りましたが、機能しませんでした。

出力は言う:

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
10
Shervin Asgari

ここにあるドキュメントで指定されているように、パスフィルターでrewritePath機能を使用できます。

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

関連部品:

5.12 RewritePath GatewayFilterファクトリ

RewritePath GatewayFilter Factoryは、パス正規表現パラメーターと置換パラメーターを取ります。これは、Java正規表現を使用して、要求パスを書き換える柔軟な方法です。

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

/ foo/barのリクエストパスの場合、これはダウンストリームリクエストを行う前に/ barにパスを設定します。 YAML仕様のため、$が$に置き換えられていることに注意してください。

あなたの例では、それは次のようになります:

@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();
}
16
Boyen

ここで同様の問題を実行していましたが、ボイエンの応答には同意しますが、 "uri"パラメーターがURIの "path"コンポーネントを無視することを指摘しておくと便利です。これはドキュメントでは明確ではありません(または、少なくとも私はそれを見つけていません)。

/ fooで受信したすべてのリクエストを http://example.org/bar にリダイレクトするとします。

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

たとえば、これは期待どおりに機能します:

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

これは期待どおりに機能しませんが(/ barは無視されます):

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

完全なセットアップを備えた2種類の構成を以下に示します。どちらの方法でも同じ結果が得られます。

セットアップ:

  • ゲートウェイはhttp://localhost:8090で実行されています
  • /contextというベースパスがゲートウェイのエントリポイントとして機能します
  • my-resourcesで実行されるhttp://localhost:8091/my-resourcesというサービス。 /my-resourcesがパラメーターなしで呼び出されると、すべてのリソースが返されます。パラメーターを指定して呼び出されると、対応するRID(存在する場合)とともにリソースを返します

ゲートウェイは、http://localhost:8090/context/my-resources/に送信されるすべてのパス変数(おそらくなし)がuri http://localhost:8091/my-resources/に転送されるように構成されます。

方法1: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

方法2:Java like 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();
}
1
avi.elkharrat