#java #spring #spring-boot #spring-webflux #spring-webclient
#java #spring #spring-boot #spring-webflux #spring-webclient
Вопрос:
Я создал синтетическое приложение с использованием Spring Reactive framework для изучения механики кэширования, которая предлагается с помощью Webflux. Я заметил, что когда я использую a Webclient
, который обращается к стороннему URL, метод, который его использует, вызывается дважды, тогда как a WebClient
, который обращается к моей собственной конечной точке, вызывается только один раз за запрос, как и ожидалось.
Интересно, почему это так?
Вот мой код для абстракции страницы, когда a webClient
связан с URL-адресом локального хоста, метод getBody()
вызывается только один раз для каждого запроса. Но когда WebClient связан с https://other.size , этот метод вызывается дважды, поэтому я вижу log.info сообщения два раза:
public class Page {
private Mono<String> res;
public Page(WebClient webClient, String url) {
res = webClient.get()
.uri(url)
.retrieve()
.bodyToMono(String.class)
.cache();
}
public Mono<String> getBody() {
log.info("getting data");
return res;
}
}
Вот ссылка на полный проект: https://github.com/RassulYunussov/webluxmistery
Комментарии:
1. Я проверил ваш проект, запустил ваше приложение и вызвал обе конечные точки. Строка журнала «получение данных» регистрировалась только один раз для каждого вызова API для обеих конечных точек. Строка журнала регистрируется при каждом вызове api, даже при тех, которые должны быть кэшированы, но это ожидаемое поведение, основанное на существующем коде.
2. Звучит странно, поэтому я дважды проверил проект и получил тот же результат — двойной вызов метода для внешнего ресурса. В качестве доказательства — я записал видео об этом 🙂 youtu.be/aNPhRAzJypQ Что касается версии Java: версия openjdk «14.0.1» 2020-04-14 Среда выполнения OpenJDK AdoptOpenJDK (сборка 14.0.1 7) 64-разрядная серверная виртуальная машина OpenJDK AdoptOpenJDK (сборка 14.0.1 7, смешанный режим, совместное использование)
Ответ №1:
Спасибо за видео. Это было действительно полезно.
Итак, если вы нажмете на /tengri
конечную точку из браузера, вы получите журналы дважды, и я могу подтвердить, что вижу такое же поведение на своей машине.
Однако, если вы нажмете /tengri
using curl
, вы получите строку журнала только один раз.
Кроме того, просматривая сетевой трафик в браузере, я вижу, что 2-й вызов api выполняется для /tengri
конечной точки.
Есть ли какая-то дополнительная логика, которая произойдет, когда браузер отобразит html, который выполнит 2-й вызов /tengri
?
Комментарии:
1. Я просто не беспокоился о возможных побочных эффектах загружаемого содержимого. Возможно, эта страница вызывает какой-либо JS для выполнения второго запроса. curl — лучший способ протестировать все. Спасибо!