Spring Cloud - Services de traçage avec Zipkin

1. Vue d’ensemble

Dans cet article, nous allons ajouter Zipkin à notre lien:/spring-cloud-security-services[projet de cloud cloud]. Zipkin est un projet open source qui fournit des mécanismes d’envoi, de réception, de stockage et de visualisation des traces. Cela nous permet de corréler l’activité entre les serveurs et d’avoir une image beaucoup plus claire de ce qui se passe exactement dans nos services.

Cet article n’est pas un article d’introduction au traçage distribué ou au nuage de printemps. Si vous souhaitez plus d’informations sur le traçage distribué, lisez notre introduction au lien:/spring-cloud-sleuth-single-application[spring sleuth].

2. Service Zipkin

Notre service Zipkin servira de magasin pour toutes nos étendues. Chaque plage est envoyée à ce service et collectée dans des traces pour une identification ultérieure.

2.1. Installer

Créez un nouveau projet Spring Boot et ajoutez ces dépendances à pom.xml:

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

Pour référence: vous pouvez trouver la dernière version sur Maven Central ( https://search.maven.org/classic/#search%7Cgav%7C1%7Cg%3A%22io.zipkin.java%22%20AND%20a%3A% 22zipkin-server% 22[zipkin-server], https://search.maven.org/classic/#search%7Cgav%7C1%7Cg%3A%22io.zipkin.java%22%20and%20a%3A%22zipkin- autoconfigure-ui% 22[zipkin-autoconfigure-ui]).

Les versions des dépendances sont héritées de spring-boot-starter-parent .

2.2. Activation de Zipkin Server

Pour activer le serveur Zipkin , nous devons ajouter des annotations à la classe d’application principale:

@SpringBootApplication
@EnableZipkinServer
public class ZipkinApplication {...}

La nouvelle annotation @ EnableZipkinServer configurera ce serveur pour qu’il écoute les étendues entrantes et serve d’interface utilisateur pour les requêtes.

2.3. Configuration

Commençons par créer un fichier nommé bootstrap.properties dans src/main/resources . Rappelez-vous que ce fichier est nécessaire pour extraire notre configuration du serveur de configuration.

Ajoutons-y ces propriétés:

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=
  http://discUser:[email protected]:8082/eureka/----

Ajoutons maintenant un fichier de configuration à notre référentiel de configuration, situé à l'adresse __c: \ Users \\ {username} \ __ sous Windows ou __/Users/\ {username}/__ sur **  nix.

Dans ce répertoire, ajoutons un fichier nommé __zipkin.properties__ et ajoutons le contenu suivant:

[source,text,gutter:,true]

spring.application.name=zipkin server.port=9411 eureka.client.region=default eureka.client.registryFetchIntervalSeconds=5 logging.level.org.springframework.web=debug

N'oubliez pas de valider les modifications dans ce répertoire afin que le service de configuration détecte les modifications et charge le fichier.

====  **  2.4. Courir**

Exécutons maintenant notre application et accédez à http://localhost: 9411. Nous devrions être accueillis avec la page d'accueil de __Zipkin’s__:

link:/uploads/zipkinhomepage-1-1.png%201595w[]

Génial! Nous sommes maintenant prêts à ajouter des dépendances et une configuration à nos services que nous souhaitons suivre.

===  **  3. Configuration du service **

La configuration des serveurs de ressources est à peu près la même. Dans les sections suivantes, nous détaillerons comment configurer __book-service.__ Nous suivrons ensuite en expliquant les modifications nécessaires pour appliquer ces mises à jour à __rating-service__ et __gateway-service ** ** . ** **  __

====  **  3.1. Installer**

Pour commencer à envoyer des images à notre serveur __Zipkin__, nous allons ajouter cette dépendance à notre fichier __pom.xml__:

[source,xml,gutter:,true]

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

Pour référence: vous pouvez trouver la dernière version sur __Maven Central__ (https://search.maven.org/classic/#search%7Cgav%7C1%7Cg%3A%22org.springframework.cloud%22%20AND%20a%3A% 22spring-cloud-starter-zipkin% 22[printemps-cloud-starter-zipkin]).

====  **  3.2. Config de printemps **

Nous devons ajouter une configuration pour que **  book-service **  utilise __Eureka__ pour trouver notre service __Zipkin__. Ouvrez __BookServiceApplication.java__ et ajoutez ce code au fichier:

[source,java,gutter:,true]

@Autowired private EurekaClient eurekaClient;

@Autowired private SpanMetricReporter spanMetricReporter;

@Autowired private ZipkinProperties zipkinProperties;

@Value("${spring.sleuth.web.skipPattern}") private String skipPattern;

@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(baseUrl,
      zipkinProperties.getFlushInterval(),
      zipkinProperties.getCompression().isEnabled(),
      spanMetricReporter);
                if (!span.name.matches(skipPattern)) delegate.report(span);
            }
        }
    };
}
La configuration ci-dessus enregistre un __ZipkinSpanReporter__ personnalisé qui obtient son URL de eureka. Ce code garde également trace de l'URL existante et met à jour le __HttpZipkinSpanReporter__ si l'URL change Ainsi, quel que soit le lieu où nous déployons notre serveur Zipkin, nous pourrons toujours le localiser sans redémarrer le service.

Nous importons également les propriétés Zipkin par défaut chargées par Spring Boot et les utilisons pour gérer notre rapporteur personnalisé.

====  **  3.3. Configuration**

Ajoutons maintenant une configuration à notre fichier __book-service.properties__ dans le référentiel de configuration:

[source,text,gutter:,true]

spring.sleuth.sampler.percentage=1.0 spring.sleuth.web.skipPattern=(^cleanup.** )

__Zipkin__ fonctionne en échantillonnant des actions sur un serveur. En définissant __spring.sleuth.sampler.percentage__ sur 1.0, nous fixons le taux d'échantillonnage à 100%. Le modèle de saut est simplement un regex utilisé pour exclure les plages dont le nom correspond.

Le modèle de saut bloquera toutes les plages signalées qui commencent par le mot «nettoyage». Ceci permet d’arrêter les plages provenant de la base de code de la session de printemps.

====  **  3.4. Service d'évaluation **

Suivez les mêmes étapes à partir de la section __book-service__ ci-dessus, en appliquant les modifications aux fichiers équivalents pour __rating-service.__

====  **  3.5. Service de passerelle **

Suivez les mêmes étapes **  book-service ** . Mais lorsque vous ajoutez la configuration à la passerelle, ____. Properties____, ajoutez ces éléments à la place:

[source,text,gutter:,true]

spring.sleuth.sampler.percentage=1.0 spring.sleuth.web.skipPattern=(^cleanup. |.+favicon. )

Cela configurera le service de passerelle pour qu'il n'envoie pas de plages autour de la session favicon ou spring.

====  **  3.6. Courir**

Si ce n’est déjà fait, démarrez les services **  config ** , **  discovery ** , **  gateway ** , **  book ** , **  rating ** , et **  zipkin **

Accédez à http://localhost: 8080/book-service/books.

Ouvrez un nouvel onglet et accédez à http://localhost: 9411. Sélectionnez book-service et appuyez sur le bouton ‘Find Traces’. Vous devriez voir une trace apparaître dans les résultats de la recherche. Cliquez sur cette trace pour l'ouvrir:

link:/uploads/zipkintrace-1-1-1024x110.png%201024w[]

Sur la page de trace, nous pouvons voir la demande ventilée par service. Les deux premières plages sont créées par la __gateway__ et la dernière par le __book-service.__ Cela nous indique combien de temps la requête a passé sur le __book-service, __ 18,379 ms, et sur la __gateway, __ 87,961 ms. .

===  **  4. Conclusion**

Nous avons vu à quel point il est facile d'intégrer __Zipkin__ dans notre application cloud.

Cela nous donne une idée très utile de la manière dont la communication passe par notre application. À mesure que notre application devient de plus en plus complexe, Zipkin peut nous fournir des informations indispensables sur les endroits où les demandes passent leur temps. Cela peut nous aider à déterminer où les choses ralentissent et à indiquer quels domaines de notre application doivent être améliorés.

Comme toujours, vous trouverez le code source https://github.com/eugenp/tutorials/tree/master/spring-cloud/spring-cloud-bootstrap[over sur Github].