Spring Cloud Gateway 개념

이현지·2021년 10월 4일
0
post-thumbnail

Spring Cloud Gateway 란?

Spring Reactive 생태계 위에 Spring Cloud 팀이 구현한 API Gateway 이다.
그렇다면 API Gateway 에 대해 잠시 알아보자.

API Gateway

  • reverse proxy 를 향상 시킨 것이다.
  • Netflix zuul, Amazon API Gateway, Spirng Cloud Gateway 등이 있다.

이제 Spring Cloud Gateway 특징을 알아보자

  • Netty 서버를 활용하여, 비동기 요청 처리를 제공한다.
  • 사용하기 쉬운 Pedicate 과 filters
  • Circuit Breaker 통합
  • Spring Cloud DiscoveryClient 통합
  • Rate Limiting
  • Path 재작성

위와 같은 특징들이 있는데, 우선 기본적인 동작방식과 특징 먼저 알아보자.

Spring Cloud Gateway 동작 과정

  1. Gateway Client 에서 요청을 보낸다.
  2. Gateway Handler Mapping 에서 요청이 해당 경로(route)와 일치하다고 생각되면, Gateway Web Handler 로 전송한다.
  3. Gateway Web Handler 는 요청과 관련된 filter 로 요청을 전송한다.
  4. 필터는 pre filter 와 post filter 로 나누어지는데, 우선 pre filter 가 실행된다.
  5. 프록시 요청이 실행된다.
  6. post filter 가 실행된 후, client 에게 응답된다.

주요 특징

  • Route: Gateway의 기본 블록이라고 보면 된다.
    목적지 URI 와 predicate, filter 를 정의하는 곳이다.

    spring:
      cloud:
        gateway:
          routes:
          - id: after_route
            uri: https://example.org
            predicates:
            - Cookie=mycookie,mycookievalue
  • Predicate : 일종의 조건문이며, client의 요청이 설정한 조건과 일치하는지 확인하는 곳이다.
    무조건 1개 이상 설정해야 한다.
    예를 들어 Path:/api/** 이와 같이 설정했다면,
    client 요청이 api/route/1 이런 형식으로 들어와야 해당 조건이 일치하게 된다.
    위 예시는 Path 라는 조건을 활용한 것이고, Path 외에도 다양한 조건이 있다.
    (Cookie, After, Before, Between, Header 등등)

    https://cloud.spring.io/spring-cloud-gateway/reference/html/#gateway-request-predicates-factories

    spring:
      cloud:
        gateway:
          routes:
          - id: after_route
            uri: https://example.org
            predicates:
            - After=2017-01-20T17:42:47.789-07:00[America/Denver]
  • Filter: 요청 또는 응답을 다음단계로 보내기 전에 수정할 수 있는 곳이다.
    Spring Cloud Gateway는 요청 또는 응답을 수정하기 위한 많은 내장 GatewayFilter Factory 포함되어 있다. 그리고 내장 외에 custom filter 를 정의하여 사용할 수도 있다.
    (AddReqeustHeader, CircuitBreaker, PrefixPath, redis-rate-limiter 등등)

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

    spring:
      cloud:
        gateway:
          routes:
          - id: add_request_header_route
            uri: https://example.org
            filters:
            - AddRequestHeader=X-Request-red, blue 
  • route, predicate, filter 를 yml 파일로 위와 같이 작성할 수 있지만, java dsl 을 통해서 java 파일로 구성할 수도 있다.

    @Bean
    public RouteLocator customRouteLocator(RouteLocatorBuilder builder) {
        return builder.routes()
          .route("r1", r -> r.host("**.baeldung.com")
            .and()
            .path("/baeldung")
            .uri("http://baeldung.com"))
          .route(r -> r.host("**.baeldung.com")
            .and()
            .path("/myOtherRouting")
            .filters(f -> f.prefixPath("/myPrefix"))
            .uri("http://othersite.com")
            .id("myOtherID"))
        .build();
    }

References

https://medium.com/@niral22/spring-cloud-gateway-tutorial-5311ddd59816
https://cloud.spring.io/spring-cloud-gateway/reference/html/
https://www.baeldung.com/spring-cloud-gateway

profile
Backend Developer👩‍💻

0개의 댓글