#java #spring-boot #kubernetes #spring-webflux #undertow
#java #весенняя загрузка #kubernetes #spring-webflux #undertow
Вопрос:
У меня есть реактивное микросервисное приложение (мы будем называть это микросервисом X) со следующими зависимостями: Spring Boot v2.2.8.RELEASE, SpringWebFlux v5.2.7.RELEASE, Spring v5.2.7.RELEASE, Undertow core 2.0.30.Final, развертывание его в среде k8s. В этой среде существует другой микросервис (мы будем называть этот микросервис Y), отправляющий HTTP-запрос микросервису X; вызов выполняется через службу k8s. Случайно, при вызове Y X возникает следующая ошибка:
журнал микросервиса Y:
<microservice-Y-name>,7,[https-jsse-nio-8080-exec-2],ERROR,....
org.springframework.web.client.ResourceAccessException: I/O error on POST request for "https://hostname.svc.k8s.xxx.com/<microservice-X-name>/api/tasks": Unexpected end of file from server; nested exception is java.net.SocketException: Unexpected end of file from server
at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:748)
at org.springframework.web.client.RestTemplate.exchange(RestTemplate.java:651)
журнал микросервиса X:
SSL read loop detected. This should not happen, please report this to the Undertow developers. Current state SslConduit{state=20, outstandingTasks=0, wrappedData=null, dataToUnwrap=DefaultPooledBuffer{buffer=java.nio.DirectByteBuffer[pos=5461 lim=6026 cap=17408], referenceCount=1}, unwrappedData=null}
28-08-2020 07:43:24.514,microservice-X-name,7,[boundedElastic-3876],ERROR,c.w.o.o.w.d.HttpErrorHandler,,,,,,,,..... : {}
org.springframework.web.server.ServerWebInputException: 400 BAD_REQUEST "Request body is missing: ....
at org.springframework.web.reactive.result.method.annotation.AbstractMessageReaderArgumentResolver.handleMissingBody(AbstractMessageReaderArgumentResolver.java:230)
at org.springframework.web.reactive.result.method.annotation.AbstractMessageReaderArgumentResolver.lambda$readBody$5(AbstractMessageReaderArgumentResolver.java:194)
at reactor.core.publisher.MonoErrorSupplied.subscribe(MonoErrorSupplied.java:70)
Изменение конфигурации микросервиса Y для вызова микросервиса X через k8s ingress вместо через службу k8s, ошибка никогда не возникает.
Есть идеи о том, почему это могло произойти?
Комментарии:
1. и где журналы k8?
2. Ingress работает, потому что он повторяет неудачные запросы. При переходе непосредственно к службе у вас нет этого промежуточного механизма повторных попыток. Пожалуйста, проверьте, так ли это. Если это так, скорее всего, проблема в вашем приложении. Дайте мне знать, если вы подтвердите это.