Spring Cloud - Gateway!

Spring Cloud Gateway

https://docs.spring.io/spring-cloud-gateway/docs/current/reference/html/

마이크로 서비스에서 게이트웨이는 주로 일괄적인 보안처리, 시스템 복잡도를 숨기기 위해 리버스 프록시 형태로 많이 사용한다.
과거 Spring Cloud 에서 게이트웨이 역할을 해주는 Spring Cloud Netflix Zuul 이 deprecated 되고 Spring Cloud Gateway 가 공식적으로 게이트웨이 프로젝트로 자리잡았다.

하지만 zuulSpring Cloud Hoxton Release 를 마지막으로 더이상 지원하지 않음.

아래와 같이 spring-cloud-starter-gateway 의존성을 추가.

dependencies {
    implementation 'org.springframework.cloud:spring-cloud-starter-gateway'
}

application.propertiesjava config 로 라우팅역할을 해줄 설정만 적용하면 된다.

Spring Cloud Gateway 설정에는 3가지 기본 개념이 있다.

  • route 게이트 웨이 기본 요소 목적지 url 과 각종 조건 설정
  • predicates 조건자, 각 요청 처리전 실행되는 로직, java8 Predicate 인터페이스 기반 전처리 조건 설정
  • filters 필터, 각 요청/응답 값의 필터 설정, GatewayFilter 의 구현체

application.properties

application.properties 파일을 통해 Spring Cloud Gateway 설정하는법

server.port=8000
spring.application.name=gateway-service

spring.cloud.gateway.routes[0].id=order-service
spring.cloud.gateway.routes[0].uri=http://localhost:8082
# Path route 사용
spring.cloud.gateway.routes[0].predicates[0]=Path=/api/order/**
# RewritePath filter 사용, /api/order 를 지우고 order-service 에 request 요청
spring.cloud.gateway.routes[0].filters[0]=RewritePath=/api/order/(?<path>.*), /$\\{path}

java config

위의 application.properties 를 그대로 java config 로 변환

@Configuration
public class RouteConfig {
  //spring.cloud.gateway.routes[0].id=order-service
  //spring.cloud.gateway.routes[0].uri=http://localhost:8082
  //spring.cloud.gateway.routes[0].predicates[0]=Path=/api/order/**
  //spring.cloud.gateway.routes[0].filters[0]=RewritePath=/api/order/(?<path>.*), /$\\{path}
  @Bean
  public RouteLocator customRouteLocator(RouteLocatorBuilder routeLocatorBuilder) {
    return routeLocatorBuilder.routes()
      .route("order-service", predicateSpec -> predicateSpec
        .path("/api/order/**")
        .filters(gatewayFilterSpec -> gatewayFilterSpec
          .rewritePath("/api/order/(?<path>.*)", "/${path}"))
        .uri("http://localhost:8082"))
      .build();
  }
}

Spring Cloud Gateway Actuator API

https://docs.spring.io/spring-cloud-gateway/docs/current/reference/html/#actuator-api

management.endpoint.gateway.enabled=true 설정시 CRUD 를 통해 spring cloud gateway 수정이 가능하다.

ID HTTP Method Description
globalfilters GET Displays the list of global filters applied to the routes.
routefilters GET Displays the list of GatewayFilter factories applied to a particular route.
refresh POST Clears the routes cache.
routes GET Displays the list of routes defined in the gateway.
routes/{id} GET Displays information about a particular route.
routes/{id} POST Add a new route to the gateway.
routes/{id} DELETE Remove an existing route from the gateway.
{
  // /actuator/gateway/routes/order-service
  "predicate": "Paths: [/order/**], match trailing slash: true",
  "route_id": "order-service",
  "filters": ["[[RewritePath /order/(?<path>.*) = '${path}'], order = 0]"],
  "uri": "lb://order-service",
  "order": 0
}