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