Architecture et Configuration du Registre Eureka dans Spring Cloud

Au sein de l'écosystème Spring Cloud, la gestion de la découverte de services est souvent déléguée à Eureka, un framework originellement développé par Netflix et intégré via le projet spring-cloud-netflix. Cette solution repose sur une interaction entre deux composants distincts : le serveur d'enregistrement (Eureka Server) et le client de découverte (Eureka Client).

Fonctionnement du Serveur et du Client

Le rôle principal du Eureka Server est de centraliser l'enregistrement des services. Dès le démarrage, chaque nœud du système s'inscrit auprès du serveur, qui maintient ainsi une table de routage contenant les métadonnées de tous les services disponibles. Ces informations sont généralement consultables via une interface utilisateur fournie par le serveur.

Le Eureka Client, quant à lui, est une bibliothèque Java facilitant la communication avec le serveur. Il intègre nativement un mécanisme d'équilibrage de charge de type round-robin. Pour maintenir sa présence dans le registre, le client émet régulièrement des signaux de vie (heartbeats). Par défaut, cette intervalle est de 30 secondes. Si le serveur ne reçoit plus ces signaux pendant une durée déterminée (généralement 90 secondes), il considère le nœud comme défaillant et le retire de la liste des services actifs.

La haute disponibilité est assurée par la réplication des données entre plusieurs instances de Eureka Server. De plus, un mécanisme de cache côté client permet aux services de continuer à fonctionner même en cas d'indisponibilité totale du registre, en utilisant les dernières informations connues.

Configuration du Projet Parent

Pour garantir la compatibilité des versions entre les différents modules Spring Cloud, il est nécessaire de définir la gestion des dépendances dans le fichier POM principal.

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>Hoxton.SR9</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    <dependencies>
</dependencyManagement>

Mise en place du Eureka Server

L'implémentation du serveur nécessite l'ajout de la dépendance spécifique dans le fichier de build.

<dependencies>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
    </dependency>
</dependencies>

La configuration YAML doit indiquer que le serveur ne doit pas s'enregistrer lui-même ni récupérer le registre des autres, car il est l'autorité centrale.

server:
    port: 8761
eureka:
    client:
        register-with-eureka: false
        fetch-registry: false
        service-url:
            defaultZone: http://127.0.0.1:${server.port}/eureka/
    server:
        eviction-interval-timer-in-ms: 0

La classe principale doit être annotée pour activer la fonctionnalité de serveur.

@SpringBootApplication
@EnableEurekaServer
public class ServiceRegistryApplication {
    public static void main(String[] args) {
        SpringApplication.run(ServiceRegistryApplication.class, args);
    }
}

Configuration du Eureka Client

Les microservices qui souhaitent être découverts doivent inclure la dépendance client.

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>

Dans le fichier de configuration, il faut pointer vers l'adresse du serveur et ajuster les paramètres de bail (lease) pour contrôler la fréquence des heartbeats et la tolérance aux pannes.

eureka:
    client:
        service-url:
            defaultZone: http://localhost:8761/eureka
        registry-fetch-interval-seconds: 30
    instance:
        instance-id: ${spring.application.name}:${random.value}
        prefer-ip-address: true
        lease-renewal-interval-in-seconds: 30
        lease-expiration-duration-in-seconds: 90

Il est crucial que la durée d'expiration soit supérieure à l'intervalle de renouvellement. Une valeur trop faible risque de supprimer des instances saines lors de fluctuations réseau, tandis qu'une valeur trop élevée pourrait router du trafic vers des services déjà arrêtés.

L'activation du client se fait via l'annotation appropriée dans la classe de démarrage.

@EnableEurekaClient

Mécanisme de Protection (Self-Preservation)

Eureka Server intègre un mode de protection automatique. Si le ratio d'échecs des heartbeats sur une période de 15 minutes dépasse un certain seuil (généralement si moins de 85% des cœurs battent normalement), le serveur active ce mode. Cette situation survient souvent lors de partitions réseau ou d'instabilités temporaires.

Une fois activé, le serveur cesse de supprimer des instances du registre, même si leurs bails sont expirés, afin de préserver la disponibilité globale du système face à des erreurs de réseau potentielles. Lors de tests unitaires ou en environnement local monocycle, ce comportement peut être nuisible. Il est alors possible de désactiver cette fonctionnalité via la propriété suivante :

eureka.server.enable-self-preservation: false

Étiquettes: spring-cloud-netflix eureka-server Service-Discovery Microservices Java

Publié le 26 octobre à 02h48