경로 필터를 사용하면 들어오고 나가는 HTTP 요청과 응답을 변경할 수 있음.
필터는 특정 경로로 범위를 지정할 수 있음.
Spring Gateway는 이미 많은 Gateway필터들이 내장되어 있음.
이 팩토리는 조건이 일치하는 모든 요청의 헤더에 새로운 헤더를 추가할 때 사용된다.
AddRequest(Response)Header는 경로나 호스트를 일치시키는 데 사용되는 URI 변수도 인식할 수 있다. 매개 변수로 Name과 Value의 쌍을 받는다.
spring:
cloud:
gateway:
routes:
- id: add_request_header_route
uri: https://example.org
predicates:
- Path=/red/{segment}
filters:
- AddRequestHeader=X-Request-Red, Blue-{segment}
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 헤더로도 설정 가능하다.
해당 팩토리도 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}
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}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
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)로 전달하게됨
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@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();
}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와 일치하여 외부의 애플리케이션으로 요청을 보낸다.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
매개변수로 fromHeader 와 toHeader 를 사용함. 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를 받음. 모든 요청 경로에 PrefixPath에 설정한 프리픽스가 추가됨.
spring:
cloud:
gateway:
routes:
- id: prefixpath_route
uri: https://example.org
filters:
- PrefixPath=/mypath
이후의 내용은 찾아보니 이미 한글화로 정리가 되어있었다…
필요할 때 이후의 내용을 찾아보는 것이 좋을 것 같다.
출처)https://cloud.spring.io/spring-cloud-gateway/reference/html/#gatewayfilter-factories