3

我需要 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"))
4

2 回答 2

4

你可以这样做

.route(r -> r.host("sip")
            .or()
            .path("/sip/**")
            .filters(f -> f.rewritePath("^/sip", ""))
            .uri("http://sip:8080")
于 2019-01-08T13:14:38.417 回答
0

删除行为是正常的,您可以为 /calls 使用另一个路由,并且对于该路由,您不添加删除前缀子句。

官方文档:https ://cloud.spring.io/spring-cloud-gateway/reference/html/#the-stripprefix-gatewayfilter-factory

于 2021-10-28T08:16:11.103 回答