• Feed
  • Explore
  • Ranking
/
/
    Open Feign

    OpenFeign vs WebClient 성능 및 설정 비교

    OpenFeign vs WebClient 성능비교
    Spring CloudOpenFeignWebclient성능비교부하테스트
    박
    박상준
    2025.11.23
    ·
    5 min read

    0. 전제

    • 테스트 시나리오

      • 로컬 ↔ 외부 API 호출

      • 0 ~ 500 VUS까지 30초간 점진적 증가 (100, 300, 500 단계)

      • 각 단계별(100, 300, 500 VUS) 30초간 steady call 유지

    • 환경

      • 네트워크: 로컬(한국) ↔ 일본(VPN) ↔ 한국(server) 호출

      • 하드웨어: Windows 11, AMD Ryzen 7 5800X (8-Core / 16-Thread), 메모리 64GB

      • 소프트웨어: Spring Boot 3.5.7

      • JVM 설정: Heap max 16GB, min 1GB

      • JVM 스레드풀: 초기 200으로 설정, 이후 400까지 확장하여 테스트 진행

    1. 기본 동작 차이

    구분

    OpenFeign

    WebClient

    비고

    I/O 모델

    Blocking I/O (동기)

    Non-blocking I/O (비동기)

    스레드 점유 방식 차이

    HTTP Client

    JDK HttpURLConnection (기본)

    OkHttpClient / Apache HttpClient 5 교체 가능

    Reactor Netty (기본)

    OpenFeign은 클라이언트 교체로 성능 개선 가능

    Connection Pool

    기본 : 없음

    OkHttpClient / Apache HttpClient 5 적용 시 지원

    기본 지원

    연결 재사용성 차이

    2. 성능 지표 비교 (Stage 6 기준)

    지표

    OpenFeign (기본)

    WebClient

    설명

    TPS (처리량)

    약 217 (포화 상태)

    약 985 (선형 증가)

    WebClient가 4.5배 이상 처리

    Mean RES

    4,409 ms

    102 ms

    OpenFeign은 지연 폭증

    P95 RES

    7,081 ms

    74.4 ms

    WebClient는 안정적

    3. 설정 및 튜닝 진행

    • Apache HttpClient 5 사용

      • 클래스패스에 HttpClient 5 추가 → 자동 적용

      • 필요 시 비활성화: spring.cloud.openfeign.httpclient.hc5.enabled=false

      • Bean 등록: CloseableHttpClient 직접 정의하여 커넥션 풀 크기 조절 (setMaxConnTotal, setMaxConnPerRoute)

    ※ Spring Cloud OpenFeign 4부터는 Apache HttpClient 4 지원 중단 → 반드시 HttpClient 5 사용

    • Apache Tomcat 커넥션풀 증대

    server:
      tomcat:
        threads:
          max: 400 # Tomcat Thread 400개 (Feign Connection Pool과 1:1 매칭)
        accept-count: 100 # 대기 큐 크기
    • Apache HttpClient 5 커넥션 풀 설정 추가

    /**
     * Apache HttpClient 5 커넥션 풀 매니저 설정
     * - 전체 최대 커넥션: 400
     * - 라우트별 최대 커넥션: 100
     */
    @Bean
    public PoolingHttpClientConnectionManager poolingHttpClientConnectionManager() {
        return PoolingHttpClientConnectionManagerBuilder.create()
                .setMaxConnTotal(400) // 전체 최대 커넥션 수
                .setMaxConnPerRoute(100) // 라우트별 최대 커넥션 수
                .build();
    }
    
    /**
     * Apache HttpClient 5 빈 등록
     * 커넥션 풀 매니저를 사용하여 성능 최적화
     */
    @Bean
    public HttpClient httpClient(PoolingHttpClientConnectionManager connectionManager) {
        return HttpClients.custom()
                .setConnectionManager(connectionManager)
                .evictIdleConnections(TimeValue.of(java.time.Duration.ofSeconds(30)))
                .evictExpiredConnections()
                .build();
    }

    4. 부하 테스트 결과

    단계

    OpenFeign (기본)

    OpenFeign (튜닝 후)

    WebClient

    Stage 2 (100 VU)

    TPS 77.8 / RES 366ms

    TPS 153 / RES 331ms

    TPS 91.7 / RES 140ms

    Stage 4 (300 VU)

    TPS 180 / RES 2,422ms

    TPS 354 / RES 2,448ms

    TPS 546 / RES 93.1ms

    Stage 6 (500 VU)

    TPS 217 / RES 4,409ms

    TPS 394 / RES 4,972ms

    TPS 985 / RES 102ms

    5. 결론

    • 소규모 트래픽(100명 수준): OpenFeign 튜닝 시 WebClient와 유사한 성능 확보 가능

    • 중대규모 트래픽(300명 이상): WebClient가 압도적으로 안정적이며 확장성 우수

    • OpenFeign 튜닝: OkHttpClient 또는 Apache HttpClient 5 적용으로 개선되지만 Blocking I/O 특성상 한계 존재

    • JVM 스레드풀 영향: 초기 200에서 400까지 확장했으나, OpenFeign은 스레드 점유 특성상 근본적 한계로 성능 개선 폭이 제한적

    • 최종 권고: 대규모 트래픽 환경에서는 WebClient 사용이 적합







    - 컬렉션 아티클