Verteiltes Tracing ist wichtig, um Einblicke in eine mehrschichtige Mikrodienstarchitektur zu erhalten und sie zu beobachten. Wenn Sie Dienst-zu-Dienst-Aufrufe verketten, z. B. von Dienst A zu Dienst B zu Dienst C, ist es wichtig, dass Sie wissen, ob die Aufrufe erfolgreich waren und wie hoch die Latenz in jedem Schritt ist.
In Spring Boot können Sie Spring Cloud Sleuth verwenden, um Ihrer Anwendung nahtlos die Instrumentierung für verteiltes Tracing hinzuzufügen. Standardmäßig können die Trace-Daten an Zipkin weitergeleitet werden.
Google Cloud Platform bietet Stackdriver Trace, einen verwalteten Dienst, mit dem Sie Trace-Daten speichern können, ohne Ihre eigene Zipkin-Instanz oder Ihren eigenen Speicher verwalten zu müssen. Stackdriver Trace kann auch Berichte zur Latenzverteilung erstellen und Leistungsverschlechterungen automatisch erkennen.
Sie haben zwei Möglichkeiten, Stackdriver Trace in einer Spring Boot-Anwendung zu verwenden:
- Verwenden Sie einen Stackdriver Trace Zipkin-Proxy und konfigurieren Sie Spring Cloud Sleuth so, dass dieser Proxy als Zipkin-Endpunkt verwendet wird.
- Alternativ können Sie Spring Cloud GCP Trace verwenden, das sich nahtlos in Spring Cloud Sleuth einfügt und die Tracedaten direkt an Stackdriver Trace weiterleitet.
In diesem Codelab erfahren Sie, wie Sie eine neue Spring Boot-Anwendung erstellen und Spring Cloud GCP Trace für verteiltes Tracing verwenden.
Lerninhalte
- So erstellen Sie eine Spring Boot-Java-Anwendung und konfigurieren Stackdriver Trace.
Voraussetzungen
- Google Cloud Platform-Projekt
- Ein Browser, z. B. Chrome oder Firefox
- Erfahrung mit standardmäßigen Linux-Texteditoren wie Vim, EMACs oder Nano
Wie werden Sie diese Anleitung verwenden?
Wie würden Sie Ihre Erfahrung mit der Entwicklung von HTML/CSS-Web-Apps bewerten?
Wie würden Sie Ihre Erfahrungen mit der Verwendung von Google Cloud Platform-Diensten bewerten?
Einrichtung der Umgebung im eigenen Tempo
Wenn Sie noch kein Google-Konto (Gmail oder Google Apps) haben, müssen Sie eins erstellen. Melden Sie sich in der Google Cloud Platform Console (console.cloud.google.com) an und erstellen Sie ein neues Projekt:
Notieren Sie sich die Projekt-ID, also den projektübergreifend nur einmal vorkommenden Namen eines Google Cloud-Projekts. Der oben angegebene Name ist bereits vergeben und kann leider nicht mehr verwendet werden. Sie wird in diesem Codelab später als PROJECT_ID
bezeichnet.
Als Nächstes müssen Sie die Abrechnung in der Cloud Console aktivieren, um Google Cloud-Ressourcen verwenden zu können.
Dieses Codelab sollte Sie nicht mehr als ein paar Dollar kosten, aber es könnte mehr sein, wenn Sie sich für mehr Ressourcen entscheiden oder wenn Sie sie laufen lassen (siehe Abschnitt „Bereinigen“ am Ende dieses Dokuments).
Neuen Nutzern der Google Cloud Platform steht eine kostenlose Testversion mit einem Guthaben von 300$ zur Verfügung.
Google Cloud Shell
Während Sie Google Cloud und Kubernetes von Ihrem Laptop aus per Fernzugriff nutzen können, wird in diesem Codelab Google Cloud Shell verwendet, eine Befehlszeilenumgebung, die in der Cloud ausgeführt wird.
Google Cloud Shell aktivieren
Klicken Sie in der GCP Console oben rechts in der Symbolleiste auf das Cloud Shell-Symbol:
Klicken Sie dann auf "Cloud Shell starten":
Die Bereitstellung und Verbindung mit der Umgebung dauert nur einen Moment:
Diese virtuelle Maschine verfügt über sämtliche Entwicklertools, die Sie benötigen. Sie bietet ein Basisverzeichnis mit 5 GB nichtflüchtigem Speicher und läuft auf der Google Cloud, wodurch Netzwerkleistung und Authentifizierung deutlich verbessert werden. Sie können die meisten, wenn nicht sogar alle Schritte in diesem Lab einfach mit einem Browser oder Ihrem Google Chromebook durchführen.
Sobald Sie mit Cloud Shell verbunden sind, sollten Sie sehen, dass Sie bereits authentifiziert sind und das Projekt bereits auf Ihre PROJECT_ID eingestellt ist.
Führen Sie in Cloud Shell den folgenden Befehl aus, um zu prüfen, ob Sie authentifiziert sind:
gcloud auth list
Befehlsausgabe
Credentialed accounts: - <myaccount>@<mydomain>.com (active)
gcloud config list project
Befehlsausgabe
[core] project = <PROJECT_ID>
Ist dies nicht der Fall, können Sie die Einstellung mit diesem Befehl vornehmen:
gcloud config set project <PROJECT_ID>
Befehlsausgabe
Updated property [core/project].
Nachdem Cloud Shell gestartet wurde, können Sie über die Befehlszeile eine neue Spring Boot-Anwendung mit Spring Initializr generieren:
$ curl https://start.spring.io/starter.tgz -d packaging=jar \
-d dependencies=web,lombok,cloud-gcp,cloud-starter-sleuth \
-d baseDir=trace-service-one | tar -xzvf - \
&& cd trace-service-one
Erstellen Sie einen neuen REST-Controller, indem Sie eine neue Klasse hinzufügen:
src/main/java/com/example/demo/WorkController.java
package com.example.demo;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.Random;
@RestController
@Slf4j
public class WorkController {
Random r = new Random();
public void meeting() {
try {
log.info("meeting...");
// Delay for random number of milliseconds.
Thread.sleep(r.nextInt(500));
} catch (InterruptedException e) {
}
}
@GetMapping("/")
public String work() {
// What is work? Meetings!
// When you hit this URL, it'll call meetings() 5 times.
// Each time will have a random delay.
log.info("starting to work");
for (int i = 0; i < 5; i++) {
this.meeting();
}
log.info("finished!");
return "finished work!";
}
}
Sie können die Spring Boot-Anwendung wie gewohnt mit dem Spring Boot-Plug-in starten. Wir überspringen die Tests für dieses Lab:
$ ./mvnw -DskipTests spring-boot:run
Anschließend klicken Sie in der Cloud Shell-Symbolleiste auf das Symbol für die Webvorschau und wählen Vorschau auf Port 8080 aus.
Nach kurzer Zeit sollte das Ergebnis angezeigt werden:
In Cloud Shell sollten Sie auch die Logmeldungen mit Trace-ID und Span-ID sehen:
Stackdriver Trace API aktivieren
Sie müssen zuerst die Stackdriver Trace API aktivieren, um Stackdriver Trace zum Speichern Ihrer Trace-Daten verwenden zu können. Rufen Sie API-Dienste → Bibliothek auf, um die API zu aktivieren.
Suchen Sie nach Stackdriver Trace.
Klicken Sie auf Stackdriver Trace API und dann auf Aktivieren, falls die API noch nicht aktiviert ist.
Standardanmeldedaten für Anwendungen einrichten
Für dieses Lab müssen Sie ein Standardanmeldedaten für Anwendungen konfigurieren. Diese Anmeldedaten werden automatisch vom Spring Cloud GCP Trace Starter übernommen.
Melden Sie sich zuerst an:
$ gcloud auth application-default login
You are running on a Google Compute Engine virtual machine.
The service credentials associated with this virtual machine
will automatically be used by Application Default
Credentials, so it is not necessary to use this command.
If you decide to proceed anyway, your user credentials may be visible
to others with access to this virtual machine. Are you sure you want
to authenticate with your personal account?
Do you want to continue (Y/n)? Y
Go to the following link in your browser:
https://accounts.google.com/o/oauth2/auth...
Enter verification code: ...
Klicken Sie auf den Link, um einen neuen Browsertab zu öffnen, und klicken Sie dann auf Zulassen.
Kopieren Sie dann den Bestätigungscode, fügen Sie ihn in Cloud Shell ein und drücken Sie die Eingabetaste. Hier sollten Sie dies sehen:
Credentials saved to file: [/tmp/tmp.jm9bnQ4R9Q/application_default_credentials.json]
These credentials will be used by any library that requests
Application Default Credentials.
Spring Cloud GCP Trace hinzufügen
In diesem Dienst haben wir Spring Cloud Sleuth bereits für das Tracing verwendet. Fügen wir den Spring Cloud GCP Trace-Starter hinzu, um die Daten an Stackdriver Trace weiterzuleiten.
Fügen Sie die Spring Cloud GCP Trace-Abhängigkeit hinzu:
pom.xml
<project>
...
<dependencies>
...
<!-- Add Stackdriver Trace Starter -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-gcp-starter-trace</artifactId>
</dependency>
</dependencies>
...
</project>
Standardmäßig erfasst Spring Cloud Sleuth nicht jede Anfrage. Um unsere Tests zu vereinfachen, erhöhen Sie die Stichprobenrate in application.properties
auf 100 %, damit wir die Tracedaten sehen können. Außerdem können Sie einige URLs ignorieren, die für uns nicht relevant sind:
$ echo "
spring.sleuth.sampler.probability=1.0
spring.sleuth.web.skipPattern=(^cleanup.*|.+favicon.*)
" > src/main/resources/application.properties
Führen Sie die Anwendung noch einmal aus und verwenden Sie die Cloud Shell-Webvorschau, um die Anwendung aufzurufen:
$ export GOOGLE_CLOUD_PROJECT=`gcloud config list --format 'value(core.project)'`
$ ./mvnw -DskipTests spring-boot:run
Standardmäßig werden Trace-Daten in Spring Cloud GCP Trace gebatcht und alle 10 Sekunden oder wenn eine Mindestanzahl von Trace-Daten empfangen wurde, gesendet. Dies ist konfigurierbar. Weitere Informationen finden Sie in der Spring Cloud GCP Trace-Referenzdokumentation.
Anfrage an den Dienst stellen:
$ curl localhost:8080
Rufen Sie in der Cloud Console Stackdriver → Trace → Trace-Liste auf.
Beschränken Sie den Zeitraum oben auf eine Stunde. Automatisches Aufladen ist standardmäßig aktiviert. Sobald Trace-Daten eingehen, sollten sie also in der Console angezeigt werden.
Die Tracedaten sollten nach etwa 30 Sekunden angezeigt werden.
Klicken Sie auf den blauen Punkt, um die Trace-Details aufzurufen:
Das war ganz einfach.
Öffnen Sie eine neue Cloud Shell-Sitzung, indem Sie auf das Symbol + klicken:
Erstellen Sie in der neuen Sitzung die zweite Spring Boot-Anwendung:
$ curl https://start.spring.io/starter.tgz -d packaging=jar \
-d dependencies=web,lombok,cloud-gcp,cloud-starter-sleuth \
-d baseDir=trace-service-two | tar -xzvf - \
&& cd trace-service-two
Erstellen Sie einen neuen REST-Controller, indem Sie eine neue Klasse hinzufügen:
src/main/java/com/example/demo/MeetingController.java
package com.example.demo;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.Random;
@RestController
@Slf4j
public class MeetingController {
Random r = new Random();
@GetMapping("/meet")
public String meeting() {
try {
log.info("meeting...");
Thread.sleep(r.nextInt(500 - 20 + 1) + 20);
} catch (InterruptedException e) {
}
return "finished meeting";
}
}
Spring Cloud GCP Trace zu pom.xml hinzufügen
pom.xml
<project>
...
<dependencies>
...
<!-- Add Stackdriver Trace starter -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-gcp-starter-trace</artifactId>
</dependency>
</dependencies>
...
</project>
Konfigurieren Sie Sleuth so, dass 100% der Anfragen erfasst werden:
src/main/resources/application.properties
$ echo "
spring.sleuth.sampler.probability=1.0
spring.sleuth.web.skipPattern=(^cleanup.*|.+favicon.*)
" > src/main/resources/application.properties
Schließlich können Sie die Spring Boot-Anwendung auf Port 8081 mit dem Spring Boot-Plugin starten:
$ export GOOGLE_CLOUD_PROJECT=`gcloud config list --format 'value(core.project)'`
$ ./mvnw -DskipTests spring-boot:run -Dserver.port=8081
Kehren Sie zum ersten Cloud Shell-Sitzungsfenster zurück, während trace-service-two
ausgeführt wird, und nehmen Sie Änderungen an trace-service-one
vor.
Initialisieren Sie zuerst eine neue RestTemplate
-Bean:
src/main/java/com/example/demo/DemoApplication.java
package com.example.demo;
...
import org.springframework.web.client.RestTemplate;
import org.springframework.context.annotation.Bean;
@SpringBootApplication
public class DemoApplication {
@Bean
public RestTemplate restTemplate() {
return new RestTemplate();
}
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
Rufen Sie in WorkController.meeting()
den Besprechungsdienst auf.
src/main/java/com/example/demo/WorkController.java
package com.example.demo;
...
import org.springframework.web.client.RestTemplate;
import org.springframework.beans.factory.annotation.Autowired;
@RestController
@Slf4j
public class WorkController {
@Autowired
RestTemplate restTemplate;
public void meeting() {
String result = restTemplate.getForObject("http://localhost:8081/meet", String.class);
log.info(result);
}
...
}
Starten Sie den Dienst noch einmal und lösen Sie den Endpunkt über die Webvorschau aus:
$ export GOOGLE_CLOUD_PROJECT=`gcloud config list --format 'value(core.project)'`
$ ./mvnw -DskipTests spring-boot:run
In beiden Sitzungsfenstern sollten die Logmeldungen angezeigt werden, wobei die Trace-ID von einem Dienst an einen anderen weitergegeben wird.
In der Trace-Liste von Stackdriver Trace sollte der zweite Trace angezeigt werden:
Sie können auf den neuen blauen Punkt klicken, um die Trace-Details aufzurufen:
Sie können auch auf einen beliebigen Span in diesem Diagramm klicken, um die Spandetails aufzurufen.
Wenn Sie Stackdriver Trace als Speicher für Trace-Daten verwenden, kann Stackdriver Trace die Daten nutzen, um einen Bericht zur Latenzverteilung zu erstellen. Sie benötigen mehr als 100 Traces, um den Bericht so zu erstellen:
Außerdem kann Stackdriver Trace unter Analysebericht automatisch Leistungsverschlechterungen desselben Dienstes in zwei verschiedenen Zeiträumen erkennen.
In diesem Lab haben Sie zwei einfache Dienste erstellt, verteiltes Tracing mit Spring Cloud Sleuth hinzugefügt und Spring Cloud GCP verwendet, um die Trace-Informationen an Stackdriver Trace weiterzuleiten.
Sie haben Ihre erste App Engine-Webanwendung geschrieben.
Weitere Informationen
- Stackdriver Trace: https://cloud.google.com/trace/
- Spring on GCP-Projekt: http://cloud.spring.io/spring-cloud-gcp/
- GitHub-Repository für Spring on GCP: https://github.com/spring-cloud/spring-cloud-gcp
- Java auf der Google Cloud Platform: https://cloud.google.com/java/
Lizenz
Dieser Text ist mit einer Creative Commons Attribution 2.0 Generic License lizenziert.