MSA 전환 - Spring Cloud Gateway

Haechan Kim·2024년 3월 10일

MSA 전환

목록 보기
3/7

Spring Cloud Gateway

MSA 가장 앞단에서 클라이언트로부터 오는 요청 알맞게 각 서비스에 전달

항상 무중단 상태로 모든 요청 받아야 함.

특성

이전의 스프링부트, Eureka, Config 들은 블로킹 기반 → 모두 톰캣 엔진.

But 게이트웨이는 비지니스 로직 처리보단 단순히 지나가는 통로의 역할 (I/O 처리)

→ 논 블로킹 방식의 WebFlux, 네티 엔진 사용.

→ 이 경우 기존의 JPA 같은 블로킹 방식 사용할 수없음!

프로젝트 생성

  • 의존성
    • Gateaway
dependencies {
	implementation 'org.springframework.cloud:spring-cloud-starter-gateway'
	testImplementation 'org.springframework.boot:spring-boot-starter-test'
	implementation 'org.springframework.cloud:spring-cloud-starter-netflix-eureka-client'
}

라우팅 전략

다양한 라우팅 전략이 존재.

path route 기반으로 진행해보자 : https://docs.spring.io/spring-cloud-gateway/docs/current/reference/html/#the-path-route-predicate-factory

  • 게이트웨이 라우팅 설정
    • 외부 변수 설정 - application.properties

      # 8080으로 들어오는 요청을 8081, 8082로 라우팅
      # http://localhost:8080/ms1/start
      server.port=8080
      
      spring.cloud.gateway.routes[0].id=ms1
      spring.cloud.gateway.routes[0].predicates[0].name=Path
      spring.cloud.gateway.routes[0].predicates[0].args.pattern=/ms1/**
      spring.cloud.gateway.routes[0].uri=http://localhost:8081
      
      spring.cloud.gateway.routes[1].id=ms2
      spring.cloud.gateway.routes[1].predicates[0].name=Path
      spring.cloud.gateway.routes[1].predicates[0].args.pattern=/ms2/**
      spring.cloud.gateway.routes[1].uri=http://localhost:8082
    • Config 클래스를 통해 자바 코드로 설정도 가능.

      @Configuration
      public class CustomRoute {
      
          // 라우팅 설정 빈 등록
          @Bean
          public RouteLocator cRoute(RouteLocatorBuilder builder) {
              return builder.routes()
                      .route("ms1", r -> r.path("/ms1/**")
                              .uri("http://localhost:8081"))
                      .route("ms2", r -> r.path("/ms2/**")
                              .uri("http://localhost:8082"))
                      .build();
          }
      }

게이트웨이 Eureka 로드밸런싱

게이트웨이와 Eureka 서버 연동 이유?

MSA는 특정 서버에 많은 부하 걸리면 (User 경로에 부하 걸렸다고 가정), 동일 User 어플리케이션 자동 스케일 아웃 (auto 스케일링)

게이트웨이는 오토 스케일링 된 새로 생긴 서버의 ip는 알지 못함.

→ Eureka 서버가 새로 생긴 서버 주소 수집해서 게이트웨이에게 알려줌.

SCG Eureka 클라이언트 설정

  • 의존성
    • gateway 서버에 Eureka 의존성 추가
implementation 'org.springframework.cloud:spring-cloud-starter-netflix-eureka-client'
  • Eureka 관련 설정 추가
    • application.properties
# 유레카 서버에 등록할것인지
eureka.client.register-with-eureka=true

# 유레카 서버에 등록된 다른 서버들 정보 가져올것인지
eureka.client.fetch-registry=true

# 유레카 서버 주소
eureka.client.service-url.defaultZone=http://아이디:비밀번호@아이피:8761/eureka

# load balancing
spring.cloud.gateway.routes[0].id=ms1
spring.cloud.gateway.routes[0].predicates[0].name=Path
spring.cloud.gateway.routes[0].predicates[0].args.pattern=/ms1/**
spring.cloud.gateway.routes[0].uri=lb://MS1

0개의 댓글