Проблема, с которой я столкнулся:
Первый запрос веб-клиента занимает много времени (5–9 секунд), но все последующие запросы выполняются очень быстро.
Это замедление происходит постоянно каждый день, когда я пытаюсь получить доступ к приложению в первый раз.
Вот моя конфигурация веб-клиента:
Код: Выделить всё
@Configuration
public class WebClientConfig {
@Bean
public WebClient webClient() {
return WebClient.builder()
.codecs(configurer ->
configurer.defaultCodecs().maxInMemorySize(5 * 1024 * 1024) // 5MB limit
)
.build();
}
}
}
Код: Выделить всё
@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
Мобильная версия