Comprendre Spring Cloud Discovery Eureka Client avec exemple

View more Tutorials:

1- L'objectif de la leçon

Dans un système distribué (Distributed System), les services (applications) doivent être enregistrés auprès de " Service Registration"  (Enregistrement du Service) afin qu'ils puissent se découvrir mutuellement.
Dans la leçon précédente, nous avons créé un « Service Registration» utilisant la technologie Netflix ( Spring Cloud Netflix Eureka Server). Vous pouvez voir cette leçon en exploitant le lien ci-dessous :
OK, dans cette leçon, nous discuterons comment configurer un service (application) dans un système distribué afin qu'il devienne un Eureka Client. Cela signifie qu'il sera enregistré avec " Serivce Registration" ( Eureka Server).
Des  Eureka Client aura la liste d'autres  Eureka Client dans le système, nous allons manipuler ces listes avec le code  Java.

2- Créer le projet Spring Boot

Sur  Eclipse créez un projet  Spring Boot.
  • Name: SpringCloudDiscoveryEurekaClient
  • Group: org.o7planning
  • Artifact: SpringCloudDiscoveryEurekaClient
  • Description: Spring Cloud Discovery (Eureka Client)
  • Package: org.o7planning.eurekaclient
Le projet a été créé :
pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
    http://maven.apache.org/xsd/maven-4.0.0.xsd">
    
    <modelVersion>4.0.0</modelVersion>

    <groupId>org.o7planning</groupId>
    <artifactId>SpringCloudDiscoveryEurekaClient</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>

    <name>SpringCloudDiscoveryEurekaClient</name>
    <description>Spring Cloud Discovery (Eureka Client)</description>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.5.9.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
        <spring-cloud.version>Edgware.RELEASE</spring-cloud.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-eureka</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>


</project>

3- @EnableEurekaClient

L'usage  @EnableEurekaClient sert à annoter (annotate) sur l'application, vous allez transformer cette application en Eureka Client.
SpringCloudDiscoveryEurekaClientApplication.java
package org.o7planning.eurekaclient;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;

@EnableEurekaClient
@SpringBootApplication
public class SpringCloudDiscoveryEurekaClientApplication {

    public static void main(String[] args) {
        SpringApplication.run(SpringCloudDiscoveryEurekaClientApplication.class, args);
    }
    
}
application.yml
spring:
  application:
    name: ABC-SERVICE # ==> This is Service-Id
    

---
# Items that apply to ALL profiles:   
eureka:
  instance:
    appname: ABC-SERVICE  # ==> This is a instance of ABC-SERVICE
  client:    
    fetchRegistry: true
    serviceUrl:
#      defaultZone: http://my-eureka-server.com:9000/eureka
      defaultZone: http://my-eureka-server-us.com:9001/eureka
#      defaultZone: http://my-eureka-server-fr.com:9002/eureka
#      defaultZone: http://my-eureka-server-vn.com:9003/eureka
server:
  port: 8000  
 
---
spring:
  profiles: abc-service-replica01
eureka:
  instance:
    appname: ABC-SERVICE  # ==> This is a instance of ABC-SERVICE
  client:    
    fetchRegistry: true
    serviceUrl:
      defaultZone: http://my-eureka-server-us.com:9001/eureka  
server:
  port: 8001   
    
---
spring:
  profiles: abc-service-replica02
eureka:
  instance:
    appname: ABC-SERVICE  # ==> This is a instance of ABC-SERVICE
  client:    
    fetchRegistry: true
    serviceUrl:
      defaultZone: http://my-eureka-server-us.com:9001/eureka    
server:
  port: 8002
 
---
spring:
  profiles: abc-service-replica03
eureka:
  instance:
    appname: ABC-SERVICE  # ==> This is a instance of ABC-SERVICE
  client:    
    fetchRegistry: true
    serviceUrl:
      defaultZone: http://my-eureka-server-us.com:9001/eureka    
server:
  port: 8003
 
---
spring:
  profiles: abc-service-replica04
eureka:
  instance:
    appname: ABC-SERVICE  # ==> This is a instance of ABC-SERVICE
  client:    
    fetchRegistry: true
    serviceUrl:
      defaultZone: http://my-eureka-server-us.com:9001/eureka    
server:
  port: 8004  
 
---
spring:
  profiles: abc-service-replica05
eureka:
  instance:
    appname: ABC-SERVICE  # ==> This is a instance of ABC-SERVICE
  client:    
    fetchRegistry: true
    serviceUrl:
      defaultZone: http://my-eureka-server-us.com:9001/eureka    
server:
  port: 8005

4- Controller

Lorsque  Eureka Client s'enregistre au  Eureka Server (Service Registration), vous pouvez extraire la liste d'autres  Eureka Client s'enregistrant au  Eureka Server.
@Autowired
private DiscoveryClient discoveryClient;

...

// Get All Service Ids
List<String> serviceIds = this.discoveryClient.getServices();


// (Need!!) eureka.client.fetchRegistry=true
List<ServiceInstance> instances = this.discoveryClient.getInstances(serviceId);


for (ServiceInstance serviceInstance : instances) {
    System.out.println("URI: " + serviceInstance.getUri();
    System.out.println("Host: " + serviceInstance.getHost();
    System.out.println("Port: " + serviceInstance.getPort();
}
MainController.java
package org.o7planning.eurekaclient.controller;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.discovery.DiscoveryClient;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class MainController {

    @Autowired
    private DiscoveryClient discoveryClient;

    @ResponseBody
    @RequestMapping(value = "/", method = RequestMethod.GET)
    public String home() {

        return "<a href='showAllServiceIds'>Show All Service Ids</a>";
    }

    @ResponseBody
    @RequestMapping(value = "/showAllServiceIds", method = RequestMethod.GET)
    public String showAllServiceIds() {

        List<String> serviceIds = this.discoveryClient.getServices();

        if (serviceIds == null || serviceIds.isEmpty()) {
            return "No services found!";
        }
        String html = "<h3>Service Ids:</h3>";
        for (String serviceId : serviceIds) {
            html += "<br><a href='showService?serviceId=" + serviceId + "'>" + serviceId + "</a>";
        }
        return html;
    }

    @ResponseBody
    @RequestMapping(value = "/showService", method = RequestMethod.GET)
    public String showFirstService(@RequestParam(defaultValue = "") String serviceId) {

        // (Need!!) eureka.client.fetchRegistry=true
        List<ServiceInstance> instances = this.discoveryClient.getInstances(serviceId);

        if (instances == null || instances.isEmpty()) {
            return "No instances for service: " + serviceId;
        }
        String html = "<h2>Instances for Service Id: " + serviceId + "</h2>";

        for (ServiceInstance serviceInstance : instances) {
            html += "<h3>Instance: " + serviceInstance.getUri() + "</h3>";
            html += "Host: " + serviceInstance.getHost() + "<br>";
            html += "Port: " + serviceInstance.getPort() + "<br>";
        }

        return html;
    }

    // A REST method, To call from another service.
    // See in Lesson "Load Balancing with Ribbon".
    @ResponseBody
    @RequestMapping(value = "/hello", method = RequestMethod.GET)
    public String hello() {

        return "<html>Hello from ABC-SERVICE</html>";
    }

}

5- Exécuter l'application sur Eclipse

Tout d'abord, vous devez vous assurer que vous avez exécuté le  Eureka Server:
Lorsque vous pouvez exécuter le  Eureka Client directement sur  Eclipse, il se sera enregistré au  Eureka Server.
Accédez au  URL ci-dessous, vous pouvez voir le  Eureka Client enregistré avec  Eureka Server.

6- Exécuter les répliques (replica)

Utilisez la fonction  "Maven Install" pour créer le fichier  jar du projet. Cliquez sur le bouton droit du projet, sélectionnez ;
  • Run As/Maven Install
Et vous avez un fichier  jar dans le répertoire  target du projet.
Copiez le fichier  jar que vous avez créé dans certain fichier, et créez deux fichiers  BAT :
  • abc-service-replica01.bat
  • abc-service-replica02.bat
  • abc-service-replica03.bat
  • abc-service-replica04.bat
  • abc-service-replica05.bat
abc-service-replica01.bat
java -jar -Dspring.profiles.active=abc-service-replica01 SpringCloudDiscoveryEurekaClient-0.0.1-SNAPSHOT.jar
abc-service-replica02.bat
java -jar -Dspring.profiles.active=abc-service-replica02 SpringCloudDiscoveryEurekaClient-0.0.1-SNAPSHOT.jar
abc-service-replica03.bat
java -jar -Dspring.profiles.active=abc-service-replica03 SpringCloudDiscoveryEurekaClient-0.0.1-SNAPSHOT.jar
abc-service-replica04.bat
java -jar -Dspring.profiles.active=abc-service-replica04 SpringCloudDiscoveryEurekaClient-0.0.1-SNAPSHOT.jar
abc-service-replica05.bat
java -jar -Dspring.profiles.active=abc-service-replica05 SpringCloudDiscoveryEurekaClient-0.0.1-SNAPSHOT.jar
Exécutez deux fichiers BAT :
Sur  Eureka Monitor vous pouvez observer des  Eureka Client qui se sont enregistrés sur  Eureka Server.

7- Test Discovery

OK, après l'exécution du  Eureka Client, vous pouvez voir comment il découvre d'autres  Eureka Client.
Accédez le  URL ci-dessous (Remarque, attendez pendant 30 secondes pour vous assurer que  Eureka Server et  Eureka Client  se sont mis à jour complètement leurs statuts).

View more Tutorials: