Маршрутизация Spring Cloud Gateway на основе содержимого тела запроса

Мне нужно создать обратный прокси-сервер, который принимает входящий запрос и на основе содержимого тела запроса направляет запрос на определенный URI.

Это микрослужба маршрутизации, которая действует как обратный прокси-сервер и выполняет маршрутизацию на основе некоторой информации из каждого тела запроса. Это означает, что для каждого запроса мне нужно анализировать тело запроса и получать поле «имя пользователя», а затем устанавливать соединение JDBC для получения дополнительной информации из базы данных. Основываясь на этой информации в базе данных, он, наконец, перенаправит запрос на правильный URI.

Из того, что есть сейчас, у меня есть 2 метода блокировки. Первый - это синтаксический анализ тела запроса, второй - JDBC-соединение с базой данных. Я понимаю, что не следует помещать какие-либо блокирующие вызовы в фильтр шлюза. Я просто не знаю, что мне делать в этом случае. Я мог бы запустить обе операции async, но, в конце концов, мне все еще нужна информация из базы данных для выполнения маршрутизации.

    @Bean
    public RouteLocator apiLocator(RouteLocatorBuilder builder, XmlMapper xmlMapper) {
        return builder.routes()
            .route(r -> r
                .path("/test")
                .and()
                .readBody(String.class, s -> true)  // Read the request body, data will be cached as cachedRequestBodyObject
                .filters(f -> f.filter(new GatewayFilter() {
                    @Override
                    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
                        try {
                            // The following method is blocking and should not be put here
                            xmlMapper.readValue((String) exchange.getAttribute("cachedRequestBodyObject"), Map.class);
                        } catch (Exception e) {
                            //TODO
                        }
                        return chain.filter(exchange);
                    }
                }))
                .uri("http://localhost:8080"))
            .build();
    }

В приведенном выше примере используется только блокирующий синтаксический анализ, поскольку тело моего запроса основано на XML. Моя IDE предупреждает меня о блокирующем вызове, что я очень ценю.

Любая помощь приветствуется. Всем спасибо!


person AttitudeL    schedule 03.08.2019    source источник


Ответы (1)


После некоторого исследования, Mono.fromCallable кажется подходящим. Затем я задал тот же вопрос прямо в репозитории github, оказалось, что использование сервлетного приложения может быть лучше. Для всех, кому интересно узнать, что я придумал, взгляните здесь https://github.com/spring-cloud/spring-cloud-gateway/issues/1229

person AttitudeL    schedule 07.08.2019
comment
Привет, этот подход работает? У меня тоже есть аналогичная проблема, когда мне нужно перенаправить на другой URL-адрес на основе одного элемента в теле входящего запроса. Буду очень признателен, если бы вы могли предоставить полный пример. заранее спасибо. - person Rookie007; 03.03.2020