7.2 Service Discovery with Netflix Eureka
← Back to Chapter 7: Microservices & Spring Cloud
In dynamic cloud environments, microservice container instances spin up, scale out, or terminate continuously, meaning IP addresses change dynamically. Hardcoding IP addresses or DNS names is infeasible. Service Discovery provides a live phonebook of all healthy instances.
1. Eureka Architecture & Heartbeat Loop
┌───────────────────────────────┐
│ Eureka Discovery Server │
│ (Registry of Service IPs) │
└───────▲───────────────▲───────┘
Register & │ │
Heartbeats (30s) │ │ Lookup "PAYMENT-SERVICE"
│ │
┌─────────────────────┴──┐ ┌──┴──────────────────┐
│ Payment Service │ │ Order Service │
│ (10.0.1.4:8082, UP) │ │ (Caller / Consumer) │
└────────────────────────┘ └──────────┬──────────┘
│ Direct REST Call
▼ (Load-Balanced)
[ 10.0.1.4:8082 ]
2. Setting Up Eureka Server
1. Dependency
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
2. Main Application Class
@SpringBootApplication
@EnableEurekaServer
public class EurekaServerApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaServerApplication.class, args);
}
}
3. Server Configuration (application.yml)
server:
port: 8761
eureka:
client:
register-with-eureka: false # Don't register with self
fetch-registry: false
server:
enable-self-preservation: true # Guard against network partition eviction
3. Client Registration & Client-Side Load Balancing
Microservice instances declare @EnableDiscoveryClient and configure:
spring:
application:
name: payment-service # Virtual hostname in registry
eureka:
client:
service-url:
defaultZone: http://localhost:8761/eureka/
instance:
prefer-ip-address: true
lease-renewal-interval-in-seconds: 30
Client-Side Load Balancing with Spring Cloud LoadBalancer:
Instead of sending requests to a central hardware load balancer bottleneck, the calling client fetches the instance list from Eureka and uses round-robin or random distribution locally.