본문 바로가기
Programming/Spring

[Spring] Spring Cloud Load Balancer 설정 오류 해결 과정

by emgp 2024. 1. 19.

사용 환경

intellij, Spring boot 3.2.1, java 17, gradle 8.5

 

문제 상황

강의를 보면서 로드밸런서 설정을 하는데, 코드 상에서 잘못된게 없었지만, 로드밸런싱을 통한 API 호출이 되지 않는 문제가 있었습니다.

처음에는 주소 매핑 문제인줄 알고, 오타를 열심히 찾아봤는데, 문제가 될 것은 없었습니다.

 

그렇다면 주소가 올바르게 맵핑되었다고 생각했는데도, Whitelabel Error 는 왜 발생한 것일까요?

 

문제 해결 과정

우선, 로드밸런싱을 통해 user-service 프로젝트의 API를 호출해야 되는데, user-service, gateway 프로젝트 어느 하나에서도 로그가 찍히지 않았습니다. 해당 문제가 발생한 원인은 로드밸런싱이 제대로 동작하고 있지 않아서 발생하는 것이라고 판단하였고, 문제를 해결하기 위해 application.yml 파일을 보면서 잘못 설정한 것이 있는지 확인해보았습니다.

gateway의 application.yml의 일부 입니다.

spring:
  application:
    name: gateway-service
  cloud:
    gateway:
      routes:
        - id: user-service
          uri: lb://USER-SERVICE
          predicates:
            - Path=/user-service/**

user-service는 application.yml에서 application name을 user-service로 지정했기 때문에, 유레카 서버에 USER-SERVICE라는 이름으로 등록되게 됩니다.

 

 

따라서 gateway의 applicayion.yml에서 route를 설정한 것을 보면,

클라이언트에서 Path의 정보로 요청이 전달되게 되면, 해당 uri의 주소로 포워딩되어 요청이 실행되게 됩니다.

 

따라서, 서버주소:gateway port 번호/user-service/서비스 가 요청되면, 서버주소:user-service port 번호/서비스 가 요청되는 것이므로, application.yml는 잘 설정되어 있었습니다.

 

application.yml의 문제가 없기 때문에, 무언가 설정이 잘못되었나 생각이 들었고, build.gradle을 확인하였습니다.

우선, spring cloud의 loadbalancer를 사용하려 했는데, 의존성 주입이 되지 않았습니다.

그래서 아래의 코드를 dependencies에 추가해주었습니다.

 

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

 

로드밸런서를 등록해주었는데 오류가 여전해 오류가 발생하였습니다.

초기에 intellij로 spring boot 프로젝트를 만들 때, gateway depencency를 추가해줬는데, spring-cloud-gateway-mvc가 등록되어 있던 것이 문제였습니다.

 

spring-cloud-gateway-mvc에서 mvc를 없애고 실행하니 로드밸런싱이 잘 되고, 제가 원하는 결과를 얻을 수 있었습니다!

 

제 gateway application.yml의 depencenies입니다.

dependencies {
    implementation 'org.springframework.cloud:spring-cloud-starter-gateway'
    implementation 'org.springframework.cloud:spring-cloud-starter-loadbalancer'
    implementation 'org.springframework.cloud:spring-cloud-starter-netflix-eureka-client'
    compileOnly 'org.projectlombok:lombok'
    annotationProcessor 'org.projectlombok:lombok'
    testImplementation 'org.springframework.boot:spring-boot-starter-test'
}

 

문제 해결 요약

1. spring-cloud-starter-loadbalancer 의존성 주입

2. gateway-mvc 에서 gateway로 변경

 

마무리

제가 직면한 문제는 이렇게 해결했는데, netty 서버, tomcat 서버, 블록킹, ... 처음 들어보는 용어들이 많았습니다.

다음 포스팅은 이걸 해결하기 위해 찾아본 것들에 대해 정리해보겠습니다.