Spring Cloud Gateway - префикс полосы, если существует
Мне нужен 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"))
2 ответа
Ты можешь сделать это
.route(r -> r.host("sip")
.or()
.path("/sip/**")
.filters(f -> f.rewritePath("^/sip", ""))
.uri("http://sip:8080")
Поведение удаления является нормальным, вы можете использовать другой маршрут для / calls, и для этого маршрута вы не добавляете предложение удаления префикса.
Официальный документ: https://cloud.spring.io/spring-cloud-gateway/reference/html/#the-stripprefix-gatewayfilter-factory