UL Systems Adventskalender 2019 - 18. Tag
Lesen Sie heute Tracing MP Guide von Helidon Eclipse MicroProfile Open Tracing und Jaeger Ich möchte die verteilte Tracing-Visualisierung ausprobieren. (Der Tracing MP Guide verwendet Zipkin, aber dieses Mal möchte ich Jaeger wegen des niedlichen Logos verwenden.)
In letzter Zeit ist es üblicher geworden, das gesamte System mit einer Microservice-Architektur zu konfigurieren. Wenn zu diesem Zeitpunkt ein Fehler oder eine Verzögerung in dem Prozess auftritt, der mehrere Dienste mit der im herkömmlichen monolithischen System verwendeten Methodenverfolgung umfasst, ist es schwierig zu bestimmen, wo sie auftritt, sodass die Verteilung durchgehend verfolgt wird Ein Mechanismus namens Tracing ist erforderlich.
Ein Open Source-basiertes Framework für die Entwicklung leichter Microservices, mit denen Microservices für Java erstellt werden können, das Oracle im September 2018 angekündigt hat.
Dieses Mal werde ich Helidon MP verwenden, das MaicroProfile unterstützt.
Eclipse MicroProfile ist eine Spezifikation der Enterprise Java API für Microservices. Es enthält jetzt APIs wie JAX-RS, JSON-P und CDI sowie APIs wie Konfiguration, Metriken und Fehlertoleranz. Der diesmal verwendete Helidon MP unterstützt Eclipse MicroProfile 3.2.
OpenTracing besteht aus API-Spezifikationen, Frameworks und Bibliotheken, die diese implementieren, sowie Projektdokumentation. Mit OpenTracing können Entwickler ihrem Anwendungscode mithilfe von APIs, die nicht an ein bestimmtes Produkt oder einen bestimmten Anbieter gebunden sind, Ablaufverfolgungsfunktionen hinzufügen.
Ein Open Source OpenTracing-kompatibles verteiltes Tracing-System, das von Dapper und OpenZipkin inspiriert und von Uber Technologies veröffentlicht wurde. Diesmal ist der OpenTracing-API-Teil in der folgenden Abbildung MicroProfile OpenTracing, und der Jaeger-Client-Teil ist der von Helidon bereitgestellte Client für Jaeger.
Zunächst möchte ich andere Teile als Client einrichten. In Bezug auf das Setup wird das All-in-One-Docker-Image veröffentlicht. Verwenden Sie es daher. (Geben Sie zunächst nur die minimal erforderlichen Ports an.)
$ docker run -d --name jaeger \
-p 5778:5778 \
-p 16686:16686 \
-p 14268:14268 \
jaegertracing/all-in-one:1.15
Helidons Jaeger-Client scheint standardmäßig HTTP 5778
zu verwenden.
(Dies kann durch Einstellung geändert werden)
Erstellen Sie dann das Hauptserviceprojekt mit dem Schnellstart des Helidon MP Maven-Archetyps.
$ mvn archetype:generate -DinteractiveMode=false \
-DarchetypeGroupId=io.helidon.archetypes \
-DarchetypeArtifactId=helidon-quickstart-mp \
-DarchetypeVersion=1.4.0 \
-DgroupId=io.helidon.main_service \
-DartifactId=main_service \
-Dpackage=io.helidon.main_service
Fügen Sie pom.xml die folgende Abhängigkeit hinzu und fügen Sie den Jaeger-Client hinzu.
pom.xml(hinzufügen)
<dependency>
<groupId>io.helidon.tracing</groupId>
<artifactId>helidon-tracing-jaeger</artifactId>
</dependency>
Geben Sie in "META-INF / microprofile-config.properties" den Dienstnamen an, der mit den von Helidon an Jaeger gesendeten Ablaufverfolgungsdaten verknüpft werden soll.
microprofile-config.properties
tracing.service=helidon-main-service
Jetzt möchte ich die bisher erzielten Ergebnisse sehen. Das durch Schnellstart erstellte Projekt wird erstellt, damit der Server durch Ausführen der Methode "Main" der Klasse "io.helidon.main_service.Main" gestartet werden kann.
Wenn Sie nach dem Starten des Servers auf "http: // localhost: 8080 / greet" zugreifen, wird der durch den Schnellstart erstellte Dienst ausgeführt und Sie sollten "{" message ":" Hello World! "}" Anzeigen.
$ curl http://localhost:8080/greet
{"message":"Hello World!"}
Wenn Sie sich die Ablaufverfolgungsdaten von der Jaeger-Benutzeroberfläche (http: // localhost: 16686 / search
) nach mehrmaligem Zugriff ansehen, sollten Sie die folgenden Ablaufverfolgungsdaten sehen.
Klicken Sie auf jede Ablaufverfolgung weiter, um die Seite mit den Ablaufverfolgungsdetails anzuzeigen, auf der die Bereiche aufgelistet sind. Sie können die Stammspanne und die Beziehungen zwischen allen Bereichen in der Ablaufverfolgung sowie die Zeitinformationen klar erkennen.
Sie können die Details der Spanne auch anzeigen, indem Sie auf jede Spannenzeile klicken.
Darüber hinaus ist die Ablaufverfolgung auf Klassen- oder Methodenebene möglich, indem Sie die von MicroProfile OpenTracing bereitgestellte Annotation "@ Traced" hinzufügen.
GreetingProvider.java
@Traced
@ApplicationScoped
public class GreetingProvider {
...
}
Als nächstes möchte ich eine Nachverfolgung über Dienste hinweg durchführen.
Erstellen Sie es mit dem Schnellstart des Helidon MP Maven-Archetyps sowie dem Hauptdienst und fügen Sie den Jaeger-Client hinzu.
$ mvn archetype:generate -DinteractiveMode=false \
-DarchetypeGroupId=io.helidon.archetypes \
-DarchetypeArtifactId=helidon-quickstart-mp \
-DarchetypeVersion=1.4.0 \
-DgroupId=io.helidon.second_service \
-DartifactId=second_service \
-Dpackage=io.helidon.second_service
pom.xml(hinzufügen)
<dependency>
<groupId>io.helidon.tracing</groupId>
<artifactId>helidon-tracing-jaeger</artifactId>
</dependency>
microprofile-config.properties(Nach der veränderung)
# Application properties. This is the default greeting
app.greeting=Hello From Second Service
# Microprofile server properties
server.port=8081
Wenn Sie den zweiten Dienst ausführen und den Vorgang überprüfen, werden die folgenden Ergebnisse erzielt.
$ curl http://localhost:8081/greet
{"message":"Hello From Second Service World!"}
Wechseln Sie, um den zweiten Dienst über den zuerst erstellten Hauptdienst aufzurufen.
Zunächst müssen Sie im Hauptdienst einen Rest-Client erstellen, um den zweiten Dienst aufzurufen. Im Gegensatz zum Tracing MP-Handbuch möchte ich es hier mit dem "Micro Profile Rest Client" erstellen.
SecondServiceClient.java
package io.helidon.main_service;
import org.eclipse.microprofile.rest.client.inject.RegisterRestClient;
import javax.json.JsonObject;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
@RegisterRestClient(baseUri="http://localhost:8081")
public interface SecondServiceClient {
@Path("/greet")
@GET
JsonObject getDefaultMessage();
}
Verwenden Sie dann den erstellten Client, um den zweiten Dienst vom Hauptdienst aus aufzurufen. Fügen Sie den erstellten SecondServiceClient in die aufrufende Klasse ein und rufen Sie den Second-Service mit SecondServiceClient für die Methode auf, die ursprünglich die Antwort zurückgegeben hat.
GreetResource.java
@Path("/greet")
@RequestScoped
public class GreetResource {
@Inject
@RestClient
SecondServiceClient secondServiceClient;
@GET
@Produces(MediaType.APPLICATION_JSON)
public JsonObject getDefaultMessage() {
// return createResponse("World");
return secondServiceClient.getDefaultMessage();
}
Führen Sie den Hauptdienst auf Port 8080
aus und stellen Sie sicher, dass der zweite Dienst aufgerufen wird.
$ curl http://localhost:8080/greet
{"message":"Hello From Second Service World!"}
Der Prozess dieses Mal ist so konfiguriert, dass die Anforderung von der Konsole den Hauptdienst schaltet und den zweiten Dienst aufruft.
Wenn Sie sich die Ablaufverfolgungsdaten dieser Anforderung in der Jaeger-Benutzeroberfläche ansehen, wird insgesamt so viel Verarbeitungszeit benötigt, und Sie können den Verarbeitungsablauf überprüfen.
Dieses Mal habe ich versucht, die verteilte Ablaufverfolgung mit Eclipse MicroProfile Open Tracing durchzuführen. Wenn die verteilte Ablaufverfolgung bei der Einführung eines verteilten Systems visualisiert werden kann, ist es möglicherweise einfacher zu verstehen, selbst wenn ein Systemfehler oder eine Verzögerung auftritt.
Zusätzlich zu OpenTracing verfügt Eclipse MicroProfile über Spezifikationen wie Eclipse MicroProfile Metrics und Eclipse MicroProfile Fault Tolerance, die von Helidon ebenfalls unterstützt werden. Möglicherweise können andere Optionen als das Spring Framework in Betracht gezogen werden, z. B. die Migration von Anwendungen, die derzeit Java EE verwenden.