Spring Boot - Seguimiento de registros de micro servicios

La mayoría de los desarrolladores enfrentan dificultades para rastrear registros si ocurre algún problema. Esto puede ser resuelto por Spring Cloud Sleuth y el servidor ZipKin para la aplicación Spring Boot.

Spring Cloud Sleuth

Los registros de Spring Cloud Sleuth se imprimen en el siguiente formato:

[application-name,traceid,spanid,zipkin-export]

Dónde,

  • Application-name = Nombre de la aplicación

  • Traceid = cada traceid de solicitud y respuesta es el mismo cuando se llama al mismo servicio o un servicio a otro servicio.

  • Spanid = Span Id se imprime junto con Trace Id. Span Id es diferente en cada solicitud y respuesta que llama de un servicio a otro servicio.

  • Zipkin-export = Por defecto es falso. Si es cierto, los registros se exportarán al servidor Zipkin.

Ahora, agregue la dependencia Spring Cloud Starter Sleuth en su archivo de configuración de compilación de la siguiente manera:

Los usuarios de Maven pueden agregar la siguiente dependencia en su archivo pom.xml:

<dependency>
   <groupId>org.springframework.cloud</groupId>
   <artifactId>spring-cloud-starter-sleuth</artifactId>
</dependency>

Los usuarios de Gradle pueden agregar la siguiente dependencia en su archivo build.gradle:

compile('org.springframework.cloud:spring-cloud-starter-sleuth')

Ahora, agregue los registros en el archivo de clase Rest Controller de la aplicación Spring Boot como se muestra aquí -

package com.tutorialspoint.sleuthapp;

import java.util.logging.Level;
import java.util.logging.Logger;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@SpringBootApplication
@RestController
public class SleuthappApplication {
   private static final Logger LOG = Logger.getLogger(SleuthappApplication.class.getName());
   public static void main(String[] args) {
      SpringApplication.run(SleuthappApplication.class, args);
   }
   @RequestMapping("/")
   public String index() {
      LOG.log(Level.INFO, "Index API is calling");
      return "Welcome Sleuth!";
   }
}

Ahora, agregue el nombre de la aplicación en el archivo application.properties como se muestra:

spring.application.name = tracinglogs

El código completo para el archivo de configuración de compilación se proporciona a continuación:

Maven – pom.xml

<?xml version = "1.0" encoding = "UTF-8"?>
<project xmlns = "http://maven.apache.org/POM/4.0.0" 
   xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation = "http://maven.apache.org/POM/4.0.0 
   http://maven.apache.org/xsd/maven-4.0.0.xsd">
   
   <modelVersion>4.0.0</modelVersion>
   <groupId>com.tutorialspoint</groupId>
   <artifactId>sleuthapp</artifactId>
   <version>0.0.1-SNAPSHOT</version>
   <packaging>jar</packaging>

   <name>sleuthapp</name>
   <description>Demo project for Spring Boot</description>

   <parent>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-parent</artifactId>
      <version>1.5.9.RELEASE</version>
      <relativePath/> <!-- lookup parent from repository -->
   </parent>

   <properties>
      <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
      <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
      <java.version>1.8</java.version>
      <spring-cloud.version>Edgware.RELEASE</spring-cloud.version>
   </properties>

   <dependencies>
      <dependency>
         <groupId>org.springframework.cloud</groupId>
         <artifactId>spring-cloud-starter-sleuth</artifactId>
      </dependency>
      <dependency>
         <groupId>org.springframework.boot</groupId>
         <artifactId>spring-boot-starter-web</artifactId>
      </dependency>
      <dependency>
         <groupId>org.springframework.boot</groupId>
         <artifactId>spring-boot-starter-test</artifactId>
         <scope>test</scope>
      </dependency>
   </dependencies>

   <dependencyManagement>
      <dependencies>
         <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>${spring-cloud.version}</version>
            <type>pom</type>
            <scope>import</scope>
         </dependency>
      </dependencies>
   </dependencyManagement>

   <build>
      <plugins>
         <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
         </plugin>
      </plugins>
   </build>
   
</project>

Gradle – build.gradle

buildscript {
   ext {
      springBootVersion = '1.5.9.RELEASE'
   }
   repositories {
      mavenCentral()
   }
   dependencies {
      classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
   }
}

apply plugin: 'java'
apply plugin: 'eclipse'
apply plugin: 'org.springframework.boot'

group = 'com.tutorialspoint'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = 1.8

repositories {
   mavenCentral()
}
ext {
   springCloudVersion = 'Edgware.RELEASE'
}
dependencies {
   compile('org.springframework.cloud:spring-cloud-starter-sleuth')
   compile('org.springframework.boot:spring-boot-starter-web')
   testCompile('org.springframework.boot:spring-boot-starter-test')
}
dependencyManagement {
   imports {
      mavenBom "org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}"
   }
}

Puede crear un archivo JAR ejecutable y ejecutar la aplicación Spring Boot mediante los siguientes comandos de Maven o Gradle.

Para Maven, puede usar el siguiente comando:

mvn clean install

Después de "BUILD SUCCESS", puede encontrar el archivo JAR en el directorio de destino.

Para Gradle, puede usar el siguiente comando:

gradle clean build

Después de "BUILD SUCCESSFUL", puede encontrar el archivo JAR en el directorio build / libs.

Ahora, ejecute el archivo JAR usando el comando que se muestra aquí:

java –jar <JARFILE>

Ahora, la aplicación se ha iniciado en el puerto 8080 de Tomcat.

Ahora, presione la URL en su navegador web y vea el resultado en el registro de la consola.

http://localhost:8080/

Puede ver los siguientes registros en la ventana de la consola. Observe que el registro está impreso en el siguiente formato [nombre de la aplicación, traceid, spanid, zipkin-export]

Servidor Zipkin

Zipkin es una aplicación que monitorea y administra los registros de Spring Cloud Sleuth de su aplicación Spring Boot. Para construir un servidor Zipkin, necesitamos agregar la interfaz de usuario de Zipkin y las dependencias del servidor Zipkin en nuestro archivo de configuración de compilación.

Los usuarios de Maven pueden agregar la siguiente dependencia en su archivo pom.xml:

<dependency>
   <groupId>io.zipkin.java</groupId>
   <artifactId>zipkin-server</artifactId>
</dependency>
<dependency>
   <groupId>io.zipkin.java</groupId>
   <artifactId>zipkin-autoconfigure-ui</artifactId>
</dependency>

Los usuarios de Gradle pueden agregar la siguiente dependencia en su archivo build.gradle:

compile('io.zipkin.java:zipkin-autoconfigure-ui')
compile('io.zipkin.java:zipkin-server')

Ahora, configure server.port = 9411 en el archivo de propiedades de la aplicación.

Para los usuarios del archivo de propiedades, agregue la siguiente propiedad en el archivo application.properties.

server.port = 9411

Para los usuarios de YAML, agregue la siguiente propiedad en el archivo application.yml.

server:
   port: 9411

Agregue la anotación @EnableZipkinServer en la clase principal de su aplicación Spring Boot fie. La anotación @EnableZipkinServer se utiliza para permitir que su aplicación actúe como un servidor Zipkin.

package com.tutorialspoint.zipkinapp;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import zipkin.server.EnableZipkinServer;

@SpringBootApplication
@EnableZipkinServer
public class ZipkinappApplication {
   public static void main(String[] args) {
      SpringApplication.run(ZipkinappApplication.class, args);
   }
}

El código para el archivo de configuración de compilación completo se proporciona a continuación.

Maven – pom.xml

<?xml version = "1.0" encoding = "UTF-8"?>
<project xmlns = "http://maven.apache.org/POM/4.0.0" 
   xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation = "http://maven.apache.org/POM/4.0.0 
   http://maven.apache.org/xsd/maven-4.0.0.xsd">
   
   <modelVersion>4.0.0</modelVersion>
   <groupId>com.tutorialspoint</groupId>
   <artifactId>zipkinapp</artifactId>
   <version>0.0.1-SNAPSHOT</version>
   <packaging>jar</packaging>
   <name>zipkinapp</name>
   <description>Demo project for Spring Boot</description>

   <parent>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-parent</artifactId>
      <version>1.5.9.RELEASE</version>
      <relativePath /> <!-- lookup parent from repository -->
   </parent>

   <properties>
      <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
      <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
      <java.version>1.8</java.version>
      <spring-cloud.version>Edgware.RELEASE</spring-cloud.version>
   </properties>

   <dependencies>
      <dependency>
         <groupId>io.zipkin.java</groupId>
         <artifactId>zipkin-server</artifactId>
      </dependency>
      <dependency>
         <groupId>io.zipkin.java</groupId>
         <artifactId>zipkin-autoconfigure-ui</artifactId>
      </dependency>
      <dependency>
         <groupId>org.springframework.boot</groupId>
         <artifactId>spring-boot-starter-test</artifactId>
         <scope>test</scope>
      </dependency>
   </dependencies>

   <dependencyManagement>
      <dependencies>
         <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>${spring-cloud.version}</version>
            <type>pom</type>
            <scope>import</scope>
         </dependency>
      </dependencies>
   </dependencyManagement>

   <build>
      <plugins>
         <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
         </plugin>
      </plugins>
   </build>
   
</project>

Gradle – build.gradle

buildscript {
   ext {
      springBootVersion = '1.5.9.RELEASE'
   }
   repositories {
      mavenCentral()
   }
   dependencies {
      classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
   }
}
apply plugin: 'java'
apply plugin: 'eclipse'
apply plugin: 'org.springframework.boot'

group = 'com.tutorialspoint'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = 1.8

repositories {
   mavenCentral()
}
ext {
   springCloudVersion = 'Edgware.RELEASE'
}
dependencies {
   compile('io.zipkin.java:zipkin-autoconfigure-ui')
   compile('io.zipkin.java:zipkin-server')
   testCompile('org.springframework.boot:spring-boot-starter-test')
}
dependencyManagement {
   imports {
      mavenBom "org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}"
   }
}

Puede crear un archivo JAR ejecutable y ejecutar la aplicación Spring Boot utilizando los siguientes comandos de Maven o Gradle:

Para Maven, use el comando que se indica a continuación:

mvn clean install

Después de "BUILD SUCCESS", puede encontrar el archivo JAR en el directorio de destino.

Para Gradle, use el comando que se proporciona a continuación:

gradle clean build

Después de "BUILD SUCCESSFUL", puede encontrar el archivo JAR en el directorio build / libs.

Ejecute el archivo JAR utilizando el comando que se muestra:

java –jar <JARFILE>

Ahora, la aplicación se ha iniciado en el puerto 9411 de Tomcat como se muestra a continuación:

Ahora, presione la siguiente URL y vea la interfaz de usuario del servidor Zipkin.

http://localhost:9411/zipkin/

Luego, agregue la siguiente dependencia en su aplicación de servicio de cliente y señale la URL del servidor Zipkin para rastrear los registros de microservicio a través de la interfaz de usuario de Zipkin.

Ahora, agregue la dependencia de Spring Cloud Starter Zipkin en su archivo de configuración de compilación como se muestra:

Los usuarios de Maven pueden agregar la siguiente dependencia en el archivo pom.xml:

<dependency>
   <groupId>org.springframework.cloud</groupId>
   <artifactId>spring-cloud-sleuth-zipkin</artifactId>
</dependency>

Los usuarios de Gradle pueden agregar la siguiente dependencia en el archivo build.gradle:

compile('org.springframework.cloud:spring-cloud-sleuth-zipkin')

Ahora, agregue el Always Sampler Bean en su aplicación Spring Boot para exportar los registros al servidor Zipkin.

@Bean
public AlwaysSampler defaultSampler() {
   return new AlwaysSampler();
}

Si agrega el Bean AlwaysSampler, automáticamente la opción de exportación Zipkin de Spring Sleuth cambiará de falso a verdadero.

A continuación, configure la URL base de su servidor Zipkin en el archivo application.properties de servicio del cliente.

spring.zipkin.baseUrl = http://localhost:9411/zipkin/

Luego, proporcione el ID de seguimiento y busque los rastros en la interfaz de usuario de Zipkin.

http://localhost:9411/zipkin/traces/{traceid}/