Spring Cloud & Netflix Eureka를 활용한 서비스 디스커버리 구현

2025. 3. 14. 14:17Spring 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 + 클라이언트 사이드 로드 밸런싱 적용

출처 : Spring Microservices in Action 2nd Edition

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를 활용하여 안정적이고 유연한 서비스 디스커버리 시스템을 구축할 수 있습니다! 🚀