Eureka est un service de découverte de services développé par Netflix et intégré à Spring Cloud. Il permet aux micro-services de s'enregistrer automatiquement et de découvrir dynamiquement les autres services dans une architecture distribuée.
Eureka fonctionne sur le principe de "serveur-client" où le serveur Eureka maintient un registre des services disponibles et les clients Eureka s'enregistrent périodiquement auprès du serveur.
Architecture d'Eureka
Eureka Server : Serveur central qui maintient le registre des services
Eureka Client : Services qui s'enregistrent auprès du serveur
Heartbeat : Mécanisme de vérification de disponibilité des services
Ribbon : Client de load balancing intégré
Zone Awareness : Support pour la répartition géographique
Self Preservation : Mode de préservation en cas de défaillance réseau
🖥️
EUREKA SERVER
Serveur central qui maintient un registre des instances de services disponibles. Il reçoit les enregistrements des services et permet leur découverte dynamique.
Fonction: Registre central des services
Configuration Eureka Server
// pom.xml - Dépendances Eureka Server
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-netflix-eureka-serverartifactId> dependency>
// EurekaServerApplication.java @SpringBootApplication @EnableEurekaServer public classEurekaServerApplication { public static voidmain(String[] args) {
SpringApplication.run(EurekaServerApplication.class, args);
}
}
Services qui s'enregistrent auprès du serveur Eureka et peuvent découvrir d'autres services. Chaque client envoie périodiquement des "heartbeats" pour signaler sa disponibilité.
Fonction: Enregistrement et découverte de services
Mécanisme de vérification de disponibilité des services. Chaque client envoie périodiquement des "heartbeats" au serveur pour signaler qu'il est toujours actif.
Fonction: Surveillance de la disponibilité
Configuration Heartbeat
// Paramètres de configuration du heartbeat eureka: instance: # Intervalle d'envoi du heartbeat (en secondes) lease-renewal-interval-in-seconds: 30 # Durée avant expiration de l'instance (en secondes) lease-expiration-duration-in-seconds: 90 # Délai initial avant le premier heartbeat initial-registration-replication-delay-seconds: 40 client: # Intervalle de mise à jour du registre local registry-fetch-interval-seconds: 30 # Intervalle de réplication des informations d'instance instance-info-replication-interval-seconds: 30 # Délai initial avant la première réplication initial-instance-info-replication-interval-seconds: 40
// Surveillance des heartbeats dans les logs /*
INFO [user-service] Renewing Leases
INFO [user-service] DiscoveryClient_USER-SERVICE:localhost:user-service:8080 - Heartbeat success
INFO [eureka-server] DS: Registry: 3 instances
*/
🛡️
SELF PRESERVATION MODE
Mode de protection qui empêche la suppression des services en cas de défaillance réseau. Eureka préfère conserver les services potentiellement disponibles plutôt que de les supprimer prématurément.
Fonction: Protection contre les faux positifs
Configuration Self Preservation
// Configuration du mode Self Preservation eureka: server: # Activer/désactiver le mode Self Preservation enable-self-preservation: true # Pourcentage minimum de renouvellements requis renewal-percent-threshold: 0.85 # Intervalle d'éviction des instances mortes eviction-interval-timer-in-ms: 60000 # Durée de conservation des données de réponse response-cache-auto-expiration-in-seconds: 180 # Intervalle de mise à jour du cache de réponse response-cache-update-interval-ms: 30000
// Indicateurs du mode Self Preservation /*
WARN [eureka-server] The self preservation mode is turned ON.
WARN [eureka-server] 15% of renewals are unimplemented.
INFO [eureka-server] Entered self preservation mode.
*/
⚖️
LOAD BALANCING
Intégration avec Ribbon pour la distribution des requêtes entre plusieurs instances d'un même service. Eureka fournit la liste des instances disponibles à Ribbon.
Fonction: Distribution équilibrée des charges
Configuration Load Balancing
// Utilisation avec RestTemplate @Configuration public classRestTemplateConfig { @LoadBalanced @Bean public RestTemplate restTemplate() { return new RestTemplate();
}
}
// Service utilisant RestTemplate avec load balancing @Service public classUserService { @Autowired private RestTemplate restTemplate;
public String callOrderService() { // Utilisation du nom de service au lieu de l'URL directe return restTemplate.getForObject( "http://order-service/api/orders",
String.class
);
}
}
// Utilisation avec Feign Client @FeignClient(name = "order-service") public interfaceOrderServiceClient { @GetMapping("/api/orders")
ListgetOrders();
@GetMapping("/api/orders/user/{userId}")
ListgetOrdersByUserId(@PathVariable Long userId);
}
📋
REGISTRE DES SERVICES
Interface web permettant de visualiser l'état des services enregistrés dans Eureka. Fournit des informations en temps réel sur la disponibilité des services.