feign client IOException: unexpected end of stream on Address
스프링에서 feign client를 사용중 로그에 다음과 같은 오류 메시지가 떴다.
feign 사용 중에 간헐적으로 unexpected end of stream on [주소] 가 나왔다.
request 를 요청받는 서버 설정마다 다른 것 같다.
해당 원인은
요청받는 서버의 keep_alive timeout 이 feign 로 요청하는 클라이언트 서버보다 timeout 시간이 짧기 떄문이다.
다시 말하면 클라이언트 서버가 timeout 이 받아주는 서버 timout 보다 길다.
나의 경우는 feign 로 요청하고 나서 프로세스가 조금 긴 경우에 다음과 같은 현상이 나왔다.
클라이언트가 서버에서 데이터를 받고나서 서버의 keep_alive timeout 시간이 지났음에도 클라이언트에서는 프로세스가 끝나지 않기 때문에 발생한다.
이런 경우 간단하게 해결 방법은 okhttp request 객체에
addHeader("Connection","close")
만 추가해주면 됐다.
Request request = new Request.Builder()
.url(requestUrl)
.addHeader("Connection", "close")
.get()
.build();
아니면 아래와 같이 빈을 등록하여,
public class ConnectionHeaderFeignClientConfig {
@Bean
public RequestInterceptor requestInterceptor() {
return template -> template.header(HttpHeaders.CONNECTION, "close");
}
}
feign client 인터페이스에 추가하여 준다.
@FeignClient(name = "test-api", url = "${feign.client.config.test-api.url}", configuration = {ConnectionHeaderFeignClientConfig.class})
public interface TestApiClient {
@GetMapping("/getAAA")
Object getAAA(@RequestParam("param") String param);
}
나의 경우 서버에서 데이터를 받아와서 처리하는데 많은 로직이 있어 처리시간이 짧지 않았고, 프로세스를 처리 하는 도중 요청받는 서버의 keep_alive timeout 시간이 지나 다음 오류를 뱉었다.
데이터를 받아 온 후라 다음 오류가 나도 상관없었지만, 오류를 모니터링 할때 보기 안좋기 때문에 해결해 주었다.
예를 들어 keep_alive timeout 이 긴 서버의 경우는 해당 오류가 나지 않을 것이다.
참고자료
'Spring Framework > Spring Boot 오류' 카테고리의 다른 글
Spring boot 2.0 Configuration Binding (0) | 2022.02.15 |
---|---|
[스프링 부트 오류] No message available (0) | 2021.04.11 |
[스프링 부트 오류] java.lang.NullPointerException(lombok 체크) (0) | 2021.04.10 |
[스프링 부트 오류] [WARNING] The requested profile "pom.xml" could not be activated because it does not exist. (0) | 2021.04.10 |
[스프링 부트 오류] spring boot Path with "WEB-INF" or "META-INF" (0) | 2021.04.10 |
[스프링 부트 오류] Web server failed to start. Port 8291 was already in use. (0) | 2021.04.10 |
[스프링 부트 오류] cvc-complex-type.4: Attribute 'version' must appear on element 'web-app'. (0) | 2021.04.10 |
[스프링 부트 오류] 오류: 기본 클래스 net.bytebuddy.agent.Attacher을(를) 찾거나 로드할 수 없습니다. (0) | 2021.04.10 |