morenow
morenow
morenow
전체 방문자
오늘
어제
  • 분류 전체보기 (83)
    • 스프링부트와 AWS로 혼자 구현하는 웹 서비스 (5)
    • [MSA] Spring Cloud로 개발하는 마이.. (14)
    • Baekjoon Online Judge (40)
    • Programmers (11)
    • Spring Boot (7)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • successHandler
  • copy up
  • dirty write
  • Open Feign
  • B+ Tree
  • JWT단점
  • HttpExchange
  • HTTP Interface
  • 백준20058C++
  • 백준 파이어스톰
  • 마법사 상어와 파이어스톰
  • lost update
  • Spring Boot
  • Refresh Token Refresh
  • write skew
  • jwt
  • re-distribution
  • Feign Client
  • Id Token
  • B Tree

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
morenow

morenow

[MSA] Spring Cloud로 개발하는 마이크로서비스 애플리케이션

섹션 1 : Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)

2023. 7. 20. 23:28

이 글은 인프런 Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA) 강의를 듣고 쓴 글입니다.

https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%ED%81%B4%EB%9D%BC%EC%9A%B0%EB%93%9C-%EB%A7%88%EC%9D%B4%ED%81%AC%EB%A1%9C%EC%84%9C%EB%B9%84%EC%8A%A4/dashboard

 

Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA) - 인프런 | 강의

Spring framework의 Spring Cloud 제품군을 이용하여 마이크로서비스 애플리케이션을 개발해 보는 과정입니다. Cloud Native Application으로써의 Spring Cloud를 어떻게 사용하는지, 구성을 어떻게 하는지에 대해

www.inflearn.com


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
    '[MSA] Spring Cloud로 개발하는 마이크로서비스 애플리케이션' 카테고리의 다른 글
    • 섹션 4 : Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)
    • 섹션 3 : Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)
    • 섹션 2 : Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)
    • 섹션 0 : Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)
    morenow
    morenow

    티스토리툴바