Today
-
Yesterday
-
Total
-

ABOUT ME

-

  • Spring Cloud MSA - 6 | Spring Cloud Gateway, Load balancing 구현하기
    ▼ Backend/└ MSA, Spring Cloud 2021. 12. 7. 11:18
    반응형

    Spring Cloud MSA | 마이크로 서비스 아키텍처 (microservice architecture, MSA)

     

    ▶ Spring Cloud Gateway (SCG)

    마이크로 서비스 앞단에 위치하며 요청들을 라우팅 설정에 따라서 클라이언트 대신에 요청하고 응답하면 다시 사용자에게 전달해주는 Proxy 역할을 한다.

     

    즉, 모든 요청을 받아 라우팅 설정에 따라 요청한 서비스로  요청, 응답하는 입구 역할을 한다.

    📌 특징

    • Spring Framework 5, Project Reactor 및 Spring Boot 2.0을 기반으로 구축
    • 모든 요청 속성에서 경로를 일치시킬 수 있다.
    • 조건자와 필터는 경로에 따라 다르다.
    • 회로 차단기 통합
    • Spring Cloud Discovery, Client 통합 
    • 요청 속도 제한
    • 경로 재작성

     

     

    build.gradle

    implementation 'org.springframework.cloud:spring-cloud-starter-gateway'

     

    application.yml

    sping:cloud: gateway:
    spring-cloud-gateway 프로젝트 application.yml에 설정할 마이크로 서비스 정보를 등록한다.

     

    server: 
      port: 8000
    spring: 
      application:
        name: venh-gateway
      profiles:
        active: dev
      config: 
        import: optional:configserver:http://localhost:8888
      cloud:
        gateway:
          routes:
            - id: venh-msa
              uri: http://localhost:8080
              predicates:
                - Path=/venh-msa/**
            - id: venh-msa-support
              uri: http://localhost:8090
              predicates:
                - Path=/venh-msa-support/**

     

    Config-Name Description
    spring.cloud.gateway.routes.id 해당 라우팅이 어떠한 이름으로 라우팅 될 것인지에 대한 이름
    spring.cloud.gateway.routes.uri 포워딩할 대상 지정
    spring.cloud.gateway.routes.predicates 특정 요청이 predicates에 맞는 조건으로 들어오면 해당 route를 수행할 것을 지정

     

    아래 순서대로 서비스를 실행한다.

    1. Eureka Config Server 실행

    2. Eureka Server(서비스 디스커버리) 실행

    3. Microservice 실행

    4. Gateway service 실행

     

    Eureka Server(Dashboard) (http://localhost:8761)에 서비스들이 정상적으로 실행되었는지 확인한다.

    VENH-GATEWAY (게이트웨이)
    VENH (마이크로 서비스 1)
    VENH-SUPPORT (마이크로 서비스 2)

     

     

     

    설정한 게이트웨이 (Port: 8000)를 호출하여 마이크로 서비스1 (VENH, Port: 8080)이 호출되는지 테스트한다.

    http://localhost:8000/venh-msa/param-test
    yml에 predicates에서 Path=/venh-msa/**로 설정했기 때문에 마이크로 서비스 1의 /venh-msa/~ 매핑 URL 이 호출된다.

     

    @GetMapping("/venh-msa/{param}")
    public String getVenhMsa(@PathVariable String param, HttpServletRequest request) {
        logger.info("==> request.getLocalPort : " + request.getLocalPort());
        return "VenhMsa Param : " + param;
    }

     

     

     

    ▶ Load balancing (로드밸런싱, 부하분산)

    정상적으로 확인이 되었으면 이번에는 직접 포트와 서버의 주소를 명시하지 말고, Eureka Server로 관리되고 있는 서비스들의 애플리케이션 정보를 이용하여 로드밸런싱을 구성해본다.

     

    Eureka Server에 등록되어있는 마이크로 서비스들의 Application Name 을 이용하여 설정한다.

    Eureka Dashboard에서 확인이 가능하다.

     

     

    주소와 포트로 설정 되어있던 uri 부분을 lb://Application Name으로 변경한다.

     

    server: 
      port: 8000
    spring: 
      application:
        name: venh-gateway
      profiles:
        active: dev
      config: 
        import: optional:configserver:http://localhost:8888
      cloud:
        gateway:
          routes:
            - id: venh-msa
              uri: lb://VENH
              predicates:
                - Path=/venh-msa/**
            - id: venh-msa-support
              uri: lb://VENH-SUPPORT
              predicates:
                - Path=/venh-msa-support/**

     

    마이크로 서비스의 애플리케이션을 추가 생성 후 로드밸런싱 테스트

    1) 프로젝트  우클릭   →  Run As  →  Run Configuration에서 동작중인 애플리케이션을 똑같이 하나 더 등록한다.
    *IntelliJ에서는 Edit Configurations..

    2) Arguments  →  VM arguments에서 -Dserver.port=포트번호 를 지정하고 Run(시작)한다. 

     

     

     

    Eureka Dashboard에 VENH 마이크로 서비스가 하나 더 추가된 걸 확인할 수 있다.

     

     

     

    위에서 테스트했던 URL로 호출해보면 로드밸런싱 되어 서비스를 번갈아 가면서 호출하는 것을 확인할 수 있다.
    *확인을 위해 호출 시 포트를 콘솔 로그로 남기도록 logger.info 를 추가해주었다.

    물론 2개의 서비스중 하나의 서비스가 종료되면 나머지 하나의 서비스로 계속 호출된다.

    http://localhost:8000/venh-msa/param-test

     

     

    GitHub

     

    Reference

     

    반응형

    댓글

Designed by Tistory.