인프런 MSA 강좌를 수강하고 정리 목적으로 포스팅합니다.
1. Service Discovery 기본 개념
Service Registry
사용가능한 Service의 목록을 관리하고, 서비스를 등록/해제/조회 할 수 있는 API를 제공하며 일종의 DB역할을 한다고 볼 수 있고 고가용성이 보장되어야 한다.
각 마이크로서비스는 이 api를 활용하여 기동 시에 자동으로 Service Registry에 등록되며 Service Registry는 지속적으로 서비스의 상태를 모니터링한다.
Service Registry를 호출하는 주체에 따라 Client side Discovery, Server side Discovery로 나뉠 수 있다.
대표적인 Service Registry로는 Netflix Eureka, Apache Zookeeper 등이 있다.
Client Side Discovery
서비스 클라이언트가 Service Registry를 직접 호출하여 서비스 위치를 찾은 뒤에 로드밸런싱 알고리즘을 통해 서비스를 호출하는 방식이다.
대표적으로 Netflix Eureka를 이용해 Service Registry를 구성하고, 이를 통해 얻은 서비스 호출 정보를 바탕으로 Netflix Ribbon을 통해 로드밸런싱된 요청을 하는 방식으로 구현할 수 있다. 이 방식은 비교적 간단하며, 서비스 별로 로드밸런싱 로직을 각각 구성할 수 있는 장점이 있으나, 서비스와 Service Registry간 직접적인 종속성이 생기며 서비스마다 각기 다른 언어를 사용한다면 각 언어별로 서비스 검색 로직을 구현해야 하는 단점이 있다.
Server Side Discovery
서비스 클라이언트가 직접 Servier Registry를 호출하지 않고 Platform router 혹은 로드밸런서(프록시)를 호출하는 방식이다.
이 때 요청을 받은 로드밸런서는 Service Registry를 호출하여 서비스의 위치를 알아내고 이를 기반으로 로드 밸런싱된 호출을 진행한다.
Service Discovery
Service Registry
사용가능한 Service의 목록을 관리하고, 서비스를 등록/해제/조회 할 수 있는 API를 제공하며 일종의 DB역할을 한다고 볼 수 있고 고가용성이 보장되어야 한다.
각 마이크로서비스는 이 api를 활용하여 기동 시에 자동으로 Service Registry에 등록되며 Service Registry는 지속적으로 서비스의 상태를 모니터링한다.
Service Registry를 호출하는 주체에 따라 Client side Discovery, Server side Discovery로 나뉠 수 있다.
대표적인 Service Registry로는 Netflix Eureka, Apache Zookeeper 등이 있다.
Client Side Discovery
서비스 클라이언트가 Service Registry를 직접 호출하여 서비스 위치를 찾은 뒤에 로드밸런싱 알고리즘을 통해 서비스를 호출하는 방식이다.
대표적으로 Netflix Eureka를 이용해 Service Registry를 구성하고, 이를 통해 얻은 서비스 호출 정보를 바탕으로 Netflix Ribbon을 통해 로드밸런싱된 요청을 하는 방식으로 구현할 수 있다. 이 방식은 비교적 간단하며, 서비스 별로 로드밸런싱 로직을 각각 구성할 수 있는 장점이 있으나, 서비스와 Service Registry간 직접적인 종속성이 생기며 서비스마다 각기 다른 언어를 사용한다면 각 언어별로 서비스 검색 로직을 구현해야 하는 단점이 있다.
Server Side Discovery
서비스 클라이언트가 직접 Servier Registry를 호출하지 않고 Platform router 혹은 로드밸런서(프록시)를 호출하는 방식이다.
이 때 요청을 받은 로드밸런서는 Service Registry를 호출하여 서비스의 위치를 알아내고 이를 기반으로 로드 밸런싱된 호출을 진행한다.
2. 실제 Eureka Server 프로젝트 만들기
Eureka Server
전체 서비스를 등록, 조회, 관리할 수 있게 해준다.
프로젝트를 만들 때 의존성에 **Eureka Server를 추가**하거나 build.gralde에 다음 코드를 추가한다.
implementation 'org.springframework.cloud:spring-cloud-starter-netflix-eureka-server'
@EnableEurekaServer
스프링부트 어플리케이션 파일에 @EnableEurekaServer 어노테이션을 붙여준다.
application.yml
- register-with-eureka 는 유레카 서버에 등록하는 속성인데 유레카 서버에 유레카 서버를 등록하는 재귀 행위를 하지 않는다.
- fetch-registry: 유레카 서버에 등록된 다른 서비스의 정보를 주기적으로 받아오는 속성
server:
port: 8761
spring:
application:
name: discoveryservice
eureka:
client:
register-with-eureka: false
fetch-registry: false
3. Eureka Client
서버가 있으면 사용하는 클라이언트가 있다는 걸 명심하자!
@EnableDiscoveryClient
유레카 서버에서는 @EnableEurekaServer 어노테이션을 사용했다.
이번에는 클라이언트로 동작하므로 @EnableDiscoveryClient 어노테이션을 메인 어플리케이션 클래스 위에 추가해준다.
application.yml
server:
port: 9001
spring:
application:
name: user-service
eureka:
client:
register-with-eureka: true
fetch-registry: true
service-url: # 유레카 서버의 위치
defaultZone: <http://127.0.0.1:8761/eureka>
register-with-eureka: true
- Eureka 서버로부터 인스턴스들의 정보를 주기적으로 가져올 지의 속성
- true시 갱신 된 정보를 받겠다는 의미
service-url
- http://127.0.0.1:8761/eureka
- 위 127.0.0.1, 포트 8761, 엔드포인트 유레카에 user-service라는 마이크로 서비스 정보를 등록
Edit Configuration
포트를 다르게 실행하기 위해서는 기존 모듈을 복사 후 해당 스프링 어플리케이션을 실행할 때 포트 값을 다르게 설정하면 된다.
add VM Options를 추가하고 해당 줄에 serve.port = [포트번호]를 추가후 해당 새 모듈을 실행하면 된다.
server.port = 0 - 포트 랜덤 지정
포트를 0으로 지정하면 포트가 랜덤으로 지정되기 때문에 기존 모듈을 복사해서 실행하면 포트가 겹치지 않는다.
여러 개의 Instance 기동
조건: 내 컴퓨터에 자바 설치, gradle or maven 설치 (버전에 맞는)
내 컴퓨터 자바는 14? 이고 gradle 설치가 되어있지 않아 시도하지 X
$ mvn spring-boot:run -Dspring-boot.run.jvmArguments='-Dserver.port=[포트번호]'
$ gradlew bootRun --args='--server.port=9003'
$ java -jar -Dserver.port=9004 ./target/user-service-0.0.1-SNAPSHOT.jar
// maven 기준
> mvn spring-boot:run -Dspring-boot.run.jvmArguments='-Dserver-port=9003'
// gradle 기준 (4.9 이상)
> ./gradlew bootRun --args='--server.port=9003'
// java jar 기준
> java -jar "-Dserver.port=9003" ./user-service.jar
// 참고: gradle로 jar 만들려면..
> ./gradlew build
//실행후 project의 최상단 디렉토리/build/libs에서 jar확인
// gradle로 boot 실행하기
> ./gradlew bootRun
'MSA 공부' 카테고리의 다른 글
Custom Filter, GlobalFilter 적용 (0) | 2025.02.26 |
---|---|
API Gateway Service - 1 (0) | 2025.01.26 |