ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Spring Cloud Gateway
    BackEnd/Spring Cloud 2022. 6. 22. 08:27
    반응형

    Spring Cloud Gateway

      Spring Cloud Gateway는 API Gateway의 하나로 MSA에서 사용되는 Proxy 서비스입니다. 단일 진입점에서 요청을 중앙 집중화하고 적절한 서비스로 라우팅합니다. Spring Cloud Ribbon(Client side Load Balancer)과 Spring Cloud Zuul(API Gateway)은 Spring boot 2.4에서 Maintenance 상태로 전환되었기에 Spring Cloud Gateway와 이전 글의 Eureka와 연동하는 방법에 대해 알아보겠습니다.

     

    API Gateway Service 특징

    https://docs.microsoft.com/ko-kr/dotnet/architecture/microservices/architect-microservice-container-applications/direct-client-to-microservice-communication-versus-the-api-gateway-pattern

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

     

    Dependencies

      아래와 같이 Spring Boot DevTools, Eureka Discovery Client 및 Gateway 의존성을 추가합니다.

     

    application.yml

    server:
      port: 8000 # port를 8000으로 지정합니다.
    
    eureka:
      client:
        register-with-eureka: true
        fetch-registry: true
        service-url:
          defaultZone: http://localhost:8761/eureka # Eureka에 등록합니다.
    
    spring:
      application:
        name: gateway-service # application명을 GATEWAY-SERVICE로 합니다. (Eureka Dashboard)
      cloud:
        gateway:
          routes:
            - id: user-service
              uri: lb://USER-SERVICE # Load Balancer (USER-SERVICE: Eureka Dashboard에 등록된 Application명)
              predicates:
                - Path=/user-service/**
                - Method=GET,POST
              filters:
                - RemoveRequestHeader=Cookie
                - RewritePath=/user-service/(?<segment>.*), /$\{segment}

      Spring Cloud Gateway는 Gateway Handler Mapping이 요청을 받아 Predicate 수행 후 Filter를 적용합니다. Filter는 Pre Filter와 Post Filter가 존재합니다. application.yml에 적용된 predicates는 호출 url: /user-service 이하 전부, Method: GET, POST 방식에만 적용한다는 의미이며, filters는 RequestHeader에서 Cookie를 제거하고 요청된 url(예: /user-service/welcome)에서 "/user-service" 부분을 제외하고 요청한다는 의미입니다.

     

      이전 글의 Eureka, user-service 및 gateway-service를 기동하면 Eureka Dashboard에 아래와 같이 인스턴스가 등록됩니다. 확인을 위해 user-service에 UserController를 추가합니다.

    Eureka Dashboard

    package com.example.userservice;
    
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;
    
    @RestController
    @RequestMapping("/")
    public class UserController {
    
      @GetMapping("/welcome")
      public String welcome() {
    
        return "Hello, User-service";
      }
    }

     

      클라이언트는 GATEWAY-SERVICE로 요청을 보냅니다.

      해당 요청은 GET방식의 "/user-service/**"에 해당되기에 application.yml에 설정한대로 USER-SERVICE로 로드 밸런싱(Load Balancing)됩니다. 단 USER-SERVICE 요청 시 url에서 "/user-service"를 제외하고 "http://192.168.35.111:8000/welcome"와 같이 호출하게 됩니다.

     

      Spring Cloud Gateway Filters 적용은 아래 참고 정보 API Gateway Service.pdf를 참고하시면 됩니다.

     

     

     

    [참고 정보]

    반응형

    'BackEnd > Spring Cloud' 카테고리의 다른 글

    Spring Cloud Config  (0) 2022.07.02
    Spring Cloud Netflix Eureka  (0) 2022.06.18
    Spring Cloud  (0) 2022.06.09
    MSA(Microservice Architecture)  (0) 2022.06.08
    Cloud Native Application  (0) 2022.05.28

    댓글

Designed by Tistory.