Spring Cloud Gateway는 Spring Boot 2.x, Spring Webflux, Project Reactor 기반으로 동작하며, 기본적으로 들어온 요청을 해당 목적지로 라우트 해주는 역할을 수행한다.
ServerWebExchange
다. predicate를 통해 헤더나 파라미터 같은 HTTP 요청 정보를 매칭시킬 수 있다.RouteLocator
사용하기application.yml
작성하기server:
port: 8080
spring:
cloud:
gateway:
routes:
- id: route
uri: http://localhost:8081
predicates:
- Path=/route/**
filters:
- RewritePath=/route/(?<segment>.*), /$\{segment}
http://localhost:8080/route/hello 로 요청을 보내면
http://localhost:8081/hello 로 라우트된다.
RouteDefinition
객체로 정의된다.RoutePredicateFactory
를 통해 각 요청의 경로가 /route/**
와 일치하는지 검사한다. PathRoutePredicateFactory
에 의해 Path=/route/**
가 설정된 Predicate
가 생성된다.GatewayFilterFactory
를 통해 처리된다. RewritePathGatewayFilterFactory
를 통해 RewritePath=/route/(?<segment>.*), /${segment}
가 설정된 GatewayFilter
가 생성된다.
/route/(?<segment>.*)
: 정규 표현식,route/
뒤에 나오는 모든 문자열을 segment라는 이름으로 캡처한다.
/\${segment}
: 캡처한 segment 값을 해당 위치에 삽입한다. (정규 표현식에서 캡처된 값을 ${변수명} 형식으로 참조할 수 있다.)
@Configuration
class GatewayConfig {
@Bean
fun customRouteLocator(builder: RouteLocatorBuilder): RouteLocator {
return builder.routes()
.route("route") { r ->
r.path("/route/**")
.filters { f -> f.rewritePath("/route/(?<segment>.*)", "/${segment}") }
.uri("http://localhost:8081")
}
.build()
}
}
이렇게도 구성할 수 있다.
spring:
cloud:
gateway:
routes:
- id: internal
uri: http://localhost:8080
predicates:
- Path=/internal/**
filters:
- RewritePath=/internal/(?<segment>.*), /$\{segment}
이렇게 목적지 uri를 gateway uri와 동일하게 설정하면 내부 컨트롤러로도 라우트할 수 있다.
참조