이전에 마이크로서비스들의 배포를 완료했고 이제 배포된 서비스들의 요청을 종합적으로 관리해주는 API Gateway를 적용하려고한다.
본인은 여러 API Gateway중에서 경량화된 MSA 구조에 최적화된 Spring Cloud Gateway를 적용시켜보려한다.

왜 사용할까?

먼저 API Gateway는 API 라우팅, 필터링, 로드밸런싱과 같은 효과적인 역할을 수행

  • 라우팅 : 데이터의 이동 경로를 결정
  • 로드 밸런싱 : 서버로 들어오는 트래픽을 균등하게 분배하여 부하를 분산
  • 필터 : 요청에 대한 보안이나 헤더를 추가해주는 특정 작업을 수행

왜 Spring Cloud Gateway인가?

장점 :

  • 오픈 소스 기반으로 비용이 없다.
  • Spring에서 제공하는 Spring Boot, Spring Security 등의 컴포넌트와 효율적인 조합 가능
  • WebFlux 기반의 Non-Blocking 사용 -> I/O 작업을 기다리지 않고 다른 작업을 수행(비동기)
  • yml 파일로 간단한 라우팅 설정가능
    단점 :
  • 다른 API Gateway에 비해 기능들이 미숙
  • UI 기반 관리 도구를 추가적으로 구성해야함
  • 모든 요청에 대한 추가적인 오버헤드를 갖게 되어 간단한 요청에 비효율적일 수 있음

동작 과정

  1. 사용자의 요청을 Gateway가 받음
  2. Gateway Handler Mapping에서 어떤 곳으로 라우팅할지 결정
  3. 해당 라우트에 대응하는 WebHandler가 실행
  • 이때 정의된 작업과 필터를 진행
  1. 해당 서비스로 요청
  • 이 과정에서 마이크로서비스들에게 전달
  1. 다시 API Gateway로 응답
  2. 사용자에게 응답

실습

프로젝트 생성

start.spring.io로 접속해서 프로젝트를 생성한다.

  • 의존성 추가
    • Gateway
    • Eureka Discovery Client

application.yml 작성

# 서버 설정
server:
  port: 80  # 애플리케이션이 실행될 포트 번호

# Spring 애플리케이션 설정
spring:
  application:
    name: gateway  # 애플리케이션의 이름 설정

  # Spring Cloud Gateway 설정
  cloud:
    gateway:
      mvc:
        routes: # 라우트 설정 시작
          - id: accountRoute  # 라우트 ID
            uri: http://j11a604.p.ssafy.io:8081 # 요청이 전달될 URI (여기에 실제 URI를 입력해야 함)
            predicates: # 요청을 필터링하는 조건
              - Path=/account/**  # /account/** 경로에 대한 요청을 처리

          - id: chatbotRoute
            uri: http://j11a604.p.ssafy.io:8082
            predicates:
              - Path=/chatbot/**

          - id: notificationRoute
            uri: http://j11a604.p.ssafy.io:8083
            predicates:
              - Path=/notification/**

          - id: paymentRoute
            uri: http://j11a604.p.ssafy.io:8084
            predicates:
              - Path=/payment/**

          - id: travelRoute
            uri: http://j11a604.p.ssafy.io:8085
            predicates:
              - Path=/travel/**

          - id: userRoute
            uri: http://j11a604.p.ssafy.io:8086
            predicates:
              - Path=/user/**
# Eureka 설정
eureka:
  instance:
    prefer-ip-address: true  # 인스턴스 등록 시 IP 주소를 선호
  client:
    register-with-eureka: true  # Eureka 서버에 등록 여부
    fetch-registry: true  # Eureka 서버에서 등록된 서비스 정보를 가져올지 여부
    service-url:
      defaultZone: http://j11a604.p.ssafy.io:8761/eureka # Eureka 서버의 기본 URL (여기에 실제 URL을 입력해야 함)

# 관리 엔드포인트 설정
management:
  endpoint:
    web:
      exposure:
        include: "*"  # 모든 관리 엔드포인트 노출

uri: http://j11a604.p.ssafy.io:8086 이 부분에서 로드 밸런서를 사용해서 부하를 분산시켜줄 수 있다.

  • 직접 서버 주소를 지정해주게되면 해당 포트에서 실행 중인 서비스에 직접 요청을 보내지만, 로드 밸런서를 사용하면 해당 서버의 인스턴스 중 하나로 요청이 라우팅 됩니다.
    ex) uri: lb://${ServerName}

    우선은 uri 주소로 직접 연결하여 진행하고 추후에 로드 밸런서를 사용해서 분산시켜보자
    다음단계(Eureka Server 적용)

profile
멋있는 사람 - 일단 하자

0개의 댓글

Powered by GraphCDN, the GraphQL CDN