Eureka – Microservice-Registry mit Spring Cloud
Seite 3: Beispiel, Teil 2
Den Service über einen Discovery-Client nutzen
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);
}
}
Test: Hello cloudy world
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.