Implementing Service Discovery
1. Adding Eureka Server Dependencies
Example: Eureka server dependency
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
2. Configuring Eureka Server (@EnableEurekaServer)
Example: Enable Eureka server
@SpringBootApplication
@EnableEurekaServer
public class EurekaServerApp {
public static void main(String[] a) { SpringApplication.run(EurekaServerApp.class, a); }
}
Example: Standalone Eureka server configuration
server.port: 8761
eureka:
client:
register-with-eureka: false
fetch-registry: false
server:
enable-self-preservation: false
3. Registering Services with Eureka Client
Example: Eureka client dependency
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
Example: Register service with Eureka
spring.application.name: orders
eureka:
client:
service-url:
defaultZone: http://eureka:8761/eureka/
instance:
prefer-ip-address: true
instance-id: ${spring.application.name}:${random.uuid}
4. Using Service Discovery for Load Balancing
Example: Load-balanced REST client via discovery
@Bean @LoadBalanced
RestClient.Builder loadBalancedRestClient() { return RestClient.builder(); }
// Use logical service name as host
String resp = restClient.get().uri("http://orders/api/orders/1").retrieve().body(String.class);
5. Implementing Health Checks for Services
Example: Eureka health check integration
eureka:
client:
healthcheck.enabled: true
instance:
health-check-url-path: /actuator/health
status-page-url-path: /actuator/info
management:
endpoint.health.probes.enabled: true
6. Configuring Eureka Client Properties
| Property | Default |
|---|---|
eureka.instance.lease-renewal-interval-in-seconds |
30 |
eureka.instance.lease-expiration-duration-in-seconds |
90 |
eureka.client.registry-fetch-interval-seconds |
30 |
eureka.client.initial-instance-info-replication-interval-seconds |
40 |
7. Using Consul as Alternative Discovery Service
Example: Consul service discovery dependency
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-consul-discovery</artifactId>
</dependency>
Example: Consul discovery configuration
spring:
cloud:
consul:
host: consul
port: 8500
discovery:
instance-id: ${spring.application.name}:${random.uuid}
health-check-path: /actuator/health
health-check-interval: 10s
8. Implementing Client-Side Load Balancing (Spring Cloud LoadBalancer)
| Algorithm | Class |
|---|---|
| Round-robin (default) | RoundRobinLoadBalancer |
| Random | RandomLoadBalancer |
| Weighted | Custom ReactorServiceInstanceLoadBalancer |
9. Using Service Names for Inter-Service Communication
Example: Feign client with service discovery
@FeignClient(name = "orders") // resolves via discovery + LoadBalancer
public interface OrdersApi {
@GetMapping("/api/orders/{id}") OrderDto get(@PathVariable Long id);
}
10. Testing Service Discovery Integration
| Approach | Use |
|---|---|
spring.cloud.discovery.enabled=false |
Disable in unit tests |
SimpleDiscoveryClient |
Stub instances via properties |
| Testcontainers Eureka/Consul | Full integration test |