이 글은 인프런 Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA) 강의를 듣고 쓴 글입니다.
Spring Cloud Netflix Eureka
이전에 계속 말했듯이, 하나의 서비스는 여러 인스턴스에서 작동될 수 있다. 이럴 때, 각 인스턴스는 서로 서버 혹은 포트번호가 달라야 한다.
따라서 클라이언트는 API Gateway, Load Balancer 등을 거쳐 Discovery Service에 등록된 인스턴스를 검색하고, 적절한 인스턴스에 찾아가게 된다. 이 Discovery Service 중 Netflix Eureka를 사용할 것이고, Spring Cloud에서 이것을 지원한다.
앞으로 온라인 쇼핑몰 E-commerce 예제를 통해 MSA를 익힐 것이다.
Eureka Service Discovery 프로젝트
Discovery Service를 제공하는 서버를 만들어보자.
프로젝트 생성 시 버전 호환이 중요하다. 특히, Java 11 버전과 Spring Boot 3.0 이상은 호환이 되지 않는다는 것을 유의해야 한다. Java 11버전 사용 시 Spring Boot 2 버전을 사용해야 한다. 빌드 자동화 툴은 Maven 으로 사용한다.
의존성은 Spring Cloud Discovery 에서 Eureka Server만을 등록해준다. 이 프로젝트는 오직 Discovery의 역할만 수행한다.
이제 프로젝트를 생성하고 메인 함수가 있는 클래스에 가서 @EnableEurekaServer를 달아준다. Eureka를 서버의 자격으로 등록해준다.
이와 같이 applicatioin.yml 파일도 수정한다. spring.application.name 은 마이크로서비스의 ID인 name값을 지정하고, 그 밑의 두 설정은 기본값이 true인데, 이는 자신을 클라이언트로써 등록하는 것을 실행하므로 꺼준다.
이제 실행하고 브라우저에 해당 포트번호로 접속하면 Spring Cloud Eureka 의 대시보드에 접근할 수 있다.
이제 이 서버에 등록할 인스턴스, 즉 서비스를 만들어보자.
User Service
의존성에는 Spring Boot DevTools, Lombok, Spring Web, Eureka Discovery Client 를 등록한다.
이와 같이 application.yml을 설정해준다.
이제 아까와 같이 Eureka 대시보드에 들어가보면 다음과 같이 서비스가 등록된 것을 볼 수 있다.
이제, 9001번 포트 말고도 다른 3가지 방법으로 총 4개의 인스턴스를 등록해보자. 우리의 목적은 여러 인스턴스 중 어떤 인스턴스를 찾아갈지를 알려주는 Discovery Service이다.
첫 번째 방법. 먼저, Intellij IDE 안에서 우측 상단의 드롭다운 메뉴를 클릭하고, 우리가 실행한 UserServiceApplication을 복제해줄 것이다. 똑같은 인스턴스를 똑같이 실행시키고 싶은 것이다. 하지만, 포트번호는 9002로 하고 싶다.
Modify options에 들어가 "add VM options" 를 찾아 활성화하고, 사진과 같이 "-Dserver.port=9002" 를 입력한다. -D 는 추가한다는 의미이다. 여기까지 하고 우측 상단에서 UserServiceApplication-2를 실행시킨다.
두 번째 방법. 우선 maven이 깔려 있어야 한다. (이거 까는 게 제일 어려웠음.... mvn이 깔려서 명령어가 실행됐다가도 뭐만 하면 다시 인식이 안 됨...) maven을 잘 깔고 mvn -version 명령어로 확인해주자.
이제 user-service 프로젝트 경로로 찾아가서
mvn spring-boot:run -Dspring-boot.run.jvmArguments='-Dserver.port=9003'
라고 입력해주자.
세 번째 방법. 아까와 같은 경로에서
mvn clean compile package
java -jar -Dserver.port=9004 ./target/user-service-0.0.1-SNAPSHOT.jar
라고 입력해주자.
빌드를 clean 한 후, compile 해서 packging 하는 것이다. 이러면 새로운 jar 파일인 user-service-0.0.1-SNATSHOT.jar 파일이 target 디렉토리에 생길 것이다. 이것을 java -jar 명령어로 실행시키면서 포트번호를 변경시키는 것이다.
4개의 서로 다른 포트의 인스턴스가 작동되고 있는 것을 확인할 수 있다.
하지만 이렇게 포트번호를 일일이 지정하는 것은 매우 귀찮다. 포트번호를 알아서 지정하도록 해보자.
Load Balancer
application.yml 파일에 가서 포트번호를 0번으로 바꿔주자. 포트번호를 0번으로 지정해주면 실행마다 랜덤으로 포트번호가 지정된다. 그 후 인스턴스 실행 시 대시보드에 다음과 같이 뜬다.
여기엔 0번포트라고 뜨지만 실제로 클릭하면 나오는 포트번호는 다르다. 즉 "틀리게" 표시된 것이다. application.yml 파일의 정보를 그대로 가져다 써서 나온 문제이다. 이러면 다음과 같은 문제가 발생하게 된다.
두 개의 인스턴스를 실행해보자. 하나는 IntelliJ의 우측 상단에서, 하나는 터미널에서 "mvn spring-boot:run" 명령어를 입력해 실행했다.
하지만 대시보드에는 아까와 같이 하나의 인스턴스만 뜨게 된다. 띄워줄 정보가 하나밖에 없으니 당연한 것이다. 따라서 대시보드에 뜨는 instance-id 값을 바꿔주어야 한다.
eureka:
instance:
instance-id: ${spring.cloud.client.hostname}:${spring.application.instance_id:${random.value}}
다음과 같이 hostname 뒤에 instance_id 를 랜덤값으로 지정해서 다시 두 인스턴스 모두 실행해주면
두 인스턴스 모두 정상적으로 분리되어 보인다.
즉, 실행할 때마다 자동으로 사용자가 알 수 없게 포트 부여가 되고, 라우팅 서비스와 게이트웨이에 의해 필요한 작업을 호출할 수 있는 상태. 즉 로드 밸런싱을 쉽게 완료한 것이다.
'[MSA] Spring Cloud로 개발하는 마이크로서비스 애플리케이션' 카테고리의 다른 글
섹션 5 : Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA) (0) | 2023.07.28 |
---|---|
섹션 4 : Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA) (0) | 2023.07.28 |
섹션 3 : Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA) (0) | 2023.07.21 |
섹션 2 : Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA) (2) | 2023.07.21 |
섹션 0 : Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA) (0) | 2023.07.19 |