Informazioni su questo codelab
1. Panoramica
Il tracciamento distribuito è importante per ottenere insight e osservabilità in un'architettura di microservizi multilivello. Quando i servizi sono concatenati alle chiamate di servizio, dal servizio A al servizio B al servizio C, è importante capire che le chiamate sono andate a buon fine e che anche la latenza dipende da ogni fase.
In Spring Boot puoi utilizzare Spring Cloud Sleuth per aggiungere alla tua applicazione la strumentazione di tracciamento distribuita. Per impostazione predefinita, può inoltrare i dati di traccia a Zipkin.
Google Cloud Platform ha Stackdriver Trace, un servizio gestito che ti consente di archiviare i dati di traccia senza dover gestire un'istanza Zipkin o una sua archiviazione. Stackdriver Trace può anche produrre report di distribuzione della latenza e rilevare automaticamente le regressioni delle prestazioni.
Hai due opzioni per utilizzare Stackdriver Trace da un'applicazione Spring Boot:
- Utilizza un proxy Zipkin di Stackdriver Trace e configura semplicemente Spring Cloud Sleuth per utilizzare questo proxy come endpoint Zipkin
- In alternativa, utilizza Spring Cloud GCP Trace, che si integra perfettamente con Spring Cloud Sleuth e inoltra i dati di traccia direttamente a Stackdriver Trace.
In questo codelab, imparerai a creare una nuova applicazione Spring Boot e a utilizzare Cloud Trace GCP per il tracciamento distribuito.
Cosa imparerai a fare:
- Come creare un'applicazione Java Spring Boot e configurare Stackdriver Trace.
Che cosa ti serve
- Un progetto Google Cloud Platform
- Un browser, come Chrome o Firefox
- Familiarità con gli editor di testo standard di Linux, ad esempio Vim, EMAC o Nano
Come utilizzerai questo tutorial?
Come valuteresti la tua esperienza con la creazione di app web HTML/CSS?
Come giudichi la tua esperienza con l'utilizzo dei servizi Google Cloud Platform?
2. Configurazione e requisiti
Configurazione automatica dell'ambiente
Se non hai ancora un Account Google (Gmail o Google Apps), devi crearne uno. Accedi alla console di Google Cloud Platform (console.cloud.google.com) e crea un nuovo progetto.
Ricorda l'ID progetto, un nome univoco in tutti i progetti Google Cloud (il nome sopra riportato è già stato utilizzato e non funzionerà per te). Vi verrà fatto riferimento più avanti in questo codelab come PROJECT_ID
.
Il prossimo passaggio consiste nell'attivare la fatturazione in Cloud Console per utilizzare le risorse di Google Cloud.
L'esecuzione di questo codelab non dovrebbe costare più di qualche euro, ma potrebbe essere di più se decidi di utilizzare più risorse o se le lasci in esecuzione (vedi la sezione "pulizia" alla fine di questo documento).
I nuovi utenti di Google Cloud Platform sono idonei per una prova senza costi di 300 $.
Google Cloud Shell
Sebbene Google Cloud e Kubernetes possano essere utilizzati a distanza dal tuo laptop, in questo codelab utilizzeremo Google Cloud Shell, un ambiente a riga di comando in esecuzione nel cloud.
Attiva Google Cloud Shell
Nella console di GCP, fai clic sull'icona di Cloud Shell nella barra degli strumenti in alto a destra:
Quindi fai clic su "Start Cloud Shell":
Bastano pochi istanti per eseguire il provisioning e connettersi all'ambiente:
Questa macchina virtuale è dotata di tutti gli strumenti di sviluppo di cui hai bisogno. Offre una home directory permanente da 5 GB e viene eseguita su Google Cloud, migliorando notevolmente le prestazioni e l'autenticazione della rete. Gran parte del lavoro in questo lab, se non tutto, può essere svolto semplicemente con un browser o con Google Chromebook.
Una volta connesso a Cloud Shell, dovresti vedere che sei già autenticato e che il progetto è già impostato sul tuo PROJECT_ID.
Esegui questo comando in Cloud Shell per verificare che l'account sia autenticato:
gcloud auth list
Output comando
Credentialed accounts: - <myaccount>@<mydomain>.com (active)
gcloud config list project
Output comando
[core] project = <PROJECT_ID>
In caso contrario, puoi impostarlo con questo comando:
gcloud config set project <PROJECT_ID>
Output comando
Updated property [core/project].
3. Crea un nuovo servizio REST di avvio di primavera
Una volta avviato Cloud Shell, puoi utilizzare la riga di comando per generare una nuova applicazione Spring Boot con Spring Initializr:
$ 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
Crea un nuovo controller REST aggiungendo un nuovo corso:
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!";
}
}
Puoi avviare l'applicazione Spring Boot normalmente con il plug-in Spring Boot. Saltamo i test per questo lab:
$ ./mvnw -DskipTests spring-boot:run
Una volta avviata l'applicazione, fai clic sull'icona Anteprima web nella barra degli strumenti di Cloud Shell e scegli Anteprima sulla porta 8080.
Dopo un po' di tempo dovresti vedere il risultato:
In Cloud Shell, dovresti visualizzare anche i messaggi di log con ID traccia e ID span:
4. Utilizzo di Stackdriver Trace
Abilita API Stackdriver Trace
Devi prima abilitare l'API Stackdriver Trace per utilizzare Stackdriver Trace per archiviare i dati delle tracce. Per attivare l'API, vai a Servizi API → Libreria
Cerca Stackdriver Trace
Fai clic sull'API Stackdriver Trace, quindi fai clic su Abilita se non è già abilitata.
Configura credenziale predefinita applicazione
Per questo lab, dovrai configurare una credenziale predefinita dell'applicazione. Questa credenziale verrà ritirata automaticamente da Spring Cloud GCP Trace starter.
Innanzitutto, accedi:
$ 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: ...
Fai clic sul link per aprire una nuova scheda del browser, quindi fai clic su Consenti.
Quindi, copia e incolla il codice di verifica in Cloud Shell e premi Invio. Dovresti vedere:
Credentials saved to file: [/tmp/tmp.jm9bnQ4R9Q/application_default_credentials.json]
These credentials will be used by any library that requests
Application Default Credentials.
Aggiungere Cloud GCP Trace
In questo servizio abbiamo già utilizzato Spring Cloud Sleuth per il tracciamento. Aggiungiamo lo strumento di avvio di Spring Cloud GCP Trace per inoltrare i dati a Stackdriver Trace.
Aggiungere la dipendenza Trace GCP di Spring Cloud:
pom.xml
<project>
...
<dependencies>
...
<!-- Add Stackdriver Trace Starter -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-gcp-starter-trace</artifactId>
</dependency>
</dependencies>
...
</project>
Per impostazione predefinita, Spring Cloud Sleuth non campiona tutte le richieste. Per semplificare il test, aumenta la frequenza di campionamento al 100% in application.properties
per assicurarti che vengano visualizzati i dati della traccia e ignora alcuni URL che non ci interessano.
$ echo "
spring.sleuth.sampler.probability=1.0
spring.sleuth.web.skipPattern=(^cleanup.*|.+favicon.*)
" > src/main/resources/application.properties
Esegui di nuovo l'applicazione e utilizza l'anteprima web di Cloud Shell per visualizzare l'applicazione:
$ export GOOGLE_CLOUD_PROJECT=`gcloud config list --format 'value(core.project)'`
$ ./mvnw -DskipTests spring-boot:run
Per impostazione predefinita, i batch di traccia di Spring Cloud GCP tracciano i dati e li inviano una volta ogni 10 secondi o quando viene ricevuto un numero minimo di dati di traccia. Puoi configurare questa impostazione. Per saperne di più, consulta la documentazione di riferimento di Cloud GCP Trace.
Per inviare una richiesta al servizio:
$ curl localhost:8080
In Cloud Console, vai a Stackdriver → Traccia → Elenco di tracce.
In alto, riduci l'intervallo di tempo a 1 ora. L'opzione Ricarica automaticamente è attiva per impostazione predefinita. Pertanto, all'arrivo dei dati di traccia, dovrebbero essere visualizzati nella console.
I dati di traccia dovrebbero essere visualizzati in circa 30 secondi circa.
Fai clic sul punto blu per visualizzare i dettagli della traccia:
È stato molto semplice.
5. Creare una seconda applicazione web Spring Boot
Apri una nuova sessione di Cloud Shell facendo clic sull'icona +:
Nella nuova sessione, crea la seconda applicazione Spring Boot:
$ 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
Crea un nuovo controller REST aggiungendo un nuovo corso:
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";
}
}
Aggiungere Cloud GCP Trace a pom.xml
pom.xml
<project>
...
<dependencies>
...
<!-- Add Stackdriver Trace starter -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-gcp-starter-trace</artifactId>
</dependency>
</dependencies>
...
</project>
Configura Sleuth per campionare il 100% delle richieste:
src/main/resources/application.properties
$ echo "
spring.sleuth.sampler.probability=1.0
spring.sleuth.web.skipPattern=(^cleanup.*|.+favicon.*)
" > src/main/resources/application.properties
Infine, puoi avviare l'applicazione Spring Boot sulla porta 8081 con il plug-in Spring Boot:
$ export GOOGLE_CLOUD_PROJECT=`gcloud config list --format 'value(core.project)'`
$ ./mvnw -DskipTests spring-boot:run -Dserver.port=8081
6. Aggiorna il primo servizio per usufruire del secondo servizio
Mentre trace-service-two
è in esecuzione, torna alla prima finestra di sessione di Cloud Shell e apporta modifiche a trace-service-one
.
Innanzitutto, inizializza un nuovo fagiolo RestTemplate
:
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);
}
}
WorkController.meeting()
, chiama il servizio per le riunioni.
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);
}
...
}
Avvia di nuovo il servizio e attiva l'endpoint da Anteprima web:
$ export GOOGLE_CLOUD_PROJECT=`gcloud config list --format 'value(core.project)'`
$ ./mvnw -DskipTests spring-boot:run
In entrambe le finestre le sessioni dovrebbero essere visualizzate nei messaggi di log con l'ID di traccia propagato da un servizio a un altro.
Nell'elenco di tracce di Stackdriver Trace dovresti vedere la seconda traccia:
Puoi fare clic sul nuovo punto blu e visualizzare i dettagli della traccia:
Puoi anche fare clic su una sezione in questo diagramma per visualizzarne i dettagli.
7. Distribuzione della latenza &Report sul rendimento
Quando utilizzi Stackdriver Trace come spazio di archiviazione dei dati di traccia, Stackdriver Trace può utilizzare i dati per creare un rapporto di distribuzione della latenza. Per creare il report, avrai bisogno di più di 100 tracce:
Inoltre, Stackdriver Trace è in grado di rilevare automaticamente una regressione delle prestazioni dello stesso servizio in due periodi di tempo diversi in Report di analisi.
8. Riepilogo
In questo lab hai creato 2 semplici servizi e hai aggiunto il tracciamento distribuito con Spring Cloud Sleuth e hai utilizzato Spring Cloud GCP per inoltrare le informazioni di traccia a Stackdriver Trace.
9. Complimenti!
Hai imparato a scrivere la tua prima applicazione web App Engine.
Scopri di più
- Stackdriver Trace: https://cloud.google.com/trace/
- Progetto Spring su GCP: http://cloud.primavera.io/primavera-cloud-gcp/
- Spring nel repository GitHub di GCP: https://github.com/molla-cloud/primavera-cloud-gcp
- Java su Google Cloud Platform: https://cloud.google.com/java/
Licenza
Questo lavoro è concesso in licenza ai sensi di una licenza Creative Commons Attribution 2.0 Generic.