Spring WebClient слишком долго обрабатывает первый запрос — последующие вызовы выполняются быстроJAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Spring WebClient слишком долго обрабатывает первый запрос — последующие вызовы выполняются быстро

Сообщение Anonymous »

Я использую Spring WebClient в своем Java-приложении для аутентификации с помощью Keycloak.
Проблема, с которой я столкнулся:
Первый запрос веб-клиента занимает много времени (5–9 секунд), но все последующие запросы выполняются очень быстро.
Это замедление происходит постоянно каждый день, когда я пытаюсь получить доступ к приложению в первый раз.
Вот моя конфигурация веб-клиента:

Код: Выделить всё

@Configuration
public class WebClientConfig {
@Bean
public WebClient webClient() {
return WebClient.builder()
.codecs(configurer ->
configurer.defaultCodecs().maxInMemorySize(5 * 1024 * 1024) // 5MB limit
)
.build();
}
}
}
А вот метод входа в систему, выполняющий вызов токена Keycloak:

Код: Выделить всё

@Override
public LoginResponseDto login(LoginRequestDto loginRequestDto) {
LinkedMultiValueMap formData = getLoginFormDataRequest(loginRequestDto);
String uri = UriComponentsBuilder.fromUriString(keycloakProperties.serverUrl())
.pathSegment("realms", keycloakProperties.realm(), "protocol", "openid-connect", "token")
.toUriString();

try {
String response = webClient.post()
.uri(uri)
.contentType(MediaType.APPLICATION_FORM_URLENCODED)
.bodyValue(formData)
.retrieve()
.bodyToMono(String.class)
.block();

JsonNode jsonNode = objectMapper.readTree(response);
return new LoginResponseDto(
jsonNode.get("token_type").asText(),
jsonNode.get("access_token").asText(),
jsonNode.get("refresh_token").asText(),
jsonNode.get("expires_in").asText(),
jsonNode.get("refresh_expires_in").asText()
);
} catch (WebClientResponseException e) {
log.error("Error in Keycloak login: {}", e.getMessage(), e);
if (e.getStatusCode() == HttpStatus.UNAUTHORIZED) {
throw new InvalidCredentialsException("Invalid username or password", projectUtil.getCurrentUtcTimestamp());
}
throw new KeycloakServiceException("Invalid password", projectUtil.getCurrentUtcTimestamp());
} catch (JsonProcessingException e) {
log.error("JsonProcessing error in Keycloak login: {}", e.getMessage(), e);
throw new KeycloakServiceException("JSON processing error: login", projectUtil.getCurrentUtcTimestamp());
}
}
}
Что я заметил:
  • Это происходит только для самого первого запроса после запуска.
  • Может быть связано с инициализацией пула соединений, поиском DNS, подтверждением SSL или настройкой веб-клиента.
  • Использование block() — но здесь мне нужна блокировка, поскольку этот метод должен возвращать результат. синхронно.
Почему первый запрос веб-клиента занимает значительно больше времени, чем последующие, и как я могу предотвратить или уменьшить эту задержку при запуске?
Любая информация, советы по профилированию или улучшения конфигурации будут очень полезны.

Подробнее здесь: https://stackoverflow.com/questions/798 ... uent-calls
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»