티스토리 뷰
Service Discovery
Microservice Architecture
에서 각각의 서비스들은 마이크로서비스로 분리되어 있고 IP
와 Port
로 구분할 수 있습니다. 클라이언트의 요청에 알맞은 서비스를 제공하기 위해 구분된 서비스 정보들을 저장하고 관리하는 관리자 역할을 Service Discovery
가 수행합니다.
Spring Cloud Netflix
넷플릭스는 MSA
로의 전환을 통해 많은 경험을 가지게 되었는데 이 경험을 OSS(Open Source Software)
로 공개했습니다. 클라우드 환경에 특화된 프레임워크인 Spring Cloud
에도 많은 넷플릭스 OSS가 통합되어 있는데 그 중 Spring Cloud Netflix Eureka
에 대해서 알아보고자 합니다.
Spring Cloud Netflix Eureka
Service Discovery 구성을 위해서는 기본적으로 아래의 마이크로서비스가 구현되어야 합니다.
Eureka Server
- 마이크로서비스 인스턴스 정보를 동적으로 관리하기 위한 Service Discovery Server입니다.
Eureka Client
- Eureka Server에 저장되어 관리될 마이크로서비스를 의미합니다.
새로운 인스턴스는 Eureka Server
에 등록될 때 자신의 IP
, Host
, Port
등의 정보를 스스로 전달하기 때문에 받은 정보를 바탕으로 일정한 간격으로 상태를 확인하며 인스턴스를 관리합니다. 이러한 정보 제공으로 인해 Server측에서는 확장 시 IP 관리 부담이 필요하지 않게 되었습니다.
인스턴스를 등록하고자 한다면 Eureka Server 정보만 입력하면 되고, 다른 서비스를 호출하고자 한다면 Eureka Server에 등록된 인스턴스 정보만 확인하면 됩니다. 수평 확장적인 부분에서 편리함을 알 수 있습니다.
실습
Eureka Server
Spring 프로젝트를 생성할 때 Spring Cloud Discovery Eureka Server
의존성을 추가해줍니다. Spring Boot 버전마다 사용가능한 Spring Cloud 버전이 다르므로 확인이 필요합니다.
프로젝트를 생성하면 main
폴더의 생성한 패키지 경로에 @SpringBootApplication
이 붙은 Application 파일이 존재합니다. 이 애플리케이션이 Eureka Server임을 알려주는 @EnableEurekaServer
어노테이션을 추가합니다.
@SpringBootApplication
@EnableEurekaServer
public class EurekaServerApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaServerApplication.class, args);
}
}
추가로 몇 가지 설정이 더 필요합니다. 프로젝트의 Root 경로에 application.yml
파일을 추가한 뒤, 아래의 코드를 작성합니다.
server:
port: 8761
spring:
application:
name: discoveryservice
eureka:
client:
register-with-eureka: false
fetch-registry: false
server.port
: 서비스가 실행될 포트 번호를 지정합니다.spring.application.name
: 서비스의 고유한 이름을 지정합니다.eureka.client.register-with-eureka
: Eureka Server는 서비스를 등록하는 Service Registry의 역할을 수행하는데 레지스트리에 등록할지를 결정합니다. 기본값은 true입니다.eureka.client.fetch-registry
: 레지스트리에 있는 정보를 가져와 로컬에 캐시를 수행할지를 결정합니다. 다시 말해서 레지스트리 정보를 주기적으로 가져올지를 결정합니다. 기본값은 true입니다.
설정을 완료한 뒤 서버를 가동하고 지정해둔 포트 번호로 접속하면 다음과 같은 화면을 확인할 수 있습니다. 시스템 상태, Eureka Server에 등록된 인스턴스, 각종 정보 등을 담고 있습니다. 다음으로 Eureka Server에 등록할 서비스를 만들어보도록 하겠습니다.
Eureka Client
Spring 프로젝트를 생성할 때 Spring Cloud Discovery Eureka Discovery Client
의존성을 추가해줍니다. 등록하고자 하는 서비스의 종류에 따라 추가로 의존성을 추가해줍니다. 저는 Spring Boot DevTools
, Lombok
, Spring Web
의존성을 추가하였습니다.
프로젝트를 생성하면 main 폴더의 생성한 패키지 경로에 @SpringBootApplication
이 붙은 Application 파일이 존재합니다. 이 애플리케이션이 Eureka Client임을 알려주는 @EnableDiscoveryClient
어노테이션을 추가합니다.
@SpringBootApplication
@EnableDiscoveryClient
public class EurekaServiceApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaServiceApplication.class, args);
}
}
@EnableEurekaClient
어노테이션도 존재하지만, 위의 어노테이션이 Client 규격에 해당하는 어노테이션이라고 합니다.
EurekaClient도 마찬가지로 추가적 설정이 필요합니다. main/resources
경로에 application.yml
파일을 생성 후 아래의 내용을 작성합니다.
server:
port: 0
spring:
application:
name: user-service
eureka:
instance:
instance-id: ${spring.cloud.client.hostname}:${spring.application.instance_id:${random.value}}
client:
register-with-eureka: true
fetch-registry: true
service-url:
defaultZone: http://127.0.0.1:8761/eureka
server.port
: 서비스가 실행될 포트 번호를 지정합니다.0
번으로 지정 시 인스턴스 실행마다 랜덤한 포트 번호가 할당됩니다.
spring.application.name
: 서비스의 고유한 이름을 지정합니다.eureka.instance.instance-id
: 서비스 레지스트리에 등록될 인스턴스의 ID를 설정합니다.eureka.client.register-with-eureka
: Eureka Server는 서비스를 등록하는 Service Registry의 역할을 수행하는데 레지스트리에 등록할지를 결정합니다. 기본값은 true입니다.eureka.client.fetch-registry
: 레지스트리에 있는 정보를 가져와 로컬에 캐시를 수행할지를 결정합니다. 다시 말해서 레지스트리 정보를 주기적으로 가져올지를 결정합니다. 기본값은 true입니다.eureka.client.service-url.defaultZone
: Eureka Client가 등록될 서버 주소를 설정합니다.
실행 시마다 포트 번호가 다르게 할당되기에 여러 개 실행시켜 Eureka Server에 잘 등록되는지 확인해보도록 하겠습니다.
방법 1
사진에 보이는 실행 버튼을 눌러 애플리케이션을 실행합니다.
방법 2
Edit Configurations를 클릭합니다.
해당 Application의 Configurations를 복사하여 위와 같은 방법으로 실행합니다.
방법 3
mvn spring-boot:run
해당 프로젝트의 Root 경로에서 다음 명령어를 입력하여 실행합니다.
방법 4
mvn clean
mvc compile package
java -jar ./target/user-service-0.0.1-SNAPSHOT.jar
별도의 Shell을 이용해 프로젝트의 Root 경로로 이동 후 다음과 같은 순서로 명령어를 입력하여 실행합니다.
mvn clean
: 빌드 정보를 초기화합니다.mvn compile package
: 컴파일과 패키징을 수행합니다. target 디렉토리가 생성되고 하위에 프로젝트의 jar 파일이 생성됩니다.java -jar
: jar 파일을 실행합니다.
위에 설명해 드린 방법을 통해 4개의 인스턴스를 실행시켰으므로 Eureka Server에 4개의 인스턴스가 정상적으로 등록된 것을 확인할 수 있습니다. Status
에 보이는 명칭은 eureka.instance.instance-id
를 통해 설정한 이름입니다.
마치며
여러 개의 서비스를 어떻게 관리할까 하는 궁금증으로 MSA 공부를 시작하게 되었습니다. 지금까지 진행했던 프로젝트 모두 단일 프로젝트 안에 모든 서비스가 존재했기에 프로젝트의 복잡성을 제대로 관리하지 못했던 것 같습니다. 아직은 MSA의 첫 발걸음을 내디딘 단계이지만 추후에는 프로젝트를 하더라도 MSA를 적극적으로 제안할 수 있도록 학습을 이어갈 예정입니다.
참고
'Spring > Spring Cloud' 카테고리의 다른 글
마이크로서비스 아키텍처 (0) | 2022.06.20 |
---|---|
클라우드 네이티브 아키텍처 (0) | 2022.06.18 |