我需要 Spring Cloud Gateway 根据Host
标头或路径前缀将请求路由到微服务。在任何情况下,路径前缀都必须从路径中删除,但前提是它已设置。
我想出了以下代码,我认为只有“sip”是前缀:
public RouteLocator customRouteLocator(RouteLocatorBuilder builder) {
return builder.routes()
.route(r -> r.host("sip")
.or()
.path("/sip/**")
.filters(f -> f.stripPrefix(1))
.uri("http://sip:8080")
)
.build();
}
问题是 Spring 会删除路径的第一段,即使它不是前缀。
例如,带有路径的请求/sip/calls
成功,但/calls
设置了 Host 标头的请求不成功,因为 Spring 会考虑/calls
前缀并将其删除,从而导致路径为空。/calls/calls
带有Host
标头的路径成功,因为 Spring 仅删除了第一个calls
路径段。
如何将主机和路径一起使用,仅当前缀与定义的值匹配时才删除它?
ps我在考虑每个服务有两条路线,但看起来不太好,尽管它实现了目标:
.route(r -> r.header("Host", "form").uri("http://form:8080"))
.route(r -> r.path("/form/**")
.filters(f -> f.stripPrefix(1))
.uri("http://form:8080"))