Spring Cloud Gateway

Code_Builder·2024년 8월 5일
0
post-thumbnail

Spring Cloud Gateway 란 무엇인가?

Spring 프레임워크 기반으로 개발된 API 게이트웨이로 사용자가 요청을 보낼떄 적절한 서비스로 안내해주는 역할

주요 특징

  • 동적으로 라우팅이 가능
  • 필터링 기능이 존재(Global Filter, Gateway Filter , Pre필터, Post필터)
  • 요청 로그를 통한 서비스 상태 모니터링이 가능
  • Spring Security와 통합되어, 인증 및 권한 부여를 쉽게 설정 가능

필터링 종류

  • Global Filter: 모든 요청에 대해 작동하는 필터
  • Gateway Filter: 특정 라우트에만 적용되는 필터

필터링 시점 종류

  • Pre 필터: 요청이 처리되기 전에 실행

예시코드

@Component
public class CustomPreFilter implements GlobalFilter, Ordered {
     //ServerWebExchange는 HTTP 요청과 응답을 캡슐화한 객체
    //exchange.getRequest()`로 HTTP 요청 가져옴
    //exchange.getResponse()`로 HTTP 응답을 가져옴
    //chain.filter(exchange)는 다음 필터로 요청을 전달
     private static final Logger logger = Logger.getLogger(CustomPreFilter.class.getName());

    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        ServerHttpRequest response = exchange.getRequest();
        logger.info("Pre Filter: Request URI is " + response.getURI());
        // Add any custom logic here

        return chain.filter(exchange);
    }

    @Override
    public int getOrder() {
        return Ordered.HIGHEST_PRECEDENCE;
    }
}
  • Post 필터 : 요청이 처리된 후, 응답이 반환되기 전에 실행

예시코드

//chain.filter(exchange)는 다음 필터로 요청을 전달
@Component
public class CustomPostFilter implements GlobalFilter, Ordered {

    private static final Logger logger = Logger.getLogger(CustomPostFilter.class.getName());

    @Override
    public Mono<Void> filter(ServerWebExchange exchange, org.springframework.cloud.gateway.filter.GatewayFilterChain chain) {
        return chain.filter(exchange).then(Mono.fromRunnable(() -> {
            ServerHttpResponse response = exchange.getResponse();
            logger.info("Post Filter: Response status code is " + response.getStatusCode());
            // Add any custom logic here
        }));
    }

    @Override
    public int getOrder() {
        return Ordered.LOWEST_PRECEDENCE;
    }
}

각 필터를 구현 하기 위해서는 인터페스를 구현하고 filter 메서드를 오버라이드 해야한다


실습

아래와 같은 환경으로 실습을 진행

build.gradle 설정

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-web'
	  implementation 'org.springframework.boot:spring-boot-starter-actuator'
	  implementation 'org.springframework.cloud:spring-cloud-starter-gateway'
	  implementation 'org.springframework.cloud:spring-cloud-starter-netflix-eureka-client'
}

application.yaml 설정(예시)

server:
  port: 1234  # 게이트웨이 서비스가 실행될 포트 번호

spring:
  main:
    web-application-type: reactive  # Spring 애플리케이션이 리액티브 웹 애플리케이션으로 설정됨
  application:
    name: example  # 애플리케이션 이름을 'example'로 설정
  cloud:
    gateway:
      discovery:
        locator:
          enabled: true  # 서비스 디스커버리를 통해 동적으로 라우트를 생성하도록 설정
      routes:
        - id: example  # 라우트 식별자
          uri: lb://example # 'example'라는 이름으로 로드 밸런싱된 서비스로 라우팅
          predicates:
            - Path=/example/** # /example 시작하는 모든 요청을 이 라우트로 처리   
      discovery:
        locator:
          enabled: true  # 서비스 디스커버리를 통해 동적으로 라우트를 생성하도록 설정
eureka:
  client:
    service-url:
      defaultZone: http://localhost:{ Eureka 서버 설정 포트}/eureka/

인스턴스 확인(유레카서버에 등록 확인)

필터 동작!

정리

Spring Cloud Gateway 는 사용자(클라이언트)의 요청을 각각의 서비스로 매칭 시켜주고
필터를 통해 효과적으로 공통적인 요청과 응답을 관리하여 시스템의 유지보수성과 성능을 향상시킴

profile
사소한일에도 최선을 다하기

0개의 댓글

관련 채용 정보