토리맘의 한글라이즈 프로젝트 logo 토리맘의 한글라이즈 프로젝트

스프링 클라우드 게이트웨이 공식 레퍼런스를 한글로 번역한 문서입니다.

전체 목차는 여기에 있습니다.

목차


모든 route에 사용할 Http 타임아웃(response/connect)을 설정하고, 특정 route마다 설정을 재정의할 수 있다.


12.1. Global timeouts

전역 http 타임아웃을 설정하려면:
connect-timeout은 밀리세컨드로 지정해야 한다.
response-timeout은 java.time.Duration으로 지정해야 한다.

global http timeouts example

spring:
  cloud:
    gateway:
      httpclient:
        connect-timeout: 1000
        response-timeout: 5s

12.2. Per-route timeouts

route 단위 타임아웃을 설정하려면:
connect-timeout은 밀리세컨드로 지정해야 한다.
response-timeout은 밀리세컨드로 지정해야 한다.

per-route http timeouts configuration via configuration

      - id: per_route_timeouts
        uri: https://example.org
        predicates:
          - name: Path
            args:
              pattern: /delay/{timeout}
        metadata:
          response-timeout: 200
          connect-timeout: 200

per-route timeouts configuration using Java DSL

import static org.springframework.cloud.gateway.support.RouteMetadataUtils.CONNECT_TIMEOUT_ATTR;
import static org.springframework.cloud.gateway.support.RouteMetadataUtils.RESPONSE_TIMEOUT_ATTR;

      @Bean
      public RouteLocator customRouteLocator(RouteLocatorBuilder routeBuilder){
         return routeBuilder.routes()
               .route("test1", r -> {
                  return r.host("*.somehost.org").and().path("/somepath")
                        .filters(f -> f.addRequestHeader("header1", "header-value-1"))
                        .metadata(RESPONSE_TIMEOUT_ATTR, 200)
                        .metadata(CONNECT_TIMEOUT_ATTR, 200)
                        .uri("http://someuri");
               })
               .build();
      }

12.3. Fluent Java Routes API

RouteLocatorBuilder 빈은 자바 설정을 간소화할 수 있는 fluent API를 제공한다. 다음은 사용 방법을 보여주는 예시다:

Example 66. GatewaySampleApplication.java

// static imports from GatewayFilters and RoutePredicates
@Bean
public RouteLocator customRouteLocator(RouteLocatorBuilder builder, ThrottleGatewayFilterFactory throttle) {
    return builder.routes()
            .route(r -> r.host("**.abc.org").and().path("/image/png")
                .filters(f ->
                        f.addResponseHeader("X-TestHeader", "foobar"))
                .uri("http://httpbin.org:80")
            )
            .route(r -> r.path("/image/webp")
                .filters(f ->
                        f.addResponseHeader("X-AnotherHeader", "baz"))
                .metadata("key", "value")
                .uri("http://httpbin.org:80")
            )
            .route(r -> r.order(-1)
                .host("**.throttle.org").and().path("/get")
                .filters(f -> f.filter(throttle.apply(1, 1, 10, TimeUnit.SECONDS)))
                .metadata("key", "value")
                .uri("http://httpbin.org:80")
            )
            .build();
}

게다가 이 스타일에선 predicate를 더 다양하게 커스텀해 정의할 수 있다. RouteDefinitionLocator 빈으로 정의한 predicate는 논리적 and 연산자를 사용해 결합된다. fluent Java API를 사용하면 Predicate 클래스의 and(), or(), negate() 연산자를 좀 더 다양하게 활용할 수 있다.


12.4. The DiscoveryClient Route Definition Locator

게이트웨이는 DiscoveryClient 호환 서비스 레지스트리에 등록된 서비스를 기반으로 route를 생성하도록 설정할 수 있다.

이 기능을 활성화하려면 spring.cloud.gateway.discovery.locator.enabled=true를 설정하돼, 반드시 클래스패스에 DiscoveryClient 구현체가 (ex. Netflix Eureka, Consul, Zookeeper) 있고 활성화돼 있어야 한다.

12.4.1. Configuring Predicates and Filters For DiscoveryClient Routes

게이트웨이는 DiscoveryClient로 생성된 route엔 기본적으로 predicate와 필터를 하나씩 정의한다.

디폴트 predicate는 /serviceId/** 패턴으로 정의한 path predicate며, 여기서 serviceIdDiscoveryClient의 서비스 ID다.

디폴트 필터는 regexp /serviceId/?(?<remaining>.*)와 replacement /${remaining}을 가진 rewrite path 필터다. 이렇게 하면 요청을 다운스트림으로 전송하기 전에 서비스 ID는 path에서 제거된다.

DiscoveryClient route에서 사용할 predicate나 필터를 커스텀하고 싶다면, spring.cloud.gateway.discovery.locator.predicates[x]spring.cloud.gateway.discovery.locator.filters[y]를 설정해라. 단, 앞에서 보여준 디폴트 predicate와 필터 기능을 보존하고 싶다면, 디폴트 predicate, 필터도 반드시 추가해야 한다. 다음은 어떻게 설정을 구성하는지 보여주는 예시다:

Example 67. application.properties

spring.cloud.gateway.discovery.locator.predicates[0].name: Path
spring.cloud.gateway.discovery.locator.predicates[0].args[pattern]: "'/'+serviceId+'/**'"
spring.cloud.gateway.discovery.locator.predicates[1].name: Host
spring.cloud.gateway.discovery.locator.predicates[1].args[pattern]: "'**.foo.com'"
spring.cloud.gateway.discovery.locator.filters[0].name: CircuitBreaker
spring.cloud.gateway.discovery.locator.filters[0].args[name]: serviceId
spring.cloud.gateway.discovery.locator.filters[1].name: RewritePath
spring.cloud.gateway.discovery.locator.filters[1].args[regexp]: "'/' + serviceId + '/?(?<remaining>.*)'"
spring.cloud.gateway.discovery.locator.filters[1].args[replacement]: "'/${remaining}'"

전체 목차는 여기에 있습니다.

<< >>