Spring Gateway(3)

광부·2024년 5월 19일
0

Spring

목록 보기
4/8

경로 필터를 사용하면 들어오고 나가는 HTTP 요청과 응답을 변경할 수 있음.

필터는 특정 경로로 범위를 지정할 수 있음.

Spring Gateway는 이미 많은 Gateway필터들이 내장되어 있음.

AddRequest(Response)Header Factory

이 팩토리는 조건이 일치하는 모든 요청의 헤더에 새로운 헤더를 추가할 때 사용된다.

AddRequest(Response)Header는 경로나 호스트를 일치시키는 데 사용되는 URI 변수도 인식할 수 있다. 매개 변수로 NameValue의 쌍을 받는다.

spring:
  cloud:
    gateway:
      routes:
      - id: add_request_header_route
        uri: https://example.org
        predicates:
        - Path=/red/{segment}
        filters:
        - AddRequestHeader=X-Request-Red, Blue-{segment}
  • Full expanded
    spring:
      cloud:
        gateway:
          routes:
          - id: add_request_header_route
            uri: https://example.org
            predicates:
            - name: Path
              args:
                pattern: /red/{segment}
            filters:
            - name: AddRequestHeader
              args:
                name: X-Request-Red
                value: Blue-{segment}
    

URI 의 변수를 사용하여 런타임 환경에서도 Header의 값을 정할 수 있다. fixed 헤더로도 설정 가능하다.

AddRequestParameter Factory

해당 팩토리도 AddRequestHeader 팩토리 처럼 Name&value를 입력으로 받는다.

이 또한 런타임 도중에 value를 결정할 수 있다.

spring:
  cloud:
    gateway:
      routes:
      - id: add_request_parameter_route
        uri: https://example.org
        predicates:
        - Host: {segment}.myhost.org
        filters:
        - AddRequestParameter=foo, bar-{segment}
  • Full expanded
    spring:
      cloud:
        gateway:
          routes:
          - id: add_request_parameter_route
            uri: https://example.org
            predicates:
            - name: Host
              args:
                pattern: "{segment}.myhost.org"
            filters:
            - name: AddRequestParameter
              args:
                name: foo
                value: bar-{segment}

DudupeResponseHeader Factory

DedupeResponseHeader 팩토리는 매개변수로 name(필수) strategy(옵션)을 받는다. 헤더의 이름을 리스트 형식으로 받을 수 있으며, 구분자로는 `` 을 사용한다.

Strategy종류

RETAIN_FIRST(Default) : 중복된 헤더 중 첫 번째 위치한 값만 전달

RETAIN_LAST : 중복된 헤더 중 마지막 위치한 값만 전달

RETAIN_UNIQUE : 같은 헤더의 값이 1,1,2,3이 있으면 1,2,3만 남겨둠.

spring:
  cloud:
    gateway:
      routes:
      - id: dedupe_response_header_route
        uri: https://example.org
        filters:
        - DedupeResponseHeader=Access-Control-Allow-Credentials Access-Control-Allow-Origin
X-Example-Header: value1
X-Example-Header: value2
X-Example-Header: value3
응답 헤더가 위와 같을 경우 RETAIN_LAST를 사용하면 아래처럼 변경함.
X-Example-Header: value3

CircuitBreaker Factory

Dependencies

<dependency>--Maven
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-circuitbreaker-reactor-resilience4j</artifactId>
</dependency>
--Gradle
implementation 'org.springframework.cloud:spring-cloud-starter-circuitbreaker-reactor-resilience4j'

CircuitBreaker GatewayFilter는 Spring Cloud CircuitBreaker API를 사용하여 게이트웨이 라우트를 서킷 브레이커로 감싸는 기능을 제공함. 장애가 발생하거나 응답이 길어지는 경우, 서비스의 호출을 빠르게 실패시킴으로 써 안정성과 회복력을 향상시키는데 도움을 줌.

여러 Spring Cloud CircuitBreaker는 여러 라이브러리를 지원하며, 기본적으로 Resilience4J를 지원함.

spring:
  cloud:
    gateway:
      routes:
      - id: circuitbreaker_route
        uri: https://example.org
        filters:
        - CircuitBreaker=myCircuitBreaker
Circuit Breaker Configuration
resilience4j.circuitbreaker:
  instances:
    myCircuitBreaker:
      registerHealthIndicator: true
      slidingWindowSize: 100
      permittedNumberOfCallsInHalfOpenState: 10
      waitDurationInOpenState: 60s
      failureRateThreshold: 50
      eventConsumerBufferSize: 10

CircuitBreaker Filter는 오류 발생 시, Circuit Breaker가 열리게 되면 요청을 대체 경로(fallbackUri)로 전달하게됨

  • YAML을 통한 Fallback Configuration 방법
    spring:
      cloud:
        gateway:
          routes:
          - id: circuitbreaker_route
            uri: lb://backing-service:8088
            predicates:
            - Path=/consumingServiceEndpoint
            filters:
            - name: CircuitBreaker
              args:
                name: myCircuitBreaker
                fallbackUri: forward:/inCaseOfFailureUseThis
            - RewritePath=/consumingServiceEndpoint, /backingServiceEndpoint
  • Java를 통한 Fallback Configuration 방법 (위와 동일)
    @Bean
    public RouteLocator routes(RouteLocatorBuilder builder) {
        return builder.routes()
            .route("circuitbreaker_route", r -> r.path("/consumingServiceEndpoint")
                .filters(f -> f.circuitBreaker(c -> c.name("myCircuitBreaker").fallbackUri("forward:/inCaseOfFailureUseThis"))
                    .rewritePath("/consumingServiceEndpoint", "/backingServiceEndpoint")).uri("lb://backing-service:8088")
            .build();
    }
  • fallbackUri의 처리를 다른 컨트롤러로 리라우팅하거나, 외부의 애플리케이션으로 처리할 수 있음.
    spring:
      cloud:
        gateway:
          routes:
          - id: ingredients
            uri: lb://ingredients
            predicates:
            - Path=//ingredients/**
            filters:
            - name: CircuitBreaker
              args:
                name: fetchIngredients
                fallbackUri: forward:/fallback
          - id: ingredients-fallback
            uri: http://localhost:9994
            predicates:
            - Path=/fallback
    엔드포인트가 healthy 상태일 경우, 로드밸런서 ingredients로 요청이 전달되고, CircuitBreaker가 열려있는 상태라면, fallback으로 포워딩되고, ingredients-fallback의 규칙에서 정의된 predicates와 일치하여 외부의 애플리케이션으로 요청을 보낸다.

FallbackHeaders Factory

FallbackUri로 요청이 전달될 때, 헤더의 값을 추가할 수 있다.

spring:
  cloud:
    gateway:
      routes:
      - id: ingredients
        uri: lb://ingredients
        predicates:
        - Path=//ingredients/**
        filters:
        - name: CircuitBreaker
          args:
            name: fetchIngredients
            fallbackUri: forward:/fallback
      - id: ingredients-fallback
        uri: http://localhost:9994
        predicates:
        - Path=/fallback
        filters:
        - name: FallbackHeaders
          args:
            executionExceptionTypeHeaderName: Test-Header

MapRequestHeader Factory

매개변수로 fromHeadertoHeader 를 사용함. fromHeadeer가 없으면 아무런 영향을 끼치지 않음. fromHeader에 해당하는 값이 있다면 값이 toHeader으로 복사됨. toHeader 이름에 값이 이미 존재한다면, 같은 이름의 toHeader가 추가됨.

spring:
  cloud:
    gateway:
      routes:
      - id: map_request_header_route
        uri: https://example.org
        filters:
        - MapRequestHeader=Blue, X-Request-Red

PrefixPath Factory

단일 매개변수로 PrefixPath를 받음. 모든 요청 경로에 PrefixPath에 설정한 프리픽스가 추가됨.

spring:
  cloud:
    gateway:
      routes:
      - id: prefixpath_route
        uri: https://example.org
        filters:
        - PrefixPath=/mypath

이후의 내용은 찾아보니 이미 한글화로 정리가 되어있었다…

필요할 때 이후의 내용을 찾아보는 것이 좋을 것 같다.

한글화)https://godekdls.github.io/Spring Cloud Gateway/gatewayfilter-factories/#67-the-maprequestheader-gatewayfilter-factory

출처)https://cloud.spring.io/spring-cloud-gateway/reference/html/#gatewayfilter-factories

profile
백엔드 주니어 개발자

0개의 댓글