클라이언트사이드 로드밸런싱(Client-Side Load Balancing):
Gateway가 Spring Cloud LoadBalancer를 통해 서비스 디스커버리(Eureka 등)에서 가져온 인스턴스 목록으로 요청 분배.
기본 알고리즘은 라운드 로빈이며, 커스텀 설정 가능.
요청 URI 예: lb://order-service를 실제 인스턴스 주소로 변환.
로드밸런싱 과정:
1. 서비스 디스커버리에서 인스턴스 조회.
2. 로드밸런싱 알고리즘으로 적절한 인스턴스 선택.
3. 선택된 인스턴스로 요청 전달 후 응답 반환.
Ordered 인터페이스를 구현하고 getOrder() 메서드를 통해 순서를 정의하는 이유는 Spring Cloud Gateway에서 필터의 실행 순서를 제어하기 위해서다.
주요 포인트:
Ordered 인터페이스:
필터 실행 순서를 결정한다.
getOrder()에서 반환하는 값에 따라 실행 순서가 결정된다.
낮은 값일수록 우선순위가 높고 먼저 실행되며, 높은 값은 나중에 실행된다.
CustomPostFilter에서의 getOrder():
Ordered.LOWEST_PRECEDENCE는 가장 낮은 우선순위로, 숫자 값으로 Integer.MAX_VALUE에 해당한다.
따라서 이 필터는 다른 필터들 뒤에 마지막으로 실행된다.
필터 체인:
chain.filter(exchange)는 후속 필터로 요청을 전달한다.
.then(Mono.fromRunnable(...))는 후속 작업을 실행한다.
결론:
Ordered를 사용하면 필터 실행 순서를 명확하게 관리할 수 있고, 응답 처리와 관련된 Post 필터는 보통 마지막에 실행되므로 Ordered.LOWEST_PRECEDENCE로 설정하는 것이 일반적이다.
데이터를 비동기적으로 처리하고, 변화에 실시간으로 반응하는 프로그래밍 패러다임이다. 비동기 데이터 스트림을 다루고, 이벤트 기반 구조를 통해 높은 성능과 확장성을 제공한다. 주로 대규모 시스템, 비동기 작업, 사용자 인터페이스 등에 사용된다.
비동기 데이터 스트림: 데이터가 스트림 형태로 처리되며, 데이터가 생성될 때마다 실시간으로 이를 구독하고 반응한다. (예: DB, 네트워크 요청, 사용자 입력)
선언형 코드: 데이터와 이벤트 흐름을 선언적으로 정의하여 코드 가독성을 높인다.
이벤트 기반: 시스템 상태 변화나 외부 입력 이벤트에 반응적으로 동작한다.
Backpressure (압력 조절): 생산자가 소비자보다 빠르게 데이터를 생성할 때, 소비자가 이를 제어할 수 있도록 돕는다.
Reactive Streams는 Reactive 프로그래밍의 표준 사양으로, 주요 구성 요소는 다음과 같다:
Publisher: 데이터를 제공하는 주체.
Subscriber: 데이터를 소비하는 주체.
Subscription: Publisher와 Subscriber 간의 연결 상태를 관리.
Processor: Publisher와 Subscriber 역할을 동시에 수행.
Reactive Streams의 공식 정의는 Reactive Streams GitHub 저장소에 공개되어 있다. 사양의 핵심 요소는 다음과 같다:
비동기 스트림 처리: 데이터를 스트림 형태로 처리하며, 블로킹 없이 소비한다.
Backpressure 처리: 소비자가 데이터를 처리할 수 있는 속도로 요청하는 메커니즘을 제공한다.
인터페이스 정의: Java 및 JVM 기반 언어에서 사용할 수 있는 표준 인터페이스가 제공된다:
Publisher
Subscriber
Subscription
Processor
spring.main.web-application-type: reactive를 통해 스프링 애플리케이션이 WebFlux 기반의 논블로킹 애플리케이션으로 설정됨.
Netty가 기본 서버로 사용.