Acerca de este codelab
1. Descripción general
El seguimiento distribuido es importante para obtener estadísticas y observabilidad de una arquitectura de microservicios de varios niveles. Cuando se encadenan las llamadas de servicio a las de servicio de A al B, es importante comprender que las llamadas se realizaron correctamente y, además, la latencia en cada paso.
En Spring Boot, puedes usar Spring Cloud Sleuth para agregar sin problemas la instrumentación de seguimiento distribuida a tu aplicación. De forma predeterminada, puede reenviar los datos de seguimiento a Zipkin.
Google Cloud Platform tiene Stackdriver Trace, un servicio administrado que te permite almacenar datos de seguimiento sin tener que administrar tu propia instancia de Zipkin ni el almacenamiento. Stackdriver Trace también puede generar informes de distribución de latencia y detectar regresiones de rendimiento de forma automática.
Tienes dos opciones para usar Stackdriver Trace desde una aplicación de Spring Boot:
- Usa un Proxy de Zipkin de Stackdriver Trace y configura Spring Cloud Sleuth para que use este proxy como el extremo de Zipkin.
- También puedes usar la herramienta Spring Cloud GCP Trace, que se integra perfectamente en Spring Cloud Sleuth y reenvía los datos de seguimiento directamente a Stackdriver Trace.
En este codelab, aprenderás a compilar una nueva aplicación de Spring Boot y a usar el seguimiento de GCP de Spring Cloud para realizar el seguimiento distribuido.
Qué aprenderás
- Cómo crear una aplicación de Java de Spring Boot y configurar Stackdriver Trace
Requisitos
- Un proyecto de Google Cloud Platform
- Un navegador, como Chrome o Firefox
- Se recomienda estar familiarizado con editores de texto estándares de Linux, como Vim, Emacs o Nano.
¿Cómo usarás este instructivo?
¿Cómo calificarías tu experiencia con la compilación de aplicaciones web HTML/CSS?
¿Cómo calificarías tu experiencia con los servicios de Google Cloud Platform?
2. Configuración y requisitos
Configuración del entorno a su propio ritmo
Si aún no tienes una Cuenta de Google (Gmail o Google Apps), debes crear una. Accede a Google Cloud Platform Console (console.cloud.google.com) y crea un proyecto nuevo:
Recuerde el ID de proyecto, un nombre único en todos los proyectos de Google Cloud (el nombre anterior ya se encuentra en uso y no lo podrá usar). Se mencionará más adelante en este codelab como PROJECT_ID
.
A continuación, debes habilitar la facturación en Cloud Console para usar los recursos de Google Cloud.
Ejecutar este codelab debería costar solo unos pocos dólares, pero su costo podría aumentar si decides usar más recursos o si los dejas en ejecución (consulta la sección “Limpiar” al final de este documento).
Los usuarios nuevos de Google Cloud Platform son aptos para obtener una prueba gratuita de USD 300.
Google Cloud Shell
Si bien Google Cloud y Kubernetes se pueden operar de manera remota desde su laptop, en este codelab usaremos Google Cloud Shell, un entorno de línea de comandos que se ejecuta en la nube.
Activar Google Cloud Shell
En GCP Console, haga clic en el ícono de Cloud Shell en la barra de herramientas superior derecha:
Haga clic en "Start Cloud Shell":
El aprovisionamiento y la conexión al entorno debería llevar solo unos minutos:
Esta máquina virtual está cargada con todas las herramientas para desarrolladores que necesitará. Ofrece un directorio principal persistente de 5 GB y se ejecuta en Google Cloud, lo que permite mejorar considerablemente el rendimiento de la red y la autenticación. Gran parte de su trabajo, si no todo, se puede hacer simplemente con un navegador o su Google Chromebook.
Una vez conectado a Cloud Shell, debería ver que ya está autenticado y que el proyecto ya está configurado con su PROJECT_ID.
En Cloud Shell, ejecute el siguiente comando para confirmar que está autenticado:
gcloud auth list
Resultado del comando
Credentialed accounts: - <myaccount>@<mydomain>.com (active)
gcloud config list project
Resultado del comando
[core] project = <PROJECT_ID>
De lo contrario, puede configurarlo con este comando:
gcloud config set project <PROJECT_ID>
Resultado del comando
Updated property [core/project].
3. Crea un nuevo servicio de REST de Spring Boot
Después de que se inicie Cloud Shell, puedes usar la línea de comandos para generar una nueva aplicación de 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
Para crear un controlador de REST nuevo, agrega una clase nueva:
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!";
}
}
Puedes iniciar la aplicación de Spring Boot normalmente con el complemento de Spring Boot. Omita las pruebas de este lab:
$ ./mvnw -DskipTests spring-boot:run
Cuando se inicie la aplicación, haga clic en el ícono de Vista previa en la Web de la barra de herramientas de Cloud Shell y elija la opción Vista previa en el puerto 8080.
Después de una breve espera, deberías ver el resultado:
En Cloud Shell, también debería ver los mensajes de registro con el ID de seguimiento y el ID del intervalo:
4. Usar Stackdriver Trace
Habilitar la API de Stackdriver Trace
Debes habilitar la API de Stackdriver Trace para almacenar los datos de seguimiento. Para habilitar la API, navegue a Servicios de API → Biblioteca
Busca Stackdriver Trace.
Haz clic en API de Stackdriver Trace y, luego, en Habilitar si aún no se habilitó.
Configurar la credencial predeterminada de la aplicación
Para este lab, deberá configurar una credencial predeterminada de la aplicación. El activador de Spring Cloud GCP recogerá esta credencial automáticamente.
Primero, acceda:
$ 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: ...
Haga clic en el vínculo para abrir una pestaña nueva del navegador y, luego, haga clic en Permitir.
Luego, copie y pegue el código de verificación en Cloud Shell y presione Intro. Debería ver lo siguiente:
Credentials saved to file: [/tmp/tmp.jm9bnQ4R9Q/application_default_credentials.json]
These credentials will be used by any library that requests
Application Default Credentials.
Agregar el seguimiento de GCP para Spring Cloud
En este servicio, ya usamos Spring Cloud Sleuth para el seguimiento. Agreguemos Spring Cloud Trace Starter para reenviar los datos a Stackdriver Trace.
Agrega la dependencia de seguimiento de GCP de 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>
Según la configuración predeterminada, Spring Cloud Sleuth no hace un muestreo de cada solicitud. Para facilitar un poco las pruebas, aumenta la tasa de muestreo a un 100% en application.properties
a fin de asegurarte de que podemos ver los datos de seguimiento y también ignora algunas URL que no nos interesan:
$ echo "
spring.sleuth.sampler.probability=1.0
spring.sleuth.web.skipPattern=(^cleanup.*|.+favicon.*)
" > src/main/resources/application.properties
Vuelva a ejecutar la aplicación y use la vista previa web de Cloud Shell para verla:
$ export GOOGLE_CLOUD_PROJECT=`gcloud config list --format 'value(core.project)'`
$ ./mvnw -DskipTests spring-boot:run
De forma predeterminada, Spring Cloud GCP Trace agrupa los datos de seguimiento y los envía una vez cada 10 segundos o cuando se recibe una cantidad mínima de datos de seguimiento. Esto se puede configurar y puedes consultar la documentación de referencia de Trace de Spring Cloud GCP para obtener más información.
Realice una solicitud al servicio:
$ curl localhost:8080
En Cloud Console, navegue a Stackdriver → Trace → Trace list (Lista de seguimientos).
En la parte superior, reduce el intervalo de tiempo a 1 hora. La carga automática está activada de forma predeterminada. Por lo tanto, a medida que lleguen los datos de seguimiento, deberían aparecer en la consola.
Los datos de seguimiento deberían aparecer en unos 30 segundos aproximadamente.
Haga clic en el punto azul para ver los detalles de seguimiento:
¡Eso fue bastante sencillo!
5. Cree una segunda aplicación web de Spring Boot
Haga clic en el ícono + para abrir una sesión nueva de Cloud Shell:
En la sesión nueva, cree la segunda aplicación de 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
Para crear un controlador de REST nuevo, agrega una clase nueva:
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";
}
}
Agrega Spring 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 Detecte para muestrear el 100% de las solicitudes:
src/main/resources/application.properties.
$ echo "
spring.sleuth.sampler.probability=1.0
spring.sleuth.web.skipPattern=(^cleanup.*|.+favicon.*)
" > src/main/resources/application.properties
Por último, puedes iniciar la aplicación de Spring Boot en el puerto 8081 con el complemento de Spring Boot:
$ export GOOGLE_CLOUD_PROJECT=`gcloud config list --format 'value(core.project)'`
$ ./mvnw -DskipTests spring-boot:run -Dserver.port=8081
6. Actualiza el primer servicio para que consuma el segundo servicio
Mientras se ejecuta trace-service-two
, vuelve a la primera ventana de la sesión de Cloud Shell y realiza la modificación en trace-service-one
.
Primero, inicializa un bean RestTemplate
nuevo:
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);
}
}
En WorkController.meeting()
, llama al servicio de Meet.
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);
}
...
}
Vuelva a iniciar el servicio y active el extremo desde la Vista previa en la Web:
$ export GOOGLE_CLOUD_PROJECT=`gcloud config list --format 'value(core.project)'`
$ ./mvnw -DskipTests spring-boot:run
En ambas ventanas de sesión, debería ver los mensajes de registro con el ID de seguimiento propagado de un servicio a otro.
En la lista de seguimiento de Stackdriver Trace, debería ver el segundo registro:
Puede hacer clic en el nuevo punto azul y ver los detalles del seguimiento:
También puedes hacer clic en cualquier intervalo de este diagrama para ver el detalle del intervalo.
7. Informe de rendimiento de distribución de latencia
Cuando usas Stackdriver Trace como el almacenamiento de datos de seguimiento, Stackdriver Trace puede usar los datos para crear un informe de distribución de latencia. Necesitarás más de 100 seguimientos para poder generar el informe de la siguiente manera:
Además, en Stackdriver Trace, se puede detectar automáticamente la regresión del rendimiento del mismo servicio en dos períodos diferentes en Informe de análisis.
8. Resumen
En este lab, creó 2 servicios simples y agregó el seguimiento distribuido con Spring Cloud Sleuth, y usó Spring Cloud GCP para reenviar la información de seguimiento a Stackdriver Trace.
9. ¡Felicitaciones!
Aprendió a escribir su primera aplicación web de App Engine.
Más información
- Stackdriver Trace: https://cloud.google.com/trace/
- Proyecto de Spring en GCP: http://cloud.spring.io/spring-cloud-gcp/
- Repositorio de GitHub de Spring en GCP: https://github.com/spring-cloud/spring-cloud-gcp
- Java en Google Cloud Platform: https://cloud.google.com/java/
Licencia
Este trabajo cuenta con una licencia Atribución 2.0 Genérica de Creative Commons.