Backend 개발자/Springboot

Spring Cloud gateway 메뉴얼 공식문서 빠르게 요약 알아보기

by 앵과장 2024. 7. 4. 08:36
반응형

Spring Cloud Gateway에서 제공하는 수많은 Filter가 있더라도 제공하는 정보를 모르면 불필요하게 만들어서 사용할수 있기 때문에 제공하는 공식문서를 꼭 확인하는것을 추천 드립니다


공식문서 가이드를 봐야하는이유?!


호기롭게 오픈소스를 가지고 와서 메뉴얼도 안보고 중복되는 작업을 하게되는경우가 꼭있는데
상남자는 메뉴얼을 보지 않는다 했는가?!


요새 보니 홍콩반점 맛없다고 리뷰가 흉흉하니 백선생님메뉴얼을 그렇게 만들어줘도 안보는것 같다는 그런짤인데 오픈소스는 말그대로 내마음대로 가져다쓰고 바꾸고싶은데로 바꿔도 되기는 하지만

회사에서 팀에서 작업하는데 메뉴얼도 제대로 안보고 커스텀 해두면 버전이 업데이트 되고 문제가 발생하지 않으면 되는데 내가 만든버전 관리도 못하면서 업데이트도 못하게 만드는 상남자 개발자가 있어서….
제발좀 … 너혼자 하는개발이 아니다 평생 업데이트 해줄꺼냐?!

https://github.com/lswteen/boilerplate-gateway/blob/main/SPRING_CLOUD_GATEWAY.md

boilerplate-gateway/SPRING_CLOUD_GATEWAY.md at main · lswteen/boilerplate-gateway

gateway 기본 구조 작업. Contribute to lswteen/boilerplate-gateway development by creating an account on GitHub.

github.com

Github에 2024-05-11
Spring-Cloud-Gateway 4.1.3 한글번역본 공유

Webflux OR Servlet

Spring Cloud Gateway 구성할때 두가지중 선택해서 진행이 가능하며
트래픽이 많지 않다면 Servlet 방식으로 단일 thread처리 하는 방법으로 하는것도 방법입니다
EventLoop 방식의 Webflux는 Thread가 지속적으로 변경되기때문에 이런부분들을 고려해야 되기때문입니다

Webflux방식은 EventLoop방식이며 동시에 Thread가 처리되고 코드스타일도 리엑티브형태로 구성하면됩니다
Spring Data, Spring Security, Log처리등 webflux용으로 고려 해야합니다
Netty 기반으로 비동기방식으로 처리됩니다

Gateway yaml 또는 Java DSL

게이트웨이 다양한 라우팅, 필터를 구성할때 yaml 또는 javadsl로 동일한 구성이 가능한데 상황에 따라 다르겠지만 Yaml구성이 Spring Cloud Config Server을 구성해서 Application.yaml을 구성한다든가 관리하기가 용이한것 같습니다
간혹 Java DSL로만 처리가능한 필터들도 있기때문에 이부분

자주볼수 있는 용어


Route: 게이트웨이의 기본 구성 요소입니다. ID, 대상 URI, 프레디케이트(predictes) 모음, 필터(filters) 모음으로 정의됩니다. 집합 프레디케이트가 true이면 라우트가 일치합니다.

Predicate: Java 8의 Function Predicate입니다. 입력 유형은 Spring Framework의 ServerWebExchange입니다. 이를 통해 헤더나 매개변수와 같은 HTTP 요청의 모든 항목과 일치시킬 수 있습니다.

Filter: 특정 팩토리로 구성된 GatewayFilter 인스턴스입니다. 여기서 하류 요청을 보내기 전이나 후에 요청 및 응답을 수정할 수 있습니다.


predicate 단축구성, 완전 확장된 인수


프레디케이트와 필터를 구성하는 방법에는 두 가지가 있습니다: 단축 구성과 완전 확장된 인수입니다. 아래의 대부분의 예시는 단축 구성 방법을 사용합니다.

단축구성


단축 구성은 필터 이름 뒤에 등호(=)를 쓰고, 그 뒤에 쉼표(,)로 구분된 인수 값을 쓰는 방식으로 인식됩니다.

spring:
  cloud:
    gateway:
      routes:
      - id: after_route
        uri: https://example.org
        predicates:
        - Cookie=mycookie,mycookievalue


완전 확정된 인수

완전 확장된 인수는 이름/값 쌍을 가진 표준 YAML 구성처럼 보입니다. 일반적으로 name 키와 args 키가 있습니다. args 키는 프레디케이트 또는 필터를 구성하기 위한 키-값 쌍의 맵입니다.

spring:
  cloud:
    gateway:
      routes:
      - id: after_route
        uri: https://example.org
        predicates:
        - name: Cookie
          args:
            name: mycookie
            regexp: mycookievalue



Route구성은 가장 기본이 되는 패턴매칭이라고 이해하면됩니다
보편적으로 사용되는방식은 Path 가 일치할경우에 많이 사용됩니다 접근처리를 히기위해서 공통적으로 적용해야되는경우가 많은데 Path구성이 쉽고 간편하기때문입니다

Predicate를 설정하는 샘플코드

spring:
  cloud:
    gateway:
      routes:
        - id: user_route
          uri: http://localhost:9999
          metadata:
            sampleKey: sampleValue    # 필터에서 사용 가능한 별도 파라미터
          predicates:
            - After=2022-01-01T08:00:00.000+09:00[Asia/Seoul]
            - Before=2022-12-31T22:00:00.000+09:00[Asia/Seoul]
            - Between=2022-01-01T08:00:00.000+09:00[Asia/Seoul], 2022-12-31T22:00:00.000+09:00[Asia/Seoul]
            - Cookie=chocolate, ch.p
            - Header=X-Request-Id, \d+
            - Host=**.example.com,**.example.org  # Host Header 기반
            - Method=GET,POST
            - Path=/user/{segment}                # Path 기반
            - Query=green
            - Query=debug, true
            - RemoteAddr=192.168.1.1/24
            - #...



자주 사용하게 되는 Filter

Spring Cloud Gateway에서는 Route를 통해서 들어오는 Http 요청 응답에 대해서 내장 GatewayFilter 팩토리 제공

Filter를 구성하는 샘플

spring:
  cloud:
    gateway:
      routes:
        - id: user_route
          uri: lb://user
          predicates:
            - Path=/user/**
          filters:
            - AddRequestHeader=X-Request-red, blue
            - AddRequestParameter=red, blue
            - AddResponseHeader=X-Response-Red, Blue
            - PrefixPath=/v1
            - RedirectTo=302, https://acme.org
            - RewritePath=/user/?(?<segment>.*), /$\{segment}
            - SetPath=/{segment}
            - #...

필터는 많은 것들을 처리할수 있다 쉽게 예기하면 요청이 들어온 Request를 pre filter 요청전으로 처리하고 post filter 요청후 처리로 진행이가능하고 Route에 전역으로 Global로 처리하는방식과 각각 Parh별로도 처리가능하다

Header위변조, Auth인증처리, Error 또는 Timeout에 대한 Circuitbreaker 처리, Path접두사, Cache, Body payload 변조등 다양한 제공 필터 뿐만 아니라 직접 커스터마이징 가능한 기능도 가능하다

언급한것 말고도 40개 이상 필터가 존재하기 때문에 필요한 기능이 있다면 직접 구현하려고 하지말고 메뉴얼을 보고 사용하는 방법으로 진행해야 한다 생각보다 버전이 상당히 빠르게 업데이트 되기때문에 뭐가 바뀔지 모르고
직접 구현하게되면 하위호환이나 페이드아웃될수 있으며 End Point 제공하는것을 사용하는것이 운영리소스를 최소화할수 있습니다

Global Filter


GlobalFilter와 GatewayFilter의 통합 필터 체인 순서 GlobalFilter 인터페이스는 GatewayFilter와 동일한 시그니처를 가집니다. 이 필터들은 모든 라우트에 조건부로 적용되는 특별한 필터입니다.

이 인터페이스와 그 사용법은 향후 마일스톤 릴리스에서 변경될 수 있습니다.

통합 GlobalFilter 및 GatewayFilter 순서 요청이 라우트와 일치하면 필터링 웹 핸들러는 모든 GlobalFilter 인스턴스와 모든 라우트 특정 GatewayFilter 인스턴스를 필터 체인에 추가합니다. 이 통합 필터 체인은 org.springframework.core.Ordered 인터페이스에 따라 정렬되며, getOrder() 메서드를 구현하여 설정할 수 있습니다.

Spring Cloud Gateway는 필터 로직 실행을 위해 “pre” 및 “post” 단계로 구분합니다. 우선 순위가 가장 높은 필터는 “pre” 단계에서 첫 번째, “post” 단계에서 마지막이 됩니다.

Developer Guide



개발자 가이드: Spring Cloud Gateway의 사용자 정의 구성 요소 작성

사용자 정의 Route Predicate 팩토리 작성
Route Predicate를 작성하려면 RoutePredicateFactory를 빈으로 구현해야 합니다.

AbstractRoutePredicateFactory라는 추상 클래스를 확장할 수 있습니다.

이부분은 메뉴얼 하단에 자세하게 나와서 보시는것을 추천드립니다