feign client IOException: unexpected end of stream on Address

2022. 7. 20. 15:16 Spring Framework/Spring Boot 오류

스프링에서 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 이 긴 서버의 경우는 해당 오류가 나지 않을 것이다.

 

참고자료

github.com/square/okhttp/issues/2738

https://juntcom.tistory.com/105