1. Übersicht
Verteiltes Tracing ist wichtig, um Einblicke und Beobachtbarkeit für eine mehrstufige Mikrodienstarchitektur zu gewinnen. Wenn Sie Dienst- und Dienstaufrufe verkettet haben, von Dienst A über Dienst B bis Dienst C, ist es wichtig zu verstehen, dass die Aufrufe erfolgreich waren, und auch die Latenz bei jedem Schritt.
In Spring Boot können Sie Spring Cloud Sleuth verwenden, um Ihrer Anwendung nahtlos die verteilte Tracing-Instrumentierung hinzuzufügen. Standardmäßig können die Trace-Daten an Zipkin weitergeleitet werden.
Zur Google Cloud Platform gehört Cloud Trace, ein verwalteter Dienst, mit dem Sie Trace-Daten speichern können, ohne eine eigene Zipkin-Instanz oder einen eigenen Speicher verwalten zu müssen. Cloud Trace kann außerdem Latenzverteilungsberichte erstellen und Leistungsabfälle automatisch erkennen.
Sie haben zwei Möglichkeiten, Cloud Trace von einer Spring Boot-Anwendung aus zu verwenden:
- Verwenden Sie einen Stackdriver Trace Zipkin-Proxy und konfigurieren Sie Spring Cloud Sleuth einfach 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 einbinden und die Trace-Daten direkt an Cloud 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.
Aufgaben in diesem Lab
- Spring Boot Java-Anwendung erstellen und Cloud Trace konfigurieren
Voraussetzungen
- Google Cloud Platform-Projekt
- Browser, z. B. Chrome oder Firefox
- Erfahrung mit standardmäßigen Linux-Texteditoren wie vim, EMAC oder Nano
Wie möchten Sie diese Anleitung nutzen?
<ph type="x-smartling-placeholder">Wie würden Sie Ihre Erfahrung mit der Erstellung von HTML/CSS-Web-Apps bewerten?
<ph type="x-smartling-placeholder">Wie würden Sie Ihre Erfahrungen im Umgang mit Google Cloud Platform-Diensten bewerten?
<ph type="x-smartling-placeholder">2. Einrichtung und Anforderungen
Umgebung für das selbstbestimmte Lernen einrichten
- Melden Sie sich in der Google Cloud Console an und erstellen Sie ein neues Projekt oder verwenden Sie ein vorhandenes Projekt. Wenn Sie noch kein Gmail- oder Google Workspace-Konto haben, müssen Sie eines erstellen.
- Der Projektname ist der Anzeigename für die Projektteilnehmer. Es handelt sich um eine Zeichenfolge, die von Google APIs nicht verwendet wird. Sie können sie jederzeit aktualisieren.
- Die Projekt-ID ist für alle Google Cloud-Projekte eindeutig und unveränderlich. Sie kann nach dem Festlegen nicht mehr geändert werden. Die Cloud Console generiert automatisch einen eindeutigen String. ist Ihnen meist egal, was es ist. In den meisten Codelabs musst du auf deine Projekt-ID verweisen, die üblicherweise als
PROJECT_ID
bezeichnet wird. Wenn Ihnen die generierte ID nicht gefällt, können Sie eine weitere zufällige ID generieren. Alternativ können Sie einen eigenen verwenden und nachsehen, ob er verfügbar ist. Sie kann nach diesem Schritt nicht mehr geändert werden und bleibt für die Dauer des Projekts erhalten. - Zur Information gibt es noch einen dritten Wert, die Projektnummer, die von manchen APIs verwendet wird. Weitere Informationen zu allen drei Werten finden Sie in der Dokumentation.
- Als Nächstes müssen Sie in der Cloud Console die Abrechnung aktivieren, um Cloud-Ressourcen/APIs verwenden zu können. Dieses Codelab ist kostengünstig. Sie können die von Ihnen erstellten Ressourcen oder das Projekt löschen, um Ressourcen herunterzufahren, um zu vermeiden, dass über diese Anleitung hinaus Kosten anfallen. Neue Google Cloud-Nutzer haben Anspruch auf das kostenlose Testprogramm mit 300$Guthaben.
Google Cloud Shell
Sie können Google Cloud und Kubernetes über Ihren Laptop remote bedienen. In diesem Codelab verwenden wir jedoch Google Cloud Shell, eine Befehlszeilenumgebung, die in der Cloud ausgeführt wird.
Cloud Shell aktivieren
- Klicken Sie in der Cloud Console auf Cloud Shell aktivieren .
Wenn Sie Cloud Shell zum ersten Mal starten, wird ein Zwischenbildschirm mit einer Beschreibung der Funktion angezeigt. Wenn ein Zwischenbildschirm angezeigt wird, klicken Sie auf Weiter.
Die Bereitstellung und Verbindung mit Cloud Shell dauert nur einen Moment.
Diese virtuelle Maschine verfügt über alle erforderlichen Entwicklertools. Es bietet ein Basisverzeichnis mit 5 GB nichtflüchtigem Speicher und wird in Google Cloud ausgeführt. Dadurch werden die Netzwerkleistung und die Authentifizierung erheblich verbessert. Viele, wenn nicht sogar alle Arbeiten in diesem Codelab können mit einem Browser erledigt werden.
Sobald Sie mit Cloud Shell verbunden sind, sollten Sie sehen, dass Sie authentifiziert sind und das Projekt auf Ihre Projekt-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 ACTIVE ACCOUNT * <my_account>@<my_domain.com> To set the active account, run: $ gcloud config set account `ACCOUNT`
- Führen Sie in Cloud Shell den folgenden Befehl aus, um zu prüfen, ob der gcloud-Befehl Ihr Projekt kennt:
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].
3. Neuen Spring Boot REST-Dienst erstellen
Nach dem Start von Cloud Shell können Sie die Befehlszeile verwenden, um mit Spring Initializr eine neue Spring Boot-Anwendung zu generieren:
$ curl https://start.spring.io/starter.tgz -d packaging=jar \
-d bootVersion=2.7.6 \
-d dependencies=web,lombok,cloud-gcp,distributed-tracing \
-d jvmVersion=17 \
-d type=maven-project \
-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!";
}
}
Überprüfen Sie, ob Sie die richtige JVM-Version für die Anwendung haben:
$ export JAVA_HOME=/usr/lib/jvm/java-1.17.0-openjdk-amd64
Sie können die Spring Boot-Anwendung normal mit dem Spring Boot-Plug-in starten. In diesem Lab überspringen wir die Tests:
$ ./mvnw -DskipTests spring-boot:run
Anschließend klicken Sie in der Cloud Shell-Symbolleiste auf "Web Preview" (Webvorschau) und wählenPreview on port 8080 (Vorschau auf Port 8080) aus.
Nach einer kurzen Wartezeit sollten Sie folgendes Ergebnis sehen:
In Cloud Shell sollten auch die Logeinträge mit Trace-ID und Span-ID angezeigt werden:
4. Cloud Trace verwenden
Cloud Trace API aktivieren
Sie müssen zuerst die Cloud Trace API aktivieren, bevor Sie Ihre Trace-Daten mit Cloud Trace speichern können. Führen Sie folgenden Befehl aus, um die API zu aktivieren:
$ gcloud services enable cloudtrace.googleapis.com
Standardanmeldedaten für Anwendungen einrichten
Für dieses Lab müssen Sie Standardanmeldedaten für Anwendungen konfigurieren. Diese Anmeldedaten werden automatisch vom Spring Cloud GCP Trace-Starter ausgewählt.
Melden Sie sich zunächst 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 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 bereits Spring Cloud Sleuth zum Tracing verwendet. Fügen Sie den Spring Cloud GCP Trace-Starter hinzu, um die Daten an Cloud Trace weiterzuleiten.
Fügen Sie die Spring Cloud GCP Trace-Abhängigkeit hinzu:
pom.xml
<project>
...
<dependencies>
...
<!-- Add Cloud Trace Starter -->
<dependency>
<groupId>com.google.cloud</groupId>
<artifactId>spring-cloud-gcp-starter-trace</artifactId>
</dependency>
</dependencies>
...
</project>
Standardmäßig erfasst Spring Cloud Sleuth nicht jede Anfrage. Um unsere Tests etwas einfacher zu gestalten, erhöhen Sie die Stichprobenrate in application.properties
auf 100 %, damit wir die Trace-Daten sehen und einige URLs ignorieren, die uns nicht wichtig 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 sie anzusehen:
$ export GOOGLE_CLOUD_PROJECT=`gcloud config list --format 'value(core.project)'`
$ ./mvnw -DskipTests spring-boot:run
Spring Cloud GCP Trace fasst Trace-Daten standardmäßig zusammen und sendet sie alle 10 Sekunden oder wenn eine Mindestanzahl von Trace-Daten empfangen wird. Dies ist konfigurierbar. Weitere Informationen finden Sie in der Referenzdokumentation zu Spring Cloud GCP Trace.
Stellen Sie eine Anfrage an den Dienst:
$ curl localhost:8080
Gehen Sie in der Cloud Console zu Vorgänge → Trace → Trace-Liste
Grenzen Sie oben den Zeitraum auf eine Stunde ein. Die Option Automatische Aktualisierung ist standardmäßig aktiviert. Sobald die Trace-Daten eintreffen, sollten sie in der Konsole angezeigt werden.
Die Trace-Daten sollten in etwa 30 Sekunden angezeigt werden.
Klicken Sie auf den blauen Punkt, um die Tracedetails aufzurufen:
Das war ziemlich einfach!
5. Zweite Spring Boot-Webanwendung erstellen
Öffnen Sie eine neue Cloud Shell-Sitzung. Klicken Sie dazu auf das Symbol +:
Erstellen Sie in der neuen Sitzung die zweite Spring Boot-Anwendung:
$ curl https://start.spring.io/starter.tgz -d packaging=jar \
-d bootVersion=2.7.6 \
-d dependencies=web,lombok,cloud-gcp,distributed-tracing \
-d jvmVersion=17 \
-d type=maven-project \
-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 Cloud Trace starter -->
<dependency>
<groupId>com.google.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 mit dem Spring Boot-Plug-in auf Port 8081 starten:
$ export GOOGLE_CLOUD_PROJECT=`gcloud config list --format 'value(core.project)'`
$ ./mvnw -DskipTests spring-boot:run -Dspring-boot.run.jvmArguments="-Dserver.port=8081"
6. Ersten Dienst aktualisieren, um zweiten Dienst zu nutzen
Während trace-service-two
ausgeführt wird, kehren Sie zum ersten Cloud Shell-Sitzungsfenster zurück und ändern Sie trace-service-one
.
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 an.
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 neu und lösen Sie den Endpunkt über die Befehlszeile aus:
$ export GOOGLE_CLOUD_PROJECT=`gcloud config list --format 'value(core.project)'`
# The '&' places the process in the background. Bring it back to the foreground with 'fg'.
$ ./mvnw -DskipTests spring-boot:run &
$ curl localhost:8080
In beiden Sitzungsfenstern sollten die Protokollmeldungen angezeigt werden, wobei die Trace-ID von einem Dienst an einen anderen weitergegeben wird.
In der Trace-Liste von Cloud 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 eine Span in diesem Diagramm klicken, um die Details anzuzeigen.
7. Latenzverteilung und Leistungsbericht
Wenn Sie Cloud Trace als Trace-Datenspeicher verwenden, kann Cloud Trace anhand der Daten einen Bericht zur Latenzverteilung erstellen. Sie benötigen mehr als 100 Traces, um den Bericht so zu erstellen:
Für die ersten 100 Anfragen können Sie hey verwenden, das in Cloud Shell vorinstalliert ist.
$ hey localhost:8080 -n 150
Darüber hinaus kann Cloud Trace unter Analysebericht automatisch Leistungsabfälle desselben Dienstes über zwei verschiedene Zeiträume hinweg erkennen.
8. Zusammenfassung
In diesem Lab haben Sie zwei einfache Dienste erstellt und verteiltes Tracing mit Spring Cloud Sleuth hinzugefügt. Außerdem haben Sie Spring Cloud GCP verwendet, um die Trace-Informationen an Cloud Trace weiterzuleiten.
9. Glückwunsch!
Jetzt wissen Sie, wie Sie Ihre erste App Engine-Webanwendung schreiben.
Weitere Informationen
- Cloud Trace: https://cloud.google.com/trace/
- Spring on GCP-Projekt: http://cloud.spring.io/spring-cloud-gcp/
- GitHub-Repository von Spring auf GCP: https://github.com/GoogleCloudPlatform/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.