ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • SCG - Eureka 연동 및 로드밸런싱
    스프링/스프링 클라우드 MSA 2024. 8. 5. 15:55

    MSA는 부하가 걸리면 자동으로 sclae out을 하는 기능을 내부적으로 가진다. 그렇기 때문에 라우팅 테이블에서 auto sclaing 된 후의 ip 주소를 알아야 한다.

     

    SCG와 연동된 Eureka Server가 SCG에 리스트를 보내줘서 작동을 돕는다.

     

     

    dependencies {
    	implementation 'org.springframework.cloud:spring-cloud-starter-netflix-eureka-client' // 추가
    	implementation 'org.springframework.boot:spring-boot-starter-webflux'
    	implementation 'org.springframework.cloud:spring-cloud-starter-gateway'
    	testImplementation 'org.springframework.boot:spring-boot-starter-test'
    	testImplementation 'io.projectreactor:reactor-test' // WebFlux 테스트에 필요
    }

    SCG 프로젝트의 gradle에 eureka client로 동작할 수 있는 의존성을 추가한다.

     

     

    server.port=8080
    
    eureka.client.register-with-eureka=true
    # eureka server에 나를 등록할 것인가
    eureka.client.fetch-registry=true
    # eureka에 등록된 클라이언트들의 정보를 등록할 것인가
    eureka.client.service-url.defaultZone=http://admin:password@localhost:8761/eureka

    이후에 application.properties에 다음과 같은 설정을 추가해준다. 이전 포스팅에서 eureka client 설정으로 했던 것과 동일한 설정이다.

     

     

     

    Eureka Server 대시보드에 들어가보면 8081 포트와 8082 포트는 같은 비즈니스 로직을 수행하므로 이름을 ms1으로 동일하게 설정해서, 2개가 띄워졌다.

     

    그 아래 SCG도 client로 포함되었다.

     

     

    server.port=8080
    spring.application.name=SCG
    
    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
    
    eureka.client.register-with-eureka=true
    # eureka server에 나를 등록할 것인가
    eureka.client.fetch-registry=true
    # eureka에 등록된 클라이언트들의 정보를 등록할 것인가
    eureka.client.service-url.defaultZone=http://admin:password@localhost:8761/eureka

    로드밸런싱을 위해 추가 설정을 진행했다. 이전에 진행한 라우팅 설정에서 uri를 살짝 변경해줬는데, 이전에는 http://localhost:8081 같은 경로였는데, 이번에는 Eureka 대시보드에 이름으로 지정된 MS1 이라는 어플리케이션으로 라우팅한다는 의미로 lb://MS1으로 설정했다.

     

     

    ms1의 마이크로 서비스

    @RestController
    public class HomeController {
    
        @GetMapping("/ms1/first")
        public String home() {
            return "ms1";
        }
    }

     

    ms2의 마이크로 서비스

    @RestController
    public class HomeController {
    
        @GetMapping("/ms1/first")
        public String home() {
            return "ms2";
        }
    }

     

    이렇게 2개의 마이크로 서비스를 같은 경로로 해둔 다음에 응답을 다르게 해두었다.

     

     

    localhost:8080/ms1/first로 접근하면, ms1, ms2가 번갈아가며 나온다. 이를 통해 다른 경로의 라우팅 뿐만 아니라 sclae out에 따른 로드밸런싱까지 구현을 완료했다.

     

     

    실제로 MSA 환경을 구성하면 AWS의 auto scaling 및 로드 밸런싱을 진행하게 될건데, 비용 등의 이유로 실제로 해보지는 않겠지만 spring cloud의 동작 원리를 로컬에서라도 작동시켜봤다.

Designed by Tistory.