Мне нужно создать обратный прокси-сервер, который принимает входящий запрос и на основе содержимого тела запроса направляет запрос на определенный 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 предупреждает меня о блокирующем вызове, что я очень ценю.
Любая помощь приветствуется. Всем спасибо!