Spring Gateway(2) 경로 지정자 팩토리

광부·2024년 5월 6일
0

Spring

목록 보기
3/8

Route Predicate Factories(경로 조건자 팩토리)

스프링 게이트웨이는 스프링 WebFluxHandlerMapping 인프라의 일부로 경로를 매칭시킨다.

스프링 게이트웨이에는 이미 built-in된 경로 조건자(predicate) 팩토리가 있다.

이러한 모든 조건자는 HTTP 요청의 다양한 속성과 일치하고 조건자 팩토리를 논리적 AND 연산자를 사용해 라우팅을 수행할 수도 있다.

The After Route Predicate Factory

After 경로 조건자는 DateTime(Java의 ZonedDateTime) 매개변수 하나를 사용한다. 해당 조건자는 지정된 날짜와 시간 이후에 발생하는 요청과 일치하는 경로를 매칭해준다.

즉, 특정 시간 이후에만 라우팅되도록 구성할 수가 있다.

spring:
  cloud:
    gateway:
      routes:
      - id: after_route
        uri: https://example.org
        predicates:
        - After=2017-01-20T17:42:47.789-07:00[America/Denver]

The Before Route Predicate Factory

Before 경로 조건자는 After 경로 조건자와 마찬가지로 DateTime 매개변수만을 입력받는다. 특정 시간 이전에만 특정한 동작을 수행하도록 게이트웨이를 구성할 수 있다.

spring:
  cloud:
    gateway:
      routes:
      - id: before_route
        uri: https://example.org
        predicates:
        - Before=2017-01-20T17:42:47.789-07:00[America/Denver]

The Between Route Predicate Factory

Between 경로 조건자는 두 개의 DateTime 매개변수를 입력받는다. 각각 After 조건자와 Before 조건자에 해당하는 역할을 수행한다. 즉, 정의된 두 시간 사이에 발생하는 요청만 라우팅해준다.

spring:
  cloud:
    gateway:
      routes:
      - id: between_route
        uri: https://example.org
        predicates:
        - Between=2017-01-20T17:42:47.789-07:00[America/Denver], 2017-01-21T17:42:47.789-07:00[America/Denver]

→ 아마 수강신청 사이트나 티켓팅 등 시작 시간과 마감 시한이 있는 곳의 사이트에서 사용할 것으로 추측된다.

Cookie 경로 지정자는 두 개의 매개변수를 받는다. name(쿠키 이름)과 regexp(정규표현식)이다. 첫 번째 name은 쿠키의 이름이고, regexp는 쿠키의 값이 일치해야하는 정규표현식이다. 쿠키의 이름과 그 값이 regexp를 만족하는 경우 경로를 매칭 시켜준다. 이 팩토리를 사용하게 되면 특정 쿠키의 값을 기반으로 요청을 라우팅할 수 있게된다.

spring:
  cloud:
    gateway:
      routes:
      - id: cookie_route
        uri: https://example.org
        predicates:
        - Cookie=chocolate, ch.p

Header 경로 지정자 팩토리

Header 경로 지정자도 Cookie 지정자와 마찬가지로 name, regexp를 입력으로 받는다.

spring:
  cloud:
    gateway:
      routes:
      - id: header_route
        uri: https://example.org
        predicates:
        - Header=X-Request-Id, \d+

Host 경로 지정자 팩토리

Host 경로 지정자는 Host name의 패턴 리스트만을 매개변수로 입력받는다. 패턴의 스타일은 . 을 구분자로 사용하는 Ant-style패턴이다.

→ Spring Cloud Gateway를 단일 서버에서 실행한다고 생각하였는데, 분산환경에서도 사용이 가능한 점을 시사한다. 아마 Endpoint Discovery기능과 함께 사용하며 MSA 로 접근할 수 있는 엔드포인트를 Spring Cloud Gateway를 이용하여 생성하는 것 같다.

spring:
  cloud:
    gateway:
      routes:
      - id: host_route
        uri: https://example.org
        predicates:
        - Host=**.somehost.org,**.anotherhost.org

Path 경로 지정자 팩토리

Path 경로 지정자는 Spring PathMatcher 리스트(필수)와 matchOptionalTrailingSepatator(옵션)을 입력받는다. PathMatcher 패턴은 URL 경로에 대해 유연한 일치 기준을 정의하는 데 사용된다. MatchOptionalTrailingSeparator는 요청 경로 끝에 존재하는 구분자를 선택적으로 처리하는데 사용된다.

ex) path를 /api 로 설정하고, matchOptionalTrailingSeparator를 true로 설정하였을 경우, /api/ 와 /api로 접근을 해도 동일하게 설정해둔 경로로 라우팅이 된다. false로 설정을 하였다면, /api 로 접근한 사람만 설정해둔 경로로 라우팅이 된다.

spring:
  cloud:
    gateway:
      routes:
      - id: path_route
        uri: https://example.org
        predicates:
        - Path=/red/{segment},/blue/{segment}

Query 경로 지정자 팩토리

Query 경로 지정자 팩토리는 param(필수)과 regexp(옵션)을 매개변수로 전달받는다.

spring:
  cloud:
    gateway:
      routes:
      - id: query_route
        uri: https://example.org
        predicates:
        - Query=red, gree.

위의 예제처럼 작성한다면, red라는 Query 매개변수의 값으로 green 과 greet가 가능하다.

RemoteAddr 경로 지정자 팩토리

RemoteAddr을 매개변수로 받는다. CIDR 형식으로 IPv4혹은 IPv6을 받을 수 있으며, 일치하는 SourceIP 인 경우에만 라우팅을 수행한다.

→ AWS의 security group의 기능 중 CIDR을 이용한 접근제어 기능과 비슷해 보인다.

spring:
  cloud:
    gateway:
      routes:
      - id: remoteaddr_route
        uri: https://example.org
        predicates:
        - RemoteAddr=192.168.1.1/24

Weight 경로 지정자 팩토리

group과 weight라는 두 개의 매개변수를 입력받는다. 작성한 총 가중치 대비 group의 가중치 비율에 따라 요청을 라우팅 하게 된다.

spring:
  cloud:
    gateway:
      routes:
      - id: weight_high
        uri: https://weighthigh.org
        predicates:
        - Weight=group1, 8
      - id: weight_low
        uri: https://weightlow.org
        predicates:
        - Weight=group1, 2

→ 이것은 Application Loadbalancer 의 기능과 동일해보임.

3편에서는 Gateway Filter Factories에 대해 정리할 예정.
출처)https://cloud.spring.io/spring-cloud-gateway/reference/html/#gateway-request-predicates-factories

profile
백엔드 주니어 개발자

0개의 댓글