1. Información general
En este artículo, agregaremos Zipkin a nuestro proyecto de nube de primavera. Zipkin es un proyecto de código abierto que proporciona mecanismos para enviar, recibir, almacenar y visualizar trazas. Esto nos permite correlacionar la actividad entre servidores y obtener una imagen mucho más clara de lo que está sucediendo exactamente en nuestros servicios.
Este artículo no es un artículo introductorio al rastreo distribuido o la nube de primavera. Si desea obtener más información sobre el rastreo distribuido, lea nuestra introducción a Spring Sleuth.
2. Servicio Zipkin
Nuestro servicio Zipkin servirá como almacén para todos nuestros tramos. Cada tramo se envía a este servicio y se recopila en trazas para su identificación futura.
2.1. Preparar
Cree un nuevo proyecto Spring Boot y agregue estas dependencias a pom.xml:
io.zipkin.java zipkin-server io.zipkin.java zipkin-autoconfigure-ui runtime
Como referencia: puede encontrar la última versión en Maven Central (zipkin-server, zipkin-autoconfigure-ui). Las versiones de las dependencias se heredan de spring-boot-starter-parent.
2.2. Habilitación del servidor Zipkin
Para habilitar el servidor Zipkin , debemos agregar algunas anotaciones a la clase de aplicación principal:
@SpringBootApplication @EnableZipkinServer public class ZipkinApplication {...}
La nueva anotación @EnableZipkinServer configurará este servidor para escuchar los intervalos entrantes y actuar como nuestra interfaz de usuario para realizar consultas.
2.3. Configuración
Primero, creemos un archivo llamado bootstrap.properties en src / main / resources . Recuerde que este archivo es necesario para obtener nuestra configuración desde nuestro servidor de configuración.
Agreguemos estas propiedades:
spring.cloud.config.name=zipkin spring.cloud.config.discovery.service-id=config spring.cloud.config.discovery.enabled=true spring.cloud.config.username=configUser spring.cloud.config.password=configPassword eureka.client.serviceUrl.defaultZone= //discUser:[email protected]:8082/eureka/
Ahora agreguemos un archivo de configuración a nuestro repositorio de configuración, ubicado en c: \ Users \ {username} \ en Windows o / home / {username} / en * nix.
En este directorio agreguemos un archivo llamado zipkin.properties y agreguemos estos contenidos:
spring.application.name=zipkin server.port=9411 eureka.client.region=default eureka.client.registryFetchIntervalSeconds=5 logging.level.org.springframework.web=debug
Recuerde confirmar los cambios en este directorio para que el servicio de configuración detecte los cambios y cargue el archivo.
2.4. correr
Ahora ejecutemos nuestra aplicación y naveguemos a // localhost: 9411. Deberíamos ser recibidos con la página de inicio de Zipkin :

¡Excelente! Ahora estamos listos para agregar algunas dependencias y configuraciones a nuestros servicios que queremos rastrear.
3. Configuración del servicio
La configuración de los servidores de recursos es prácticamente la misma. En las siguientes secciones, detallaremos cómo configurar el servicio de libros. Vamos a seguir hasta que explicando las modificaciones necesarias para aplicar estos cambios a la calificación de servicio y la pasarela de servicio .
3.1. Preparar
Para comenzar a enviar intervalos a nuestro servidor Zipkin , agregaremos esta dependencia a nuestro archivo pom.xml :
org.springframework.cloud spring-cloud-starter-zipkin
Como referencia: puede encontrar la última versión en Maven Central (spring-cloud-starter-zipkin).
3.2. Configuración de primavera
Necesitamos agregar alguna configuración para que book-service use Eureka para encontrar nuestro servicio Zipkin . Abra BookServiceApplication.java y agregue este código al archivo:
@Autowired private EurekaClient eurekaClient; @Autowired private SpanMetricReporter spanMetricReporter; @Autowired private ZipkinProperties zipkinProperties; @Value("${spring.sleuth.web.skipPattern}") private String skipPattern; // ... the main method goes here @Bean public ZipkinSpanReporter makeZipkinSpanReporter() { return new ZipkinSpanReporter() { private HttpZipkinSpanReporter delegate; private String baseUrl; @Override public void report(Span span) { InstanceInfo instance = eurekaClient .getNextServerFromEureka("zipkin", false); if (!(baseUrl != null && instance.getHomePageUrl().equals(baseUrl))) { baseUrl = instance.getHomePageUrl(); delegate = new HttpZipkinSpanReporter(new RestTemplate(), baseUrl, zipkinProperties.getFlushInterval(), spanMetricReporter); if (!span.name.matches(skipPattern)) delegate.report(span); } } }; }
La configuración anterior registra un ZipkinSpanReporter personalizado que obtiene su URL de eureka. Este código también realiza un seguimiento de la URL existente y solo actualiza HttpZipkinSpanReporter si la URL cambia. De esta manera, no importa dónde implementemos nuestro servidor Zipkin, siempre podremos ubicarlo sin reiniciar el servicio.
También importamos las propiedades Zipkin predeterminadas que se cargan con Spring Boot y las usamos para administrar nuestro reportero personalizado.
3.3. Configuración
Ahora agreguemos algo de configuración a nuestro archivo book-service.properties en el repositorio de configuración:
spring.sleuth.sampler.percentage=1.0 spring.sleuth.web.skipPattern=(^cleanup.*)
Zipkin funciona muestreando acciones en un servidor. Al establecer el spring.sleuth.sampler.percentage en 1.0, establecemos la frecuencia de muestreo en 100%. El patrón de omisión es simplemente una expresión regular que se usa para excluir intervalos cuyo nombre coincide.
El patrón de omisión impedirá que se informen todos los intervalos que comiencen con la palabra "limpieza". Esto es para detener los intervalos que se originan en la base del código de la sesión de primavera.
3.4. Servicio de clasificación
Siga los mismos pasos de la sección de servicio de libros anterior, aplicando los cambios a los archivos equivalentes para el servicio de calificación.
3.5. Servicio de puerta de enlace
Follow the same steps book-service. But when adding the configuration to the gateway.properties add these instead:
spring.sleuth.sampler.percentage=1.0 spring.sleuth.web.skipPattern=(^cleanup.*|.+favicon.*)
This will configure the gateway service not to send spans about the favicon or spring session.
3.6. Run
If you haven't done so already, start the config, discovery, gateway, book, rating, and zipkin services.
Navigate to //localhost:8080/book-service/books.
Open a new tab and navigate to //localhost:9411. Select book-service and press the ‘Find Traces' button. You should see a trace appear in the search results. Click that trace of opening it:

On the trace page, we can see the request broken down by service. The first two spans are created by the gateway, and the last is created by the book-service. This shows us how much time the request spent processing on the book-service, 18.379 ms, and on the gateway, 87.961 ms.
4. Conclusion
We have seen how easy it is to integrate Zipkin into our cloud application.
This gives us some much-needed insight into how communication travels through our application. As our application grows in complexity, Zipkin can provide us with much-needed information on where requests are spending their time. This can help us determine where things are slowing down and indicate what areas of our application need improvement.
Como siempre, puede encontrar el código fuente en Github.