Spring Cloud Gateway를 통한 엣지 서버 구현

날아올라돼지야·2024년 8월 28일
0

Spring Cloud를 사용하여 마이크로서비스 네트워크 내에서 엣지 서버를 구현하는 방법을 살펴보겠습니다.

Spring Cloud Gateway 소개

Spring Cloud에는 Spring Cloud Gateway라는 프로젝트가 있으며, 이를 통해 프로덕션 수준의 엣지 서비스를 매우 쉽게 구축할 수 있습니다. Spring Cloud Gateway는 Spring의 리액티브(reactive) 프레임워크를 기반으로 구축되었기 때문에, 적은 메모리와 적은 스레드로도 많은 트래픽을 효율적으로 처리할 수 있습니다.

Spring Cloud Gateway는 클라이언트 애플리케이션과 실제 마이크로서비스 간의 중개 역할을 수행하며, 모든 외부 트래픽은 이 게이트웨이를 통해 들어옵니다. 게이트웨이는 클라이언트 애플리케이션이 직접 마이크로서비스에 접근할 수 없도록 하여, 보안 및 라우팅과 같은 정책을 강제할 수 있습니다.

Spring Cloud Gateway의 주요 기능

  • 동적 라우팅: 요청의 컨텍스트에 따라 동적으로 라우팅할 수 있습니다. 예를 들어, API 버전 정보가 헤더에 포함된 경우 해당 버전에 맞는 백엔드 마이크로서비스로 요청을 라우팅할 수 있습니다.

  • 스티키 세션 처리: 특정 사용자의 요청이 항상 동일한 인스턴스로 전달되도록 하는 스티키 세션을 지원합니다.

  • 다양한 교차 기능적 요구 사항 처리: 보안, 로깅, 감사, 메트릭 수집 등 다양한 비즈니스 요구 사항을 중앙에서 처리할 수 있습니다.

Spring Cloud Gateway의 장점

Spring Cloud Gateway는 Spring Reactor를 기반으로 구축되어 비차단(non-blocking) 방식으로 동작하며, 서킷 브레이커(Circuit Breaker) 및 서비스 디스커버리와의 통합을 제공합니다. 이러한 이유로 Spring Cloud Gateway는 Jewel과 같은 다른 게이트웨이 솔루션보다 성능이 우수합니다.

Spring Cloud Gateway의 내부 아키텍처

Spring Cloud Gateway는 클라이언트 애플리케이션과 마이크로서비스 간에 위치하여 모든 요청을 중앙에서 관리하며, 정책 적용 지점(Policy Enforcement Point) 역할을 합니다. 이를 통해 라우팅, 보안, 로깅, 감사 등의 정책을 효과적으로 구현할 수 있습니다.

Spring Cloud Gateway는 다양한 기능을 제공하며, 내부적으로 프레디케이트(Predicate)필터(Filter)를 사용하여 요청을 처리합니다. 이러한 개념들은 Spring Cloud Gateway의 핵심 요소로, 복잡한 비즈니스 요구 사항을 처리하는 데 사용됩니다.

공식 문서 소개

Spring Cloud Gateway에 대해 더 알아보려면 Spring 공식 웹사이트(spring.io)를 방문하여 Spring Cloud Gateway 프로젝트에 대한 문서를 확인할 수 있습니다. 여기에는 Spring Cloud Gateway의 기능, 구성 요소, 및 다양한 활용 사례가 설명되어 있습니다.

Spring Cloud Gateway의 내부 아키텍처 이해하기

외부 요청 처리 흐름

먼저, 외부 클라이언트(모바일 애플리케이션, 웹사이트, 기타 REST 기반 API)로부터 요청을 받게 됩니다. 이 요청은 마이크로서비스 네트워크의 엣지 서버 역할을 하는 게이트웨이 서버로 전달됩니다. 이때 Gateway Handler Mapping이라는 중요한 컴포넌트가 요청 경로를 식별하고, 해당 요청을 어느 마이크로서비스로 라우팅할지 결정하는 역할을 합니다.

하지만, Gateway Handler Mapping은 자동으로 결정하지 않고, 개발자가 사전에 설정한 라우팅 관련 구성에 따라 경로를 결정합니다. 이 과정은 Spring Cloud Gateway의 첫 번째 단계로, 요청이 어떤 마이크로서비스로 전달되어야 하는지 식별하는 역할을 합니다.

프레디케이트(Predicate)와 프리 필터(Pre Filter)

요청이 라우팅될 마이크로서비스를 식별한 후, 게이트웨이는 개발자가 설정한 프레디케이트(Predicate)프리 필터(Pre Filter)를 검사합니다. 이 두 가지는 실제 마이크로서비스로 요청을 전달하기 전에 실행됩니다.

프레디케이트(Predicate): 프레디케이트는 참 또는 거짓을 반환하는 논리적 조건입니다. 개발자는 특정 조건이 충족될 때만 요청을 마이크로서비스로 전달하도록 설정할 수 있습니다. 만약 조건이 충족되지 않으면, 요청을 거부하고 적절한 오류 메시지를 반환합니다.

프리 필터(Pre Filter): 프리 필터는 요청을 처리하기 전에 다양한 작업을 수행할 수 있습니다. 예를 들어, 요청 유효성 검사, 감사 및 로깅, 요청 수정, 보안 검사 등을 수행할 수 있습니다. 이러한 비기능적 요구 사항이나 크로스컷팅 요구 사항은 프리 필터를 통해 구현할 수 있습니다.

마이크로서비스로의 요청 전달 및 포스트 필터(Post Filter)

프레디케이트와 프리 필터가 모두 통과되면, 요청은 실제 마이크로서비스로 전달됩니다. 마이크로서비스는 요청을 처리한 후 응답을 반환합니다. 이때 포스트 필터(Post Filter)가 응답을 인터셉트하여, 응답을 수정하거나 추가 검증을 수행할 수 있습니다.

포스트 필터는 응답이 클라이언트 애플리케이션으로 반환되기 전에 실행되며, 모든 포스트 필터가 실행된 후, 응답은 Gateway Handler Mapping을 통해 최종적으로 클라이언트 애플리케이션에 전달됩니다.

사전 정의된 필터

Spring Cloud Gateway의 또 다른 장점은, 다양한 시나리오에서 사용할 수 있는 사전 정의된 필터를 제공한다는 점입니다. Spring Cloud Gateway 공식 문서를 참고하여, 개발자는 이러한 필터를 쉽게 구성하고 사용할 수 있습니다.

예를 들어, Spring Cloud Gateway는 요청 헤더를 추가하는 필터, 요청 파라미터를 추가하는 필터, 응답 헤더를 추가하는 필터, 서킷 브레이커 필터, 요청 본문 수정 필터 등 다양한 필터를 제공합니다.

이 공식 문서에서는 Spring Cloud Gateway에 대한 전반적인 정보와 함께, 다양한 필터, 프레디케이트, 라우팅 구성 방법 등을 다루고 있으므로, 필요할 때 참조하여 사용하면 유용합니다.

Spring Cloud Gateway로 엣지 서버(API Gateway) 구축하기

자 이제, Spring Cloud Gateway를 사용하여 엣지 서버 또는 API 게이트웨이를 만드는 방법을 알아보겠습니다.

프로젝트 설정

  1. 프로젝트 생성:
    • start.spring.io에서 Maven 프로젝트를 선택하고, Java 17을 사용하여 새로운 Spring Boot 프로젝트를 생성합니다.
    • Groupcom.easybytes, ArtifactNameGatewayServer로 설정합니다.
    • Dependencies로는 Spring Cloud Gateway, Eureka Discovery Client, Config Client, Actuator, DevTools를 추가합니다.
  2. 프로젝트 구조 준비:
    • 프로젝트를 생성한 후, 해당 프로젝트를 작업 디렉토리(예: Section9)에 복사하고 압축을 해제합니다.
    • IntelliJ IDEA에서 Section9 폴더를 열어 프로젝트를 로드합니다.
  3. Google Jib 플러그인 추가:
    • Gateway Server의 pom.xml 파일에 Google Jib 플러그인을 추가합니다. 이는 Docker 이미지를 생성할 때 사용됩니다.
    • 다른 마이크로서비스 프로젝트의 pom.xml 파일에서도 태그 이름을 S9으로 변경합니다.

설정 파일 구성

  1. application.yml 파일 생성 및 수정:

    • 기존 application.properties 파일을 application.yml 파일로 변경하고, 기본적인 설정을 추가합니다.
    • 필요한 속성만 유지하고, 필요 없는 속성(예: 데이터베이스 설정, JPA 설정 등)은 삭제합니다.
    • actuator와 관련된 설정을 유지하고, Eureka와 관련된 설정은 Config Server에서 관리하기 위해 삭제합니다.
  2. Gateway 서버 설정 추가:

    • application.yml 파일에 다음 설정을 추가합니다:
      spring:
        cloud:
          gateway:
            discovery:
              locator:
                enabled: true
    • 이 설정을 통해 Gateway 서버가 Eureka 서버를 통해 마이크로서비스를 찾고, 외부 요청을 해당 마이크로서비스로 라우팅할 수 있게 합니다.
  3. Config Server 설정 업데이트:

    • GitHub의 설정 리포지토리에 gateway-server.yml 파일을 생성하고, Gateway 서버에 필요한 설정(포트, Eureka 관련 설정 등)을 추가합니다.

Spring Cloud Gateway를 통한 Gateway Server 실행 및 테스트

이제 우리가 구축한 Gateway 서버를 실제로 실행하고 테스트하는 방법을 살펴보겠습니다.

1. 기타 서비스 시작

  • 먼저 Config Server와 Eureka Server를 시작합니다.
  • 이후에 Accounts, Cards, Loans 마이크로서비스를 차례로 시작합니다.
  • 모든 서비스가 시작된 후 마지막으로 Gateway Server를 시작합니다.

2. Gateway Server 시작:

  • Gateway Server를 디버그 모드에서 시작합니다. Gateway Server는 포트 8072에서 실행됩니다.

3. Eureka 대시보드 확인:

  • Eureka 대시보드를 열고 모든 마이크로서비스가 Eureka Server에 등록되었는지 확인합니다.
  • Gateway Server 역시 Eureka Server에 등록되어야 합니다.

Gateway Server 테스트

1. Actuator 엔드포인트 확인:

  • 브라우저에서 http://localhost:8072/actuator를 열어 Actuator의 기본 정보를 확인합니다.
  • JSON 응답에서 /actuator/gateway/routes 엔드포인트를 확인할 수 있습니다.

2. Gateway Routing 확인:

  • 브라우저에서 http://localhost:8072/actuator/gateway/routes를 열어 Gateway의 라우팅 정보를 확인합니다.
  • 각 마이크로서비스(Accounts, Loans, Cards)에 대해 라우팅 정보가 포함되어 있습니다.
  • 예를 들어, /loans 경로로 요청이 오면 Loans 마이크로서비스로 요청을 전달합니다.

3. Postman을 통한 요청 테스트:

  • Postman에서 Gateway Server를 통해 Accounts 마이크로서비스에 요청을 보냅니다.
  • http://localhost:8072/ACCOUNTS/api/create 경로로 POST 요청을 보내 계정을 생성합니다.
  • 요청이 성공하면, Gateway Server가 Accounts 마이크로서비스로 요청을 적절히 전달한 것을 확인할 수 있습니다.
  • 동일한 방법으로, Loans 및 Cards 마이크로서비스에 대한 요청도 Gateway Server를 통해 테스트할 수 있습니다.

향후 계획

  • 현재 구성된 Gateway Server는 기본적인 라우팅 기능을 제공합니다.
  • 다음 단계에서는 Gateway Server를 더욱 최적화하고, 보안 기능을 추가하여 클라이언트가 직접 마이크로서비스를 호출하지 못하도록 할 예정입니다.
profile
무슨 생각하며 사니

0개의 댓글