2025. 3. 14. 14:17ㆍSpring Microservice
✨ Spring Cloud & Netflix Eureka를 활용한 서비스 디스커버리 구현
마이크로서비스 아키텍처(MSA)에서는 **서비스의 위치를 자동으로 찾고 관리하는 서비스 디스커버리(Service Discovery)**가 필수적입니다.
Spring Cloud와 Netflix Eureka를 활용하면 이를 간편하게 구현할 수 있습니다. 이번 글에서는 서비스 디스커버리와 클라이언트 사이드 로드 밸런싱(Client-Side Load Balancing)을 함께 적용하는 방법을 살펴보겠습니다. 🚀
🌐 서비스 디스커버리란?
서비스 디스커버리는 각 서비스의 물리적 위치(IP 및 포트)를 동적으로 조회할 수 있도록 도와줍니다.
Netflix Eureka를 사용하면 각 서비스가 Eureka 서버에 등록되고(Service Registration), 다른 서비스가 이를 조회(Service Lookup)하여 호출하는 방식으로 동작합니다.
✅ 서비스 디스커버리의 필요성
- 서비스 인스턴스가 동적으로 추가/제거될 때, 클라이언트가 변경된 위치를 자동으로 찾을 수 있어야 함.
- 하드코딩된 IP 주소를 제거하고, 서비스 간 통신을 유연하게 처리.
- 부하 분산(Load Balancing)과 장애 감지(Fault Detection)를 통해 안정성을 높임.
📌 Spring Cloud Eureka + 클라이언트 사이드 로드 밸런싱 적용
1️⃣ 서비스 인스턴스 등록 (Service Registration)
- 서비스가 실행되면 자신의 IP 주소와 포트 정보를 Eureka 서버에 등록합니다.
- 등록된 정보는 서비스 ID로 관리되며, 이후 서비스 위치 조회에 활용됩니다.
2️⃣ 클라이언트가 서비스 조회 & 캐싱 (Client Lookup & Caching)
- Licensing Service가 Organization Service를 호출할 때, Spring Cloud Load Balancer를 활용합니다.
- Eureka에서 서비스 위치를 조회하고, 로컬 캐시에 저장하여 빠르게 접근할 수 있도록 합니다.
3️⃣ 주기적인 캐시 갱신 (Cache Refreshing)
- Spring Cloud Load Balancer는 일정 주기로 Eureka 서버에 요청을 보내 최신 서비스 정보를 동기화합니다.
- 새로 추가된 서비스 인스턴스는 자동으로 반영되고, 비정상적인 서비스는 캐시에서 제거됩니다.
🛠 Spring Cloud Eureka 구현 방법
✅ Eureka 서버 설정
먼저, Eureka 서버를 설정하여 서비스 디스커버리 노드 역할을 수행하도록 구성합니다.
@EnableEurekaServer
@SpringBootApplication
public class EurekaServerApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaServerApplication.class, args);
}
}
application.yml 설정 예제 📌
eureka:
instance:
hostname: eureka-server
client:
registerWithEureka: false
fetchRegistry: false
serviceUrl:
defaultZone: http://localhost:8761/eureka/
✅ Eureka 클라이언트(Service Registration) 설정
각 마이크로서비스(Licensing Service, Organization Service)는 Eureka에 자신의 위치를 등록해야 합니다.
eureka:
client:
serviceUrl:
defaultZone: http://localhost:8761/eureka/
instance:
preferIpAddress: true
Java 코드 📌
@EnableEurekaClient
@SpringBootApplication
public class LicensingServiceApplication {
public static void main(String[] args) {
SpringApplication.run(LicensingServiceApplication.class, args);
}
}
✅ 클라이언트 사이드 로드 밸런싱 적용
Spring Cloud Load Balancer를 사용하여 Eureka에서 가져온 서비스 목록을 기반으로 로컬 캐시를 활용합니다.
@LoadBalanced
@Bean
public RestTemplate restTemplate() {
return new RestTemplate();
}
서비스 호출 시 Eureka에서 위치 조회 & 로드 밸런싱 적용
@Autowired
private RestTemplate restTemplate;
public Organization getOrganization(String organizationId) {
return restTemplate.getForObject("http://organization-service/organizations/" + organizationId, Organization.class);
}
이렇게 하면 organization-service의 위치가 Eureka에서 자동으로 조회되고,
Spring Cloud Load Balancer가 라운드 로빈 방식으로 여러 인스턴스에 부하를 분산합니다. 🔄
🔥 결론: Eureka + 클라이언트 사이드 로드 밸런싱의 장점
✅ 서비스 위치를 동적으로 조회하여 IP 하드코딩 불필요 📍
✅ 클라이언트 사이드 캐싱을 활용하여 서비스 디스커버리 부하 감소 🗄️
✅ 주기적인 캐시 갱신을 통해 최신 서비스 목록 반영 🔄
✅ 부하 분산(Load Balancing) 및 장애 감지(Fault Tolerance) 지원 ⚖️
이제 Eureka와 Spring Cloud Load Balancer를 활용하여 안정적이고 유연한 서비스 디스커버리 시스템을 구축할 수 있습니다! 🚀
'Spring Microservice' 카테고리의 다른 글
Eureka를 활용한 서비스 탐색(Service Discovery)과 마이크로서비스 호출 (0) | 2025.03.14 |
---|---|
Spring Boot 마이크로서비스를 Eureka Server에 등록하기 (0) | 2025.03.14 |
클라우드 기반 서비스 디스커버리 아키텍처 분석 (0) | 2025.03.14 |
클라우드 환경에서의 서비스 디스커버리 (0) | 2025.03.14 |
On service discovery (0) | 2025.03.14 |