Spring Cloud - Tracing Services mit Zipkin

1. Übersicht

In diesem Artikel werden wir Zipkin zu unserem Frühlingswolkenprojekt hinzufügen . Zipkin ist ein Open Source-Projekt, das Mechanismen zum Senden, Empfangen, Speichern und Visualisieren von Traces bietet. Auf diese Weise können wir die Aktivitäten zwischen Servern korrelieren und ein viel klareres Bild davon erhalten, was genau in unseren Diensten geschieht.

Dieser Artikel ist kein Einführungsartikel zu Distributed Tracing oder Spring Cloud. Wenn Sie weitere Informationen zur verteilten Ablaufverfolgung wünschen, lesen Sie unsere Einführung in Spring Sleuth.

2. Zipkin Service

Unser Zipkin- Service dient als Geschäft für alle unsere Bereiche . Jede Spanne wird an diesen Dienst gesendet und zur späteren Identifizierung in Spuren gesammelt.

2.1. Konfiguration

Erstellen Sie ein neues Spring Boot-Projekt und fügen Sie diese Abhängigkeiten zu pom.xml hinzu:

 io.zipkin.java zipkin-server   io.zipkin.java zipkin-autoconfigure-ui runtime 

Als Referenz: Sie finden die neueste Version auf Maven Central (zipkin-server, zipkin-autoconfigure-ui). Versionen der Abhängigkeiten werden von Spring-Boot-Starter-Parent geerbt.

2.2. Aktivieren von Zipkin Server

Um den Zipkin- Server zu aktivieren , müssen wir der Hauptanwendungsklasse einige Anmerkungen hinzufügen:

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

Die neue Annotation @EnableZipkinServer richtet diesen Server so ein, dass er auf eingehende Bereiche wartet und als Benutzeroberfläche für die Abfrage fungiert.

2.3. Aufbau

Zuerst erstellen wir eine Datei mit dem Namen bootstrap.properties in src / main / resources . Denken Sie daran, dass diese Datei benötigt wird, um unsere Konfiguration von unserem Konfigurationsserver abzurufen.

Fügen wir diese Eigenschaften hinzu:

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/

Fügen wir nun eine Konfigurationsdatei zu unserem Konfigurations-Repo hinzu, die sich unter c oder \ Users \ {username} \ unter Windows oder / home / {username} / on * nix befindet.

Fügen Sie in diesem Verzeichnis eine Datei mit dem Namen zipkin.properties hinzu und fügen Sie folgende Inhalte hinzu:

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

Denken Sie daran, die Änderungen in diesem Verzeichnis festzuschreiben, damit der Konfigurationsdienst die Änderungen erkennt und die Datei lädt.

2.4. Lauf

Führen Sie nun unsere Anwendung aus und navigieren Sie zu // localhost: 9411. Wir sollten mit Zipkins Homepage begrüßt werden :

Großartig! Jetzt können wir unseren Diensten, die wir verfolgen möchten, einige Abhängigkeiten und Konfigurationen hinzufügen.

3. Servicekonfiguration

Das Setup für die Ressourcenserver ist ziemlich gleich. In den folgenden Abschnitten erfahren Sie, wie Sie den Buchservice einrichten . Anschließend erläutern wir die Änderungen, die erforderlich sind, um diese Aktualisierungen auf den Bewertungsdienst und den Gateway-Dienst anzuwenden .

3.1. Konfiguration

Um Spans an unseren Zipkin- Server zu senden , fügen wir diese Abhängigkeit unserer Datei pom.xml hinzu :

 org.springframework.cloud spring-cloud-starter-zipkin 

Als Referenz: Sie finden die neueste Version auf Maven Central (Spring-Cloud-Starter-Zipkin).

3.2. Frühlingskonfiguration

Wir brauchen eine Konfiguration hinzuzufügen , so dass Buch-Service verwenden Eureka unsere finden Zipkin Service. Öffnen Sie BookServiceApplication.java und fügen Sie diesen Code zur Datei hinzu:

@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); } } }; }

Die obige Konfiguration registriert einen benutzerdefinierten ZipkinSpanReporter , der seine URL von eureka erhält. Dieser Code verfolgt auch die vorhandene URL und aktualisiert den HttpZipkinSpanReporter nur, wenn sich die URL ändert. Unabhängig davon, wo wir unseren Zipkin-Server bereitstellen, können wir ihn auf diese Weise immer finden, ohne den Dienst neu starten zu müssen.

Wir importieren auch die Standardeigenschaften von Zipkin, die vom Spring Boot geladen werden, und verwenden sie zum Verwalten unseres benutzerdefinierten Reporters.

3.3. Aufbau

Fügen wir nun unserer Datei book-service.properties im Konfigurations-Repository eine Konfiguration hinzu :

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

Zipkin tastet Aktionen auf einem Server ab. Durch Setzen des Prozentsatzes spring.sleuth.sampler.percentage auf 1.0 setzen wir die Abtastrate auf 100%. Das Sprungmuster ist einfach ein regulärer Ausdruck, der zum Ausschließen von Bereichen verwendet wird, deren Name übereinstimmt.

Das Sprungmuster verhindert, dass alle Bereiche gemeldet werden, die mit dem Wort "Bereinigung" beginnen. Dies dient dazu, Bereiche zu stoppen, die von der Code-Basis der Frühjahrssitzung stammen.

3.4. Bewertungsservice

Befolgen Sie die gleichen Schritte aus dem Buch-Service - Abschnitt über die Änderungen auf die entsprechenden Dateien für die Anwendung Rating-Service.

3.5. Gateway-Service

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.

Wie immer finden Sie den Quellcode auf Github.