Eureka – Microservice-Registry mit Spring Cloud

Seite 3: Beispiel, Teil 2

Inhaltsverzeichnis

Entwickler können den registrierten Service zum Beispiel in einer Kommandozeilen-Applikation nutzen, hier mit dem Namen Discovery-Client. Die Applikation ruft den HELLOWORLD-SERVICE anhand seines logischen Namens auf und gibt das Ergebnis auf der Kommandozeile aus. Dafür ist der Discovery-Client auch als Eureka-Client zu annotieren. Er benötigt somit die folgenden Dependencies.

<parent>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-parent</artifactId>
<version>1.0.1.RELEASE</version>
<relativePath/>
</parent>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>

Für die Implementierung des Discovery-Clients benötigen Entwickler die Spring-Boot-Annotation @SpringBootApplication und die Spring-Cloud-Annotation @EnableEurekaClient. Damit der SpringApplicationBuilder weiß, dass es sich um eine Kommandozeilen-Applikation handelt, gibt man Folgendes an:

new SpringApplicationBuilder(DiscoveryClientApplication.class)
.web(false)
.run(args);

Dadurch wird die run-Methode der Klasse RestTemplateExample beim Start aufgerufen. Sie implementiert den CommandLineRunner. Die ganze Magie des Service-Bindings erfolgt im Spring RestTemplate. Hier benutzt man in der URL den logischen Namen "helloWorld-service" statt der tatsächlichen URL "localhost:8888".

DiscoveryClientApplication.java

package com.maibornwolff.client;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.cloud.netflix.feign.EnableFeignClients;
import org.springframework.stereotype.Component;
import org.springframework.web.client.RestTemplate;

@SpringBootApplication
@EnableEurekaClient
public class DiscoveryClientApplication {
public static void main(String[] args) {
new SpringApplicationBuilder(DiscoveryClientApplication.class)
.web(false)
.run(args);
}
}

@Component
class RestTemplateExample implements CommandLineRunner {

@Autowired
private RestTemplate restTemplate;

@Override
public void run(String... strings) throws Exception {
// use the "smart" Eureka-aware RestTemplate
String exchange =
this.restTemplate.getForObject(
"http://helloWorld-service/hello",
String.class);

System.out.println(exchange);
}

}

Beim Start des Discovery-Clients fragt der Eureka-Client die Service-Registry des Eureka-Servers ab. Vor dem tatsächlichen REST-Aufruf überprüft der Client, ob unter dem logischen Namen ein registrierter Service existiert, und ersetzt ihn durch den physikalischen Endpunkt, mit dem wiederum der REST-Aufruf durchgeführt wird.

Die Ausgabe der Konsole lautet, wie bei der Implementierung des REST-Services definiert, Hello cloudy world. Das zeigt, dass die Service-Registrierung funktioniert und die Services unter ihrem logischen Namen gefunden werden.

Als kleine Erweiterung lässt sich durch Anpassung des Ports eine weitere Instanz des Hello-World-Services starten. Der Eureka-Client sorgt nun für ein Round Robin Load Balancing zwischen den beiden Services. Beendet man einen der Dienste, erkennt der Eureka-Server das und leitet die Anfragen nur noch an den aktiven Service weiter.