새소식

반응형
Spring/SpringCloudGateway

[SpringCloudGateway] HttpClientCustomizer&RouteDefinitionLocator

  • -
반응형

HttpClientCustomizer

Spring Cloud Gateway의 HttpClientCustomizer 인터페이스는 gateway에서 사용하는 HTTP 클라이언트를 커스터마이징 할 수 있게 해 준다

Spring Cloud Gateway에서는 내부적으로 reactor.netty.http.client.HttpClient를 사용하여 백엔드 서비스로 요청을 보낸다.

HttpClient를 커스터마이징하고 싶을 때 사용하는 것이 바로 HttpClientCustomizer 인터페이스이다.

  • 하나의 메서드인 customize를 제공하며, 이 메서드는 HttpClient 객체를 매개변수로 받아 수정된 버전을 반환한다.
  • 타임아웃 설정, 커스텀 헤더 추가, 특정 기능 활성화 등 HTTP 클라이언트에 대해 특별한 설정이나 동작을 구성해야 하는 상황에서 유용하다
  • 인터페이스를 구현함으로써, 여러분의 요구 사항에 맞는 맞춤 구현체를 제공할 수 있다
public class MyHttpClientCustomizer implements HttpClientCustomizer {

    @Override
    public HttpClient customize(HttpClient httpClient) {
        // Customize the HTTP client here
        return httpClient.tcpConfiguration(tcpClient -> {
            // Set the connect timeout to 5 seconds
            tcpClient.option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 5000);
            // Set the read timeout to 10 seconds
            tcpClient.option(ChannelOption.SO_TIMEOUT, 10000);
            return tcpClient;
        });
    }
}

@Configuration
public class GatewayConfiguration {

    @Bean
    public HttpClientCustomizer myHttpClientCustomizer() {
        return new MyHttpClientCustomizer();
    }
}

 

Configuration

Spring Cloud Gateway의 라우팅 설정은 여러 개의 RouteDefinitionLocator 인스턴스에 의해 동작한다.

-> 라우팅 설정(어떤 경로로 요청을 보낼지 등)을 정의하는 주체가 RouteDefinitionLocator

 

RouteDefinitionLocator 인터페이스 정의 예시

public interface RouteDefinitionLocator {
	Flux<RouteDefinition> getRouteDefinitions();
}

 

기본적으로 PropertiesRouteDefinitionLocator는 Spring Boot의 @ConfigurationProperties 기능을 통해 설정값을 읽어 들인다.

-> application.yml에 정의한 라우팅 정보가 PropertiesRouteDefinitionLocator 클래스를 통해 적용된다.

      routes:
      - id: setstatus_route
        uri: https://example.org
        filters:
        - name: SetStatus
          args:
            status: 401
      - id: setstatusshortcut_route
        uri: https://example.org
        filters:
        - SetStatus=401

 

  • 위 예시 : 이름이 지정된 인자(named arguments)
  • 아래 예시 : 위치 기반 인자(positional arguments), 축약된 형식

일부 경우에는 application.yml 설정만으로 충분하지만,

운영 환경에서는 데이터베이스 같은 외부 소스에서 설정을 불러오는 것이 더 유리할 수 있다.
예: 라우팅 경로가 자주 바뀌는 경우 DB에서 불러오면 동적으로 처리 가능

 

향후 버전에서는 Redis, MongoDB, Cassandra 등의 Spring Data 기반 저장소를 사용하는 RouteDefinitionLocator 구현체가 제공될 예정이라 한다. 

반응형
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.