[CS] Spring Cloud Netflix Eureka를 사용한 마이크로서비스 인스턴스 관리 및 서비스 디스커버리

최지나·2024년 2월 20일
2

CS

목록 보기
51/55

개념 정리

MSA와 서비스 디스커버리

  • MSA는 독립적으로 배포 가능한 작은 서비스 단위로, 각각이 특정 비지니스 기능을 수행. 이에 서비스 디스커버리는 필수적.
  • 마이크로 서비스가 시작될 때, 서비스 레지스트리에 자신을 등록하고, 다른 서비스가 필요로 할 때 이 레지스트리를 조회하여 서비스의 위치 (IP, PORT) 를 알아낼 수 있음

Spring Cloud Netflix Eureka

  • 서비스 디스커버리에 사용되는 오픈 소스 솔루션 중 하나
  • 마이크로서비스 간의 상호 발견과 통신을 도움
  • 등록된 서비스들의 상태를 주기적으로 체크하여, 서비스의 가용성 정보를 최신 상태로 유지

Eureka에 마이크로서비스의 등록

  • @EnableEurekaClient 어노테이션의 등록만으로 서비스를 Eureka 서버에 자동 등록할 수 있다. yml이나 properites 파일에 Eureka 서버의 주소를 명시해주면 된다
  • Eureka는 대시보드를 활용하여 모든 서비스와 인스턴스의 상태를 한 눈에 파악할 수 있다

서비스 인스턴스의 확장과 동적 포트 할당

  • 마이크로 서비스를 확장하는 방법 중 하나는 여러 인스턴스를 실행하는 것. 이를 통해 서비스에 대한 요청을 여러 인스턴스에 분산시켜 부하를 관리할 수 있다
  • 인스턴스마다 고유한 포트를 할당하는 것이 일반적이지만, server-port=0 즉 랜덤 포트 할당을 통해 포트 번호를 동적으로 할당 받을 수도 있다

실습

0. 환경

- SpringBoot 3.2.2
- Java 17
- Spring cloud 2023.0.0

1. 서비스 디스커버리 (Eureka) 서버의 구동

  • pom.xml
<dependency>
			<groupId>org.springframework.cloud</groupId>
			<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
  • DiscoveryServiceApplication.java
@SpringBootApplication
@EnableEurekaServer
public class DiscoveryServiceApplication {
	public static void main(String[] args) {
		SpringApplication.run(DiscoveryServiceApplication.class, args);
	}
}
  • Eureka Dashboard (No instance is registered)

2. 마이크로 서비스 (여러 인스턴스)의 구동

vscode를 기준으로 작성되었습니다

  • pom.xml
<dependency>
  <groupId>org.springframework.cloud</groupId>
  <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
  • UserServiceApplication.java
@SpringBootApplication
@EnableDiscoveryClient
public class UserServiceApplication {
	public static void main(String[] args) {
		SpringApplication.run(UserServiceApplication.class, args);
	}
}

2-1) launch.json에 새로운 인스턴스 추가

    {
      "type": "java",
      "name": "Spring Boot-UserServiceApplication<user-service>",
      "request": "launch",
      "cwd": "${workspaceFolder}",
      "mainClass": "com.example.userservice.UserServiceApplication",
      "projectName": "user-service",
      "args": "--server.port=9001",
      "envFile": "${workspaceFolder}/.env",
      "console": "internalConsole"
    },
    {
      "type": "java",
      "name": "Spring Boot-UserServiceApplication2<user-service>", // 새로운 인스턴스
      "request": "launch",
      "cwd": "${workspaceFolder}",
      "mainClass": "com.example.userservice.UserServiceApplication",
      "projectName": "user-service",
      "args": "--server.port=9002",  // 원하는 포트 번호 설정
      "envFile": "${workspaceFolder}/.env",
      "console": "internalConsole"
    }
  • 2개의 인스턴스 모두 실행 시 아래와 같이 2개의 포트번호로 2개의 인스턴스가 생성된다

2-2) 터미널(bash) 에서 실행

./mvnw spring-boot:run -Dspring-boot.run.jvmArguments='-Dserver.port=9003'
./mvnw clean  # remove target dir
./mvnw compile package # generate jar file
java -jar -Dserver.port=9004 ./target/user-service-0.0.1-SNAPSHOT.jar
  • 4개의 인스턴스가 구동중인 것을 확인할 수 있다

2-3) 랜덤 포트 번호의 사용

  • 이전의 9001~9004 포트를 사용하는 인스턴스들을 먼저 종료하였다

  • application.properties

server.port=0 # 랜덤 포트의 사용
eureka.instance.instance-id=${spring.cloud.client.hostname}:${spring.application.instance_id:${random.value}}
  • 애플리케이션 실행 시 랜덤 포트 번호가 할당되어 인스턴스(들)가 실행된다
./mvnw spring-boot:run
./mvnw spring-boot:run
...

REF 공식문서

profile
의견 나누는 것을 좋아합니다 ლ(・ヮ・ლ)

0개의 댓글