
마이크로서비스 아키텍처(MSA)에서 서비스 간 통신의 성능과 안정성은 시스템의 전체적인 품질을 결정짓는 중요한 요소입니다.
Spring Cloud에서 제공하는 Feign 클라이언트는 선언적 HTTP 통신을 쉽게 구현할 수 있는 강력한 도구지만, 기본 HTTP 클라이언트인 HttpURLConnection을 사용할 경우 성능 저하가 발생할 수 있습니다.
이번 글에서는 HttpURLConnection의 주요 문제점을 분석하고, Apache HttpComponents 5를 대안으로 적용했을 때의 성능 개선 효과를 비교해보겠습니다.
| 구분 | Java HttpURLConnection | Apache HttpComponents 5 (DEFAULT) 1. max-connections-per-route: 2 2. max-connections: 20 | Apache HttpComponents 5 1. max-connections-per-route: 100 2. max-connections: 100 |
|---|---|---|---|
| http_req_duration | 394.44ms, 20.85s, 65.61ms, 25.18ms, 237.75ms (평균) | 41.92ms, 353.00ms, 32.53ms, 11.34ms, 62.89ms (평균) | 31.74ms, 378.38ms, 24.71ms, 8.81ms, 47.05ms (평균) |
| 응답 시간의 변동성 | 응답 시간의 변동성이 매우 큼 (20ms에서 394ms까지 큰 편차) | 첫 번째보다는 안정적이지만 여전히 편차 존재 (11ms에서 353ms) | 전반적으로 가장 안정적인 패턴 |
| 그래프 패턴 양상 | 그래프가 매우 불안정하며 스파이크가 자주 발생 | Blocked time이 16.18ms로 connection pool 대기 시간 발생 | Blocked time이 50.67ms로 증가했 지만, 전체적인 처리량은 더 안정적 |
![]() | ![]() | ![]() | |
![]() | ![]() | ![]() |
| 구분 | Java HttpURLConnection | Apache HttpComponents 5 1. max-connections-per-route: 100 2. max-connections: 100 |
|---|---|---|
| CPU 사용률 | CPU 스파이크가 높고(최대 50-60%), 변동이 심함 | CPU 사용이 더 안정적(약 20% 수준 유지)하고 예측 가능한 패턴 |
| Heap 메모리 | 크기: 1,358,954,528 B (약 1.3GB) GC 활동이 더 빈번함 | 크기: 415,236,128 B (약 415MB) GC 활동이 덜 빈번함 |
| 스레드 | Live: 26 (peak: 204) Daemon: 23 | Live: 47 (peak: 140) Daemon: 42 |
![]() | ![]() |
| 항목 | HttpURLConnection |
|---|---|
| 커넥션 생성 오버헤드 | TCP 3-way Handshake: 2-5ms, SSL/TLS Handshake: 5-15ms, 총 연결 시간: 7-20ms |
| 평균 응답 시간 | 394.44ms |
| 최대 응답 시간 | 20.85s |
| 응답 시간 변동성 | 매우 높음 |
@Configuration
public class HttpClientConfig {
@Bean
public HttpClient5FeignConfiguration httpClient5Config() {
return new HttpClient5FeignConfiguration(
maxConnTotal = 100,
maxConnPerRoute = 100,
timeToLive = Duration.ofMinutes(5)
);
}
}
spring:
cloud:
openfeign:
httpclient:
hc5:
enabled: true
max-connections: 100
max-connections-per-route: 100
connection-timeout: 2000
connection-timer-repeat: 3000
| 항목 | Apache HttpComponents 5 |
|---|---|
| 평균 응답 시간 | 31.74ms (87% 감소) |
| 최대 응답 시간 | 378.38ms (98% 감소) |
| 응답 시간 변동성 | 안정적 |
| CPU 사용률 | 20% 수준으로 감소 |
| 메모리 사용량 | 415MB (69% 감소) |
| GC 활동 | 빈도 감소 |
feign:
client:
config:
default:
connectTimeout: 2000
readTimeout: 3000
loggerLevel: BASIC
Apache HttpComponents 5로 전환하면 다음과 같은 장점을 얻을 수 있다라고 합니다..
MSA 환경에서 높은 부하를 처리하는 시스템을 운영할 경우, Feign 클라이언트의 기본 HTTP 클라이언트인 HttpURLConnection을 그대로 사용하기보다는 Apache HttpComponents 5를 적용하는 것을 권장한다고 합니다.
이번 분석을 통해 Feign 클라이언트의 기본 HTTP 클라이언트인 HttpURLConnection이 성능과 안정성 측면에서 여러 한계를 가지고 있음을 확인할 수 있었습니다.
특히, 비효율적인 커넥션 관리, 동시성 제어 부족, 높은 리소스 사용률이 주요 문제점으로 작용하며, 대량의 요청을 처리하는 MSA 환경에서는 성능 저하로 이어질 가능성이 높다고 생각이듭니다.
반면, Apache HttpComponents 5를 적용했을 때 평균 응답 시간이 87% 감소하고, 최대 응답 시간이 98% 감소하는 등, 성능 향상이 상당히 뚜렷하게 나타났습니다.
이는 커넥션 풀을 활용한 효율적인 리소스 관리와 최적화된 요청 처리 방식 덕분이며, 높은 트래픽을 처리하는 마이크로서비스 환경에서 특히 유용할 것으로 보입니다.
이 글을 통해 Feign 클라이언트의 HTTP 클라이언트 선택이 시스템 성능에 큰 영향을 미친다는 점을 다시 한번 깨달았습니다.
단순히 기본 설정을 유지하기보다는, 시스템의 특성과 트래픽 패턴을 고려한 최적화 전략을 적용하는 것이 중요하며, 이를 위해 다양한 HTTP 클라이언트를 비교하고 적절한 튜닝을 수행하는 과정이 필수적임을 느꼈습니다.
앞으로 MSA 환경을 구축하거나 성능 최적화를 고민할 때, Apache HttpComponents 5와 같은 효율적인 HTTP 클라이언트를 적극 활용해야겠다는 생각이 들었습니다.
추가적으로, 모니터링을 통해 성능 개선 효과를 지속적으로 분석하고, 튜닝 포인트를 찾아 최적의 환경을 유지하는 노력도 중요할 것이라 생각됩니다.