[Spring Boot] Spring Cloud Gateway -Load Balancer -MSA(5)

모지리 개발자·2022년 9월 22일
0

MSA

목록 보기
5/9

Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)
를 수강하면서 작성한 글입니다.

Intro

쏟아지는 트래픽을 여러대로 서버로 분산해주기 위해서는 무엇이 필요할까요? 이때 필요한 기술이 로드 밸런싱 입니다.

로드 밸런서란?

클라이언트와 서버풀 사이에 위치하며, 한대의 서버로 부하가 집중되지 않도록 트래픽을 관리해 각각의 서버가 최적의 퍼포먼스를 보일 수 있도록 합니다. 자세한 내용은 로드밸런서 에 잘 정리되어 있어서 읽고 다시 이 글을 읽어 주시면 좋을 것 같습니다ㅎㅎ

2개씩 띄어보자

앞선 글에서 생성했던 first-service와 second-service를 각각 2개씩(총 4개)를 띄어보겠습니다.
저는 Intellij에서 VM option을 통해 실행해보겠습니다.

해당 옵션을 주게 되면 yml파일에 포트가 작성되어있어도 설정한 옵션의 포트로 애플리케이션을 추가로 실행할 수 있습니다.
저는 first-service의 경우 9091, second-service의 경우 9092 포트를 추가해서 실행했습니다.

Eureka 서버에서 확인하기

Eureka서버에서 확인해보시면

와 같이 first-service 2개, second-service 2개 띄어져있습니다.

아주 잘 실행되지만...

postman을 통해 실행해보면 아주 잘 실행이 됩니다.
하지만 first-service 혹은 second-service로 요청이 들어왔을 경우 어떤 포트로 요청이 들어가고있는지 확인할 방법이 없습니다.
랜덤포트를 이용해서 확인해보도록 하겠습니다.

code 수정

이 글에서는 first-service만 수정해보도록 하겠습니다. second-service도 동일하게 변경해주시면 됩니다.

first-service - application.yml

server:
  port: 0

spring:
  application:
    name: my-first-service

eureka:
  client:
    fetch-registry: true
    register-with-eureka: true
    service-url:
      defaultZone: http://localhost:8761/eureka
  instance:
    instance-id: ${spring.application.name}:${spring.application.instance_id:${random.value}}
# 0번포트(랜덤포트)를 사용하게되면 애플리케이션을 여러개 실행했어도 Eureka서버에 1개만 실행되는 것처럼 보입니다. 이를 예방하기 위해 사용하는 옵션입니다.

port를 0으로 바꿔줍니다. 랜덤포트를 이용하겠다는 뜻입니다.

이제 어떤 포트로 요청이 들어갔는지 확인하기 위해 first-service의 코드를 수정해보겠습니다.
first-service-FirstServiceController

@Slf4j
@RestController
@RequestMapping("/first-service")
public class FirstServiceController {

    Environment env;

    @Autowired
    public FirstServiceController(Environment env) {
        this.env = env;

    @GetMapping("/check")
    public String check(HttpServletRequest request) {
        log.info("Server port = {}", request.getServerPort());
        return String.format("This is a message from First Service on PORT $s",
                env.getProperty("local.server.port"));
    }

다시 first-service 어플리케이션을 2개 실행시켜놓겠습니다. 그 후 Eureka서버에서 확인을 해보면 아래와 같이 first-service에 2개의 인스턴스가 등록되어있는 것을 볼 수 있습니다.

Postman으로 확인해보기

요청시마다 아래와 같이 포트가 변경되는 것을 알 수 있습니다.

주의할 점!

first-service 를 종료하고 바로 실행한다고 eureka 서버에 바로 등록이 되지 않습니다. eureka 서버는 인스턴스들에 대해 30초 간격으로(커스텀 가능) health check를 하는데 재등록이 되는 과정까지 시간이 좀 걸리기 때문에 조금만 기다렸다가 요청하시면 잘 나옵니다.

결론

로드밸런서에 대한 기능도 추가해보았습니다. Scale-out 방식으로 서버를 증설할 때 여러대의 서버로 트래픽을 균등하게 분산해주는 로드밸런싱은 반드시 필요한 기능이라고 합니다. 로드밸런서에 대한 개념과 중요성을 이해하고 많은 트래픽도 이겨낼 수 있는 서비스를 만드는데 꼭 필요한 기능이므로 잘 알고 있으면 좋을 것 같습니다ㅎㅎ

제가 잘못이해하고 있거나 잘못 작성한 부분이 있다면 지적, 비판, 피드백 뭐든 해주시면 감사하겠습니다!

profile
항상 부족하다 생각하며 발전하겠습니다.

0개의 댓글