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
ここにあるドキュメントで指定されているように、パスフィルターでrewritePath機能を使用できます。
関連部品:
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();
}
ここで同様の問題を実行していましたが、ボイエンの応答には同意しますが、 "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}
完全なセットアップを備えた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/
に転送されるように構成されます。
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
@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();
}