Gateway Service

duckbill413·2024년 7월 30일
0

Spring Cloud

목록 보기
1/10
post-thumbnail

API Gateway Service

  • API Gateway Service는 사용자가 설정한 라우팅 설정에 따라서 각각 엔드포인트로 클라이언트를 대신해서 요청하고 응답을 받으면 다시 클라이언트한테 전달해주는 프록시의 역할을 수행
  • 시스템의 내부 구조는 숨기고 외부의 요청에 대해서 적절한 형태로 가공해서 응답할 수 있다는 장점을 지님

기능

  • 인증 및 권한 부여
  • 서비스 검색 통합
  • 응답 캐싱
  • 정책, 회로 차단기 및 Qos 다시 시도
  • 속도 제한
  • 부하 분산
  • 로깅, 추적, 상관 관계
  • 헤더 , 쿼리 문자열 및 청구 변환
  • IP 허용 목록에 추가

Netflix Ribbon

  • Spring Cloud에서의 MSA 간 통신
    1. RestTemplate

      RestTemplate restTemplate = new RestTemplate();
      restTemplate.getForObject("http://localhost:8080", User.class);
    2. FeignClient

      @FeignClient("stores')
      public interface StoreClient {
      		@RequestMapping(method = RequestMethod.GET, value = "/stores")
      		List<Store> getStores();
      }
  • Ribbon: Client side Load Balancer
    • 비동기화 처리에 어려움이 있어 현재는 많이 사용되지 않음
    • 마이크로 서비스의 이름으로 호출 가능
    • Health Check

Netflix Zuul

Zuul은 Netflix의 애플리케이션 게이트웨이로, 동적 라우팅, 모니터링, 내구성 및 보안 기능을 제공합니다. 이 프로젝트는 L7 애플리케이션 게이트웨이로서 다음과 같은 특징을 가지고 있습니다:

  • 동적 라우팅: 요청을 적절한 백엔드로 라우팅합니다.
  • 모니터링: 요청 및 응답을 모니터링하여 성능 및 상태를 확인합니다.
  • 내구성: 다양한 상황에서 안정적으로 작동합니다.
  • 보안: 보안 기능을 제공하여 요청을 안전하게 처리합니다.

Netflix Ribbon, Zuul (Deprecated)

Netflix Ribbon은 2.0 버전 이전에 동기적으로 작동했으나 그 한계로 인하여 2 버전 이후에는 비동기적으로 작동될 수 있도록 변경되었습니다.

하지만, 여전히 다른 라이브러리와의 호환성 문제로 인하여 결국 Zuul과 함께 Deprecated 되게 되었습니다.

현재는 Ribbon을 대체하기 위해서 Spring Cloud Gateway가 대신해서 사용되고 있습니다.


Spring Cloud Gateway

Spring Cloud Gateway는 스프링 생태계에서 제공하는 API 게이트웨이 솔루션입니다. API 게이트웨이는 클라이언트 요청을 받아 적절한 서비스로 라우팅하고, 로드 밸런싱, 인증, 필터링, 모니터링 등의 기능을 제공합니다. Spring Cloud Gateway는 네티(reactor-netty) 기반으로 만들어졌으며, 비동기식 논블로킹 방식으로 높은 성능을 제공합니다.

주요 기능:

  1. 라우팅: 클라이언트의 요청을 특정 경로에 따라 적절한 마이크로서비스로 라우팅합니다.
  2. 필터링: 요청과 응답을 가로채어 다양한 작업(인증, 로깅, 데이터 변경 등)을 수행할 수 있습니다.
  3. 로드 밸런싱: 여러 인스턴스들 사이에 트래픽을 분산시킵니다. Spring Cloud LoadBalancer를 통해 쉽게 구현할 수 있습니다.
  4. 서비스 디스커버리 통합: Eureka, Consul 등과 통합하여 동적으로 인스턴스 목록을 관리할 수 있습니다.

Spring Cloud Gateway 실습

실습을 위하여 2개의 Service Project와 하나의 Gateway Project를 생성

  1. Service Project 생성 (2개 모두 동일)
    1. Dependency 추가

      • Web → Spring Web
      • Spring Cloud Discovery → Eureka Discovery Client
    2. Controller 생성

      @RestController
      @RequestMapping("/first-service")
      public class FirstServiceController {
          @GetMapping("/welcome")
          public String welcome() {
              return "Welcome to the First Service";
          }
      }
    3. application.yml 수정

      server:
        port: 8081 # Service2 -> 8082
      
      spring:
        application:
          name: first-service
      eureka:
        client:
          fetch-registry: false
          register-with-eureka: false
      
      • eureka client 로 사용하지 않기 때문에 fetch-registry, register-with-eureka 옵션을 false로 설정
    4. 두번째 Service도 FirstSecond로 변경하여 동일하게 생성

  2. Gateway Project 생성
    1. Dependency 추가

      • Spring Cloud Discovery → Eureka Discovery Client
        implementation 'org.springframework.cloud:spring-cloud-starter-netflix-eureka-client'
      • Spring Cloud Routing → Gateway
        implementation 'org.springframework.cloud:spring-cloud-starter-gateway'
    2. application.yml 수정

      server:
        port: 8000
      
      eureka:
        client:
          register-with-eureka: false
          fetch-registry: false
          service-url:
            defaultZone: http://localhost:8761/eureka
      
      spring:
        application:
          name: api-gateway-service
        cloud:
          gateway:
            routes:
              - id: first-service
                uri: http://localhost:8081/
                predicates:
                  - Path=/first-service/**
              - id: second-service
                uri: http://localhost:8082/
                predicates:
                  - Path=/second-service/**
      • cloud.gateway.mvc.routes에 기존에 생성한 Service Project를 등록
      • id에는 Service Project의 Name을 등록
      • uri는 Service Project의 Base-uri를 등록
      • predicates에는 Routing을 위한 Path를 등록해 준다.
  3. Gateway를 이용한 Routing 확인
    1. http://localhost:8000/first-service/welcome 접속

    2. 8000 포트를 사용하는 Gateway Project가 Service Project로 Routing

profile
같이 공부합시다~

0개의 댓글