Implementieren der verteilten Ablaufverfolgung in Dubbo: Ein Alibaba-Leitfaden für Zipkin

Erfahren Sie, wie Sie Zipkin in Dubbo für komplexe verteilte Systeme implementieren, von der Konfiguration von Abhängigkeiten bis zur Durchführung von Tracing-Analysen

Da Anwendungen immer umfangreicher werden, kann die traditionelle Anwendungsarchitektur Schwierigkeiten haben, die Entwicklungsanforderungen zu erfüllen. Dies hat zu einer Transformation der Servicearchitektur geführt, die von verteilten Service-Frameworks wie Dubbo geleitet wird.

Zusammen mit dieser Transformation der Servicearchitektur wurden Anwendungen auch weiter auf eine feinere Granularität aufgeteilt, wobei eine große Anzahl verschiedener Anwendungen von verschiedenen Teams entwickelt wurde. Diese Faktoren führen zu einer erhöhten Komplexität im gesamten verteilten System, was es schwierig macht, die Ursachen von Problemen zu lokalisieren, wenn sie auftreten.

Wichtige Technologieunternehmen p haben verschiedene Antworten auf dieses Problem generiert. Google hat einen Artikel über Dapper veröffentlicht, seine Infrastruktur zur Verfolgung verteilter Systeme. Alibaba hat seine eigenen verteilten Rückverfolgungssysteme auf den Markt gebracht, unter denen EagleEye das bekannteste ist. Twitter entwickelte Zipkin, ein Open Source Distributed Tracing System.

Dieser Artikel befasst sich mit einigen technischen Grundlagen von Zipkin und zeigt Entwicklern, wie Zipkin in Dubbo zum Implementieren der verteilten Ablaufverfolgung verwendet wird.

Zipkin verstehen

Zipkin ist ein verteiltes Open-Source-Tracing-System von Twitter, das Informationen zur Ausführungszeit verteilter Dienste sammelt. Zipkin verfolgt Service-Call-Links und analysiert Verzögerungen bei der Service-Ausführung.

Zipkin-Architektur

Der Zipkin-Server enthält die Collector-, Speicher-, API- und UI-Benutzeroberfläche und entspricht dem openzipkin / zipkin-Projekt auf GitHub. Die Komponenten, die die in der Erfassungsanwendung aufgerufenen Informationen zur verbrauchten Zeit melden, sind mit der Anwendung symbiotisch.

Versionen sind in verschiedenen Sprachen verfügbar, einschließlich Go, PHP, Javascript, Net und Ruby. Die Java-Client-Implementierung befindet sich unter openzipkin / bold.

Zipkin-Arbeitsprozesse

Wenn der Benutzer einen Anruf initiiert, generiert der Zipkin-Client beim Eingang eine global eindeutige Ablaufverfolgungs-ID für den gesamten Aufruflink. Der Zipkin-Client generiert außerdem eine Bereichs-ID für jeden verteilten Anruf im Link.

Zwischen span und span kann eine Eltern-Kind-Beziehung bestehen, die die Upstream- und Downstream-Beziehungen in verteilten Anrufen darstellt. Es kann auch eine Geschwisterbeziehung geben, die zwei Unteranrufe unter dem aktuellen Anruf darstellt. Eine Reihe von Spannen bildet zusammen eine Spur.

Jeder Bereich ist durch Anrufgrenzen getrennt. In Zipkin wird die Anrufgrenze durch die folgenden vier Anmerkungen dargestellt:

· CS – Client gesendet: Der Client hat die Anforderung gesendet

· SR – Serverempfang: Der Server hat die Anforderung

empfangen

· SS – Server senden: Der Server hat den Vorgang abgeschlossen und eine Antwort an den Client gesendet

· CR – Client Receive: Client hat das Ergebnis erhalten

Sie können Zeitstempel für diese vier Anmerkungen verwenden, um die Zeit zu ermitteln, die für verschiedene Phasen eines vollständigen Anrufs aufgewendet wurde. Zum Beispiel:

· SR – CS zeigt die Zeit an, die für die Anforderung im Netzwerk aufgewendet wurde

· SS – SR zeigt die Zeit an, die der Server für die Verarbeitung der Anforderung benötigt

· CR – SS zeigt die Zeit an, die das Netzwerk für die Antwort benötigt hat

· CR – CS zeigt die Gesamtzeit an, die für einen Anruf aufgewendet wurde

Zipkin übergibt Trace-bezogene Informationen an die anrufende Verbindung und meldet die verbrauchte Zeit des aktuellen Anrufs am Ende jeder Anrufgrenze asynchron an den Zipkin-Server. Wenn der Zipkin-Server die Ablaufverfolgungsinformationen empfängt, speichert er diese. Zipkin unterstützt verschiedene Speichertypen wie In-Memory, MySQL, Cassandra und ElasticSearch. Die Web-Benutzeroberfläche von Zipkin extrahiert dann die Trace-Informationen zur Analyse über den API-Zugriff aus dem Speicher und zeigt sie an, wie in der folgenden Abbildung dargestellt:

Verwenden von Zipkin in Dubbo

Da Dubbo von Brave unterstützt wird, ist die Integration der Zipkin-basierten Link-Ablaufverfolgung in Dubbo einfach. Der folgende Inhalt erläutert die Verwendung von Zipkin in Dubbo gemäß den von Dubbo RPC in Brave unterstützten Richtlinien.

Installieren des Zipkin-Servers

Sie können Zipkin installieren, indem Sie die Kurzanleitung in der offiziellen Zipkin-Dokumentation wie folgt befolgen:

Wenn der Zipkin-Server auf diese Weise installiert wird, wird als Speichertyp im Speicher verwendet. Wenn der Server heruntergefahren wird, gehen alle gesammelten Trace-Informationen verloren und sind nicht für die Verwendung in Produktionssystemen geeignet. Wenn die Ablaufverfolgungsinformationen in einem Produktionssystem verwendet werden, müssen auch andere Speichertypen konfiguriert werden. Zipkin unterstützt MySQL, Cassandra und ElasticSearch. Cassandra und ElasticSearch werden empfohlen. Informationen zur entsprechenden Konfiguration finden Sie in der offiziellen Dokumentation.

Der in diesem Artikel verwendete Speichertyp ist der Einfachheit halber der Arbeitsspeicher. Die folgenden Eingabeaufforderungen werden nach erfolgreichem Start auf dem Terminal angezeigt:

Wenn die oben genannten Eingabeaufforderungen angezeigt wurden, besuchen Sie die Webüberprüfungsseite unter http: // localhost: 9411 im Browser.

Konfigurieren der Maven-Abhängigkeit

Einführung in mutige Abhängigkeiten

Erstellen Sie ein neues Java-Projekt und führen Sie mutige Abhängigkeiten in pom.xml wie folgt ein:

Zu den mutigen Abhängigkeiten, die hier eingeführt werden sollen, gehören:

1. Braves Unterstützung für Dubbo, Brave-Instrumentation-Dubbo-RPC: https://github.com/openzipkin/brave/blob/master/instrumentation/dubbo-rpc/README.md

2. Braves Unterstützung für Spring Beans, Brave-Spring Beans: https://github.com/openzipkin/brave/blob/master/spring-beans/README.md

3. Braves Unterstützung für SLF4J, sodass traceId und spanId in MDC verwendet werden können. Brave-context-slf4j: https://github.com/openzipkin/brave/blob/master/context/slf4j/README.md

4. Zipkin-sender-okhttp3 und verwenden Sie okhttp3, um Daten zu melden: https://github.com/openzipkin/zipkin-reporter-java

Einführung in Dubbo-bezogene Abhängigkeiten

Die Dubbo-bezogenen Abhängigkeiten sind Dubbo selbst und der Zookeeper-Client. In den folgenden Beispielen wird ein eigenständiger Zookeeper-Server als Serviceerkennung verwendet.

Zusätzliche Informationen:

1. Dubbo verwendet einen separaten Zookeeper-Server für die Serviceerkennung. Der hier verwendete Client ist Curator.

2. Bei der Einführung der Abhängigkeiten des Dubbo-Frameworks funktioniert grundsätzlich jede 2.6-Version. Hier wird Version 2.6.2 verwendet.

Implementierung

Das Szenario, das dieser Prozess erstellt, ist eine Dienstabhängigkeitskette mit zwei Knoten.

Dies bedeutet, dass, wenn ein Dubbo-Client Dienst A aufruft, Dienst A weiterhin Dienst B aufruft. In diesem Beispiel ist Dienst A der Begrüßungsdienst und der nachgeschaltete Dienst B, von dem er abhängt, der Hallo-Dienst.

Definieren einer Serviceschnittstelle

Dazu müssen Sie zunächst zwei Dienstschnittstellen definieren, den GreetingService und den HelloService.

2. com.alibaba.dubbo.samples.api.HelloService

Implementieren der Serviceschnittstelle

Um die beiden Codetypen zu trennen, werden alle Implementierungscodes, die sich auf den HelloService beziehen, unter das Hallo-Unterpaket und alle Implementierungscodes, die sich auf den GreetingService beziehen, unter das Begrüßungsunterpaket gestellt.

2. Implementierung von com.alibaba.dubbo.samples.api.GreetingService

Hierbei ist zu beachten, dass GreetingServiceImpl während der Implementierung eine Mitgliedsvariable vom Typ HelloService deklariert. Sobald die Begrüßungsmethode ihre eigene Logik ausgeführt hat, ruft sie die Hello-Methode in HelloService auf.

Die HelloService-Implementierung wird im laufenden Zustand extern injiziert. Was injiziert wird, ist nicht die HelloServiceImpl-Implementierung, sondern der HelloService-Remote-Call-Agent.

Mit dieser Methode wird das Ziel erreicht, einen Dubbo-Dienst abzuschließen, während ein anderer Remote-Dubbo-Dienst aufgerufen wird.

Aus Sicht der Link-Ablaufverfolgung ist der Client, der einen GreetingService aufruft, eine Zeitspanne. Der GreetingService, der den HelloService aufruft, ist eine weitere Spanne. Die beiden Bereiche haben eine Eltern-Kind-Beziehung und gehören zu derselben Spur. Das heißt, beide gehören zur selben Anrufverbindung.

Während der Implementierung von GreetingServiceImpl und HelloServiceImpl wird die verbrauchte Verarbeitungszeit über Thread.sleep simuliert, um eine bessere Anzeige auf der Zipkin-Benutzeroberfläche zu ermöglichen.

Konfiguration

Um einfach die Verwendung von Zipkin zu erläutern, wird in diesem Artikel die traditionellste Spring XML-Konfiguration für das Konfigurations- und Programmiermodell verwendet, anstatt fortgeschrittenere Techniken zu verwenden. Es gibt fortgeschrittenere Methoden, die Anmerkungen oder sogar Spring Boot verwenden. Weitere Informationen finden Sie in den relevanten Dubbo- und Zipkin-Dokumenten.

1. Stellen Sie den HelloService-Dienst

bereit

Fügen Sie die folgende Konfiguration in resources / spring / hello-service.xml hinzu, um HelloServiceImpl als Dubbo-Dienst verfügbar zu machen:

· Der lokal gestartete Zookeeper-Server wird als Registrierungscenter verwendet, und die Adresse wird als Standardwert festgelegt. Tierpfleger: //127.0.0.1: 2181

· Stellen Sie Dienste an Port 20880 mit dem nativen Dubbo-Dienst

bereit

· Registrieren Sie HelloServiceImpl als Spring Bean mit der ID helloService, damit im nachfolgenden & lt; dubbo: service & gt; auf diese Implementierungsklasse verwiesen werden kann.

· Stellen Sie HelloServiceImpl über & lt; dubbo: service & gt; als Dubbo-Dienst

2. Fügen Sie die Zipkin-bezogene Konfiguration

hinzu

Fügen Sie die Zipkin-bezogene Konfiguration in resources / spring / hello-service.xml hinzu:

· Ändern Sie die Konfiguration der Dubbo-Service-Exposition und fügen Sie den Zipkin-Ablaufverfolgungsfilter zur Filterkette in Dubbo hinzu.

· Konfigurieren Sie den Zipkin-Absender und die Tracing Spring Bean gemäß https://github.com/openzipkin/brave/blob/master/spring-beans/README.md

3. Fügen Sie die HelloService-Startklasse

hinzu

Lesen Sie die konfigurierte spring / hello-service.xml in com.alibaba.dubbo.samples.service.hello.Application über ClassPathXmlApplicationContext, um einen Spring-Kontext zu initialisieren und zu starten.

4. Stellen Sie den GreetingService-Dienst bereit und verwenden Sie Zipkin

Konfigurieren Sie GreetingService in resources / spring / greeting-service.xml. Die Schritte sind ähnlich wie bei HelloService. Dieser Artikel befasst sich mit der Konfiguration der Abhängigkeiten von Downstream-Diensten im GreetingService. Die integrale XML-Konfiguration lautet wie folgt:

Die Konfiguration ähnelt HelloService wie oben. Beachten Sie die folgenden zwei Punkte:

· Beachten Sie in Schritt 3 des vorherigen Codes, dass der Dienst an einem anderen Port verfügbar gemacht werden muss, da sonst ein Konflikt mit HelloService auftritt. In diesem Fall ist Port 20881 ausgewählt.

· Deklarieren Sie den Remote-Agenten von HelloService über Schritt 4 im vorhergehenden Code und fügen Sie ihn dann über Schritt 5 im vorhergehenden Code zu GreetingService zusammen, um die Deklaration der Abhängigkeit des Upstream- und Downstream-Dienstes abzuschließen.

Das Hinzufügen der Startklasse von GreetingService ähnelt HelloService: Initialisieren Sie einen neuen Spring-Kontext, indem Sie spring / greeting-service.xml konfigurieren.

1. Implementieren Sie den Client

Initialisieren Sie einen Spring-Kontext über resources / spring / client.xml und beziehen Sie den Remote-Agenten von GreetingService, um einen Remote-Aufruf zu initiieren.

Die Konfiguration in resource / spring / client.xml ähnelt der Dubbo-Dienstkonfiguration, bei der es hauptsächlich um die Konfiguration des Remote-Agenten und von Zipkin geht.

Wenn das Projekt abgeschlossen ist, sieht die Inhaltsstruktur wie folgt aus:

Ausführen des Projekts

Führen Sie den gesamten Link aus, um die Leistung der Zipkin-Link-Ablaufverfolgung zu überprüfen.

Starten des Zookeeper-Servers

Führen Sie die folgenden Befehle aus, um einen lokalen Zookeeper-Server zu starten. Wenn Sie es nicht installiert haben, laden Sie es von der offiziellen Website von ZooKeeper herunter:

$ zkServer start

Starten des Zipkin-Servers

Führen Sie die folgenden Befehle aus und starten Sie einen Zipkin-Server lokal:

$ curl -sSL https://zipkin.io/quickstart.sh | Bash -s

$ java -jar zipkin.jar

Starten von HelloService

Starten Sie HelloService mit den folgenden Befehlen oder direkt in der IDE:

$ mvn exec: java -Dexec.mainClass = com.alibaba.dubbo.samples.service.hello.Application

Wenn der Start erfolgreich ist, wird auf der Client-Seite “Hallo Dienst gestartet” angezeigt.

GreetingService wird gestartet

Starten Sie GreetingService mit den folgenden Befehlen oder starten Sie es direkt in der IDE:

$ mvn exec: java -Dexec.mainClass = com.alibaba.dubbo.samples.service.greeting.Application

Wenn der Start erfolgreich ist, wird auf dem Terminal “Begrüßungsdienst gestartet” angezeigt.

Ausführen des Dubbo-Clients

Starten Sie einen Remote-Aufruf von GreetingService, indem Sie das Client-Ende von Dubbo mit den folgenden Befehlen ausführen oder direkt in der IDE starten:

$ mvn exec: java -Dexec.mainClass = com.alibaba.dubbo.samples.client.Application

Wenn die Ausführung erfolgreich ist, zeigt das Client-Ende auf dem Terminal “Begrüßung, Hallo, Welt” an.

Tracing-Analyse durchführen

Öffnen Sie den Browser und besuchen Sie http: // localhost: 9411. Drücken Sie auf “Traces suchen”, um die soeben aufgerufene Tracing-Analyse zu finden:

Sie können auch jede Spanne auswählen, um die Details innerhalb der aktuell genannten Grenze zu erfahren. Zum Beispiel sind die Details der Zeitspanne des Hallo-Dienstes wie folgt:

Weiterführende Literatur

Ziel dieses Artikels ist es, grundlegende Konzepte für die Linkverfolgung vorzustellen und die Grundlagen der Verwendung von Zipkin zu erläutern. In diesem Artikel wurde auch gezeigt, wie Sie mit Dubbo einen einfachen Anruflink erstellen und wie Sie Zipkin für die vollständige Linkverfolgung verwenden. Zipkin unterstützt Dubbo gut, so dass der gesamte Prozess recht unkompliziert ist.

Zipkins Unterstützung für Dubbo basiert auf dem Filtererweiterungsmechanismus von Dubbo. Diese Seite auf GitHub enthält weitere Informationen.

Die in diesem Artikel erwähnten Instanzen können hier aus dem Untermodul “dubbo-samples-zipkin” abgerufen werden. Darüber hinaus unterstützt Spring Cloud Sleuth 2.0 jetzt Dubbo.

Alibaba Tech

Aus erster Hand und ausführliche Informationen über die neueste Technologie von Alibaba → Facebook: „Alibaba Tech“ . Twitter: “AlibabaTech” .