Monolithic 아키텍처에서 MSA로의 전환을 경험해보고자 개인프로젝트에 Eureka를 적용해봅니다.
MSA 도입 시에 각각의 마이크로 서비스가 확장 / 축소 될 때마다
해당 서비스의 정보 (IP, Port)를 수동으로 업데이트해야하는데
이를 해결하는 것이 Service Discovery
패턴입니다.
Service Discovery 패턴은 Service Registry
라는 서비스의 IP, Port 등을 저장 관리하는 주소록을 구현한 것입니다.
이렇게 Service Discovery 패턴을 구현함으로써 분산환경의 서비스가
Service Discovery 구현체에게 서비스의 주소록을 질의함으로써 요청을 전달할 수 있습니다.
Service Discovery 패턴에는 2가지 종류가 있습니다.
MSA의 다른 서비스를 호출할 때 Service Registry를 통해서 다른 서비스를 호출하는지 여부에 따라 나뉩니다.
장점
장점
다음과 같은 이유로 Client-Side Discovery를 구현합니다.
최종적으로 구현해야할 구조는 다음과 같습니다.
Eureka Client
라이브러리를 추가하여 Eureka Server
에 서스 정보 등록Eureka Server 의존성 추가
ext {
set('springCloudVersion', "2023.0.3")
}
dependencies {
implementation 'org.springframework.cloud:spring-cloud-starter-netflix-eureka-server'
implementation 'org.springframework.cloud:spring-cloud-starter-config'
}
dependencyManagement {
imports {
mavenBom "org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}"
}
}
eureka-server
의존성을 추가해줍니다.spring-cloud-starter-config
의존성을 추가합니다.application.properties 설정
server.port=8761
spring.application.name=discovery
eureka.instance.hostname=localhost
eureka.client.register-with-eureka=false
eureka.client.fetch-registry=false
eureka.client.service-url.defaultZone=http://${eureka.instance.hostname}:${server.port}/eureka/
spring.cloud.config.import-check.enabled=false
Eureka Server 활성화
@SpringBootApplication
@EnableEurekaServer
public class EurekaServiceApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaServiceApplication.class, args);
}
}
실행 Application 위에 @EnableEurekaServer 어노테이션을 선언합니다.
Eureka Client 의존성 추가
ext {
set('springCloudVersion', "2023.0.3")
}
dependencies {
implementation 'org.springframework.cloud:spring-cloud-starter-config'
implementation 'org.springframework.cloud:spring-cloud-starter-netflix-eureka-client'
implementation 'org.springframework.boot:spring-boot-starter-web'
}
dependencyManagement {
imports {
mavenBom "org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}"
}
}
eureka-client
의존성을 추가해줍니다.eureka-client
이외에 필요한 다른 의존성도 추해줍니다.spring-cloud-starter-config
는 추후 config-service
에서 configuration을 풀링할 수 있도록 하는 의존성입니다. spring-web
은 애플리케이션 시작 후 바로 종료 되지 않도록 유지하기 위해 추가합니다.application.properties 설정
spring.application.name=user-service
server.port=10001
eureka.client.register-with-eureka=true
eureka.client.fetch-registry=true
eureka.client.service-url.defaultZone=http://localhost:8761/eureka/
eureka.client.register-with-eureka : Eureka Server에 자기 자신을 등록할지의 여부
eureka.client.fetch-registry : Eureka Server의 등록되어 있는 서비스 캐싱 여부
eureka.instance.prefer-ip-address : IP 주소를 Eureka Server
에 등록할지 여부 입니다.
- 기본값은 false, Eureka Server에 각 서비스들이 내부적으로 호스트 이름으로 등록됩니다.
- 서비스가 배포되는 환경에서 DNS가 존재한다면 호스트 이름을 할당받고 Eureka Server가 잘 등록할 수 있으므로 해당 옵션을 설정할 필요가 없습니다.
```
@SpringBootApplication
@EnableDiscoveryClient
public class UserServiceApplication {
public static void main(String[] args) {
SpringApplication.run(UserServiceApplication.class, args);
}
}
```
실행 Application 위에 @EnableDiscoveryClient 어노테이션을 선언합니다.dependencies {
implementation 'org.springframework.cloud:spring-cloud-config-server'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
testRuntimeOnly 'org.junit.platform:junit-platform-launcher'
}
spring.application.name=config-server
server.port=8888
설정했던 애플리케이션을 실행해줍니다.
EurekaService http://localhost:8761 로 접속하면 등록했던 user-service가 보입니다.
Service Discovery 패턴을 구현하기 위해 Eureka를 사용한 Client-Side Discovery 방식을 적용했습니다. 구현된 아키텍처는 다음과 같은 구성요소로 이루어져 있습니다:
추후 Config Server
의 도입으로 다음과 같은 이점을 얻을 수 있습니다:
이러한 구조를 통해 마이크로서비스 아키텍처의 확장성, 유연성, 그리고 관리 용이성을 크게 향상시킬 수 있습니다.
Config Server
를 통한 중앙화된 설정 관리는 복잡한 분산 시스템을 효과적으로 운영하고 확장할 수 있습니다.