728x90
SMALL
[Spring Cloud Netflix Eureka]
[그림 설명]
- 하나의 마이크로서비스가 3가지 인스턴스에 의해 확장돼서 개발되는 경우
- 일종의 로드밸런서 역할을 하는 것처럼 부하 분산 처리가 돼있다고 가정
- 보유하고 있는 노트북/PC가 한 대일 경우에는 여러 개의 서비스를 동시에 실행하기 위해 반드시 포트를 나눠서 실행 → 하나의 IP일 경우에는 포트를 분산시켜 실행
- 가용할 수 있는 IP가 여러개일 경우에는 포트를 분산시킬 필요 X
Service Discovery란?
- Spring Cloud Netflix Eureka가 하는 역할 : Service Discovery
- Service Discovery란 외부의 서비스들이 마이크로서비스를 검색하기 위해 사용되는 개념으로, 각각의 마이크로서비스가 어디에 저장돼있으며 요청 정보가 들어왔을 때 해당 요청 정보에 따라 필요한 서비스의 위치를 알려주는 역할
- key-value 형태로 정보 저장 → 어떠한 서비스가 어느 위치에 있는지 등록하고 있는 정보
- 서비스 등록, 검색과 관련된 작업 수행
Spring Cloud Netflix Eureka
- 넷플릭스 회사가 가진 자사의 클라우드 기술들을 스프링 재단에 기부해서 사용할 수 있는 서비스
- 각각의 마이크로서비스가 자신의 위치 정보를 Spring Cloud Netflix Eureka 서버에 등록 작업 먼저 수행
- 마이크로서비스를 사용하고 싶은 클라이언트는 제일 먼저 자신이 필요한 요청 정보를 로드밸런서나 API Gateway에 전달
- 요청 정보가 서비스 디스커버리에 전달 → 내가 필요한 서비스의 서버 위치를 클라이언트에게 반환
EcommerceDiscoveryService
- 마이크로 서비스인 사용자 서비스, 상품 서비스, 주문 서비스를 가지고 있는 아주 간단한 온라인 쇼핑몰 e-commerce를 만드는 예제
EcommerceApplication.java
@SpringBootApplication
- 스프링 부트가 가진 모든 클래스 중에서 @SpringBootApplication라는 어노테이션을 검색 후 해당 어노테이션이 있는 파일 실행
@EnableEurekaServer
- 우리가 만드는 스프링 부트 프로젝트가 유레카 서버 역할을 하기 위해서는 해당 프로젝트를 유레카 서버 자격으로 등록 필요
- Service Discovery로서 프로젝트를 기동한다는 의미
application.yml (or application.properties)
port 번호
- 유레카 서버가 웹 서비스의 성격으로서 기동 됨으로써 포트 번호 지정
name
- 각각의 마이크로서비스에 고유한 아이디 부여 필요 → 아이디의 역할로 애플리케이션 네임 정보를 등록
유레카 클라이언트
- 유레카 라이브러리가 포함된 채 스프링부트가 기동이 되면 기본적으로 유레카 클라이언트 역할로서 어딘가에 등록 작업 시도
- register-with-eureka: true
fetch- registry: true
→ 자신의 정보를 자신한테 등록하는 의미 없는 작업을 하게 됨
[User Service - 프로젝트 생성]
- 앞서 만든 discoveryservice를 Eureka 서버로서 구동
- userservice를 위의 Eureka 서버(discoveryservice)의 클라이언트로서 구동
- UserServiceApplication을 port 번호 9001으로 하여 구동
- UserServiceApplication-2을 port 번호 9002으로 하여 구동
- application.yml에 9001라고 작성된 port 번호를 9002라고 변경하는 방법 O
- Edit Configurations을 눌러 spring application을 실행할 시 실행 명령어를 변경하여 port 번호를 변경하는 방법
- -Dserver.port=9002
- command line에서 maven 명령어를 사용하여 userservice 프로젝트를 직접 실행하는 방법
- mvn spring-boot:run -Dspring-boot.run.jvmArguments=’-Dserver.port=9003
- java jar 파일을 이용하여 직접 실행하는 방법
- mvn compile package (컴파일 하고 패키지 만들기)
- java -jar -Dserver.port=9004 ./target/user-service-0.0.1-SNAPSHOT.jar
- 만약 외부에서 클라이언트 요청이 userservice로 전달된다면, discoveryservice 안에서 9001번/9002번 port로 전달할지, 어떠한 인스턴스가 살아있는지의 정보 값을 gateway나 라우팅 서비스에 전달
- 2가지 마이크로서비스에 의해 분산된 서비스가 실행되게 됨.
[User Service - Load Balancer]
서버의 포트번호를 직접 변경하는 방법의 대안
위의 4가지 방법처럼 서버의 포트 번호를 매번 변경하는 일은 굉장히 수고스러운 작업이다.
랜덤 포트 사용하기
- server.port = 0으로 지정하면 랜덤 포트를 사용하겠다는 의미
- 같은 서비스가 실행된다 하더라도 매번 실행될 때마다 포트의 번호가 랜덤하게 할당
- 랜덤 포트를 사용하면 여러 서비스를 동시에 실행 가능
→ 스케일링 작업을 하기 위해 userservice를 실행할 때마다 자동으로 포트가 부여되고, 사용자들한테 인식할 수 없는 상태에서 여러 개의 인스턴스가 만들어짐. 각각의 인스턴스들은 Eureka 서비스 즉, discovery 서비스에 잘 등록됨 (라우팅 서비스와 게이트웨이에 의해 필요한 작업을 호출할 수 있는 상태) → 부하분산, 로드 밸런싱 구현
다음 포스팅에서는 유레카 서비스에 있는 각각의 정보들을 실제로 라우팅하고, 해당하는 서비스로 정확하게 이동하기 위해 API Gateway를 어떻게 연동하면 좋은지 알아보겠다.
728x90
LIST
'Backend > Spring Cloud' 카테고리의 다른 글
[MSA] E-commerce 애플리케이션 프로젝트 (0) | 2024.07.28 |
---|---|
[MSA] API Gateway Service (0) | 2024.07.22 |
[MSA] Microservice와 Spring Cloud 소개 (0) | 2024.07.05 |