Frühlingswolkenbus

1. Übersicht

In diesem Artikel werden wir uns das neue Spring Cloud Bus-Projekt ansehen. Spring Cloud Bus verwendet einen Lightweight Message Broker, um verteilte Systemknoten zu verbinden. Die Hauptverwendung besteht darin, Konfigurationsänderungen oder andere Verwaltungsinformationen zu übertragen. Wir können es uns als verteilten Aktuator vorstellen.

Das Projekt verwendet AMQP-Broker als Transportmittel, aber Apache Kafka oder Redis können anstelle von RabbitMQ verwendet werden. Andere Transporte werden noch nicht unterstützt.

Im Verlauf dieses Tutorials werden wir RabbitMQ als Haupttransport verwenden - den wir natürlich bereits ausführen werden.

2. Voraussetzungen

Bevor wir beginnen, wird empfohlen, „Quick Intro to Spring Cloud Configuration“ bereits abgeschlossen zu haben. Wir werden einen vorhandenen Cloud-Konfigurationsserver und -Client verwenden, um sie zu erweitern und automatische Benachrichtigungen über Konfigurationsänderungen hinzuzufügen.

2.1. RabbitMQ

Beginnen wir mit RabbitMQ, das wir als RabbitMQ als Docker-Image ausführen. Dies ist recht einfach einzurichten. Damit RabbitMQ lokal ausgeführt werden kann, müssen Sie Docker installieren und die folgenden Befehle ausführen, sobald Docker erfolgreich installiert wurde:

docker pull rabbitmq:3-management

Dieser Befehl ruft das RabbitMQ-Docker-Image zusammen mit dem standardmäßig installierten und aktivierten Management-Plugin ab.

Als nächstes können wir RabbitMQ ausführen:

docker run -d --hostname my-rabbit --name some-rabbit -p 15672:15672 -p 5672:5672 rabbitmq:3-management

Sobald wir den Befehl ausgeführt haben, können wir zum Webbrowser gehen und // localhost: 15672 öffnen, in dem das Anmeldeformular für die Verwaltungskonsole angezeigt wird. Der Standardbenutzername lautet: 'guest' ; Passwort: 'Gast' . RabbitMQ überwacht auch Port 5672.

3. Hinzufügen eines Aktors zum Cloud Config Client

Cloud-Konfigurationsserver und Cloud-Konfigurationsclient sollten beide ausgeführt werden. Um Konfigurationsänderungen zu aktualisieren, ist jedes Mal ein Neustart des Clients erforderlich - was nicht ideal ist.

Beenden wir den Konfigurationsclient und kommentieren die ConfigClient- Controller-Klasse mit @RefreshScope :

@SpringBootApplication @RestController @RefreshScope public class SpringCloudConfigClientApplication { // Code here... }

Zuletzt aktualisieren wir die Datei pom.xml und fügen Actuator hinzu:

 org.springframework.boot spring-boot-actuator 2.2.6.RELEASE 

Die neueste Version finden Sie hier.

Standardmäßig sind alle vom Aktor hinzugefügten vertraulichen Endpunkte gesichert. Dies beinhaltet den Endpunkt '/ refresh' . Der Einfachheit halber deaktivieren wir die Sicherheit, indem wir bootstrap.properties aktualisieren :

management.security.enabled=false

Ab Spring Boot 2 werden Aktuatorendpunkte nicht standardmäßig angezeigt. Um sie für den Zugriff verfügbar zu machen, müssen wir dies in einer application.yml hinzufügen :

management: endpoints: web: exposure: include: "*"

Starten wir zuerst den Client und aktualisieren die Benutzerrolle von vorhandenem 'Entwickler' auf 'Programmierer' in der Eigenschaftendatei auf GitHub. Der Konfigurationsserver zeigt sofort aktualisierte Werte an. Der Client wird dies jedoch nicht tun. Damit der Client neue Dateien sieht, müssen wir nur eine leere POST-Anforderung an den Endpunkt '/ refresh' senden , die vom Aktor hinzugefügt wurde:

$> curl -X POST //localhost:8080/actuator/refresh

Wir erhalten eine JSON-Datei mit aktualisierten Eigenschaften zurück:

[ "user.role" ]

Schließlich können wir überprüfen, ob die Benutzerrolle aktualisiert wurde:

$> curl //localhost:8080/whoami/Mr_Pink Hello Mr_Pink! You are a(n) Programmer and your password is 'd3v3L'.

Die Benutzerrolle wurde erfolgreich und durch Aufrufen des Endpunkts '/ refresh' aktualisiert . Client aktualisiert Konfiguration ohne Neustart.

4. Spring Cloud Bus

Mit Actuator können wir Clients aktualisieren. In der Cloud-Umgebung müssten wir jedoch zu jedem einzelnen Client gehen und die Konfiguration neu laden, indem wir auf den Aktorendpunkt zugreifen.

Um dieses Problem zu lösen, können wir Spring Cloud Bus verwenden.

4.1. Klient

Wir müssen den Cloud-Konfigurationsclient aktualisieren, damit er RabbitMQ Exchange abonnieren kann:

 org.springframework.cloud spring-cloud-starter-bus-amqp 2.2.1.RELEASE 

Die neueste Version finden Sie hier.

Um Änderungen am Konfigurationsclient abzuschließen, müssen wir RabbitMQ-Details hinzufügen und den Cloud-Bus in einer application.yml- Datei aktivieren :

--- spring: rabbitmq: host: localhost port: 5672 username: guest password: guest cloud:   bus:       enabled: true refresh:         enabled: true 

Bitte beachten Sie, dass wir den Standardbenutzernamen und das Standardkennwort verwenden. Dies muss für reale Produktionsanwendungen aktualisiert werden. Für dieses Tutorial ist das in Ordnung.

Jetzt hat der Client einen anderen Endpunkt '/ bus-refresh' . Das Aufrufen dieses Endpunkts führt zu:

  • Rufen Sie die neueste Konfiguration vom Konfigurationsserver ab und aktualisieren Sie die von @RefreshScope kommentierte Konfiguration
  • Senden Sie eine Nachricht an AMQP Exchange, in der Sie über das Aktualisierungsereignis informiert werden
  • Alle abonnierten Knoten aktualisieren auch ihre Konfiguration

Auf diese Weise müssen wir nicht zu einzelnen Knoten gehen und die Konfigurationsaktualisierung auslösen.

4.2. Server

Zuletzt fügen wir dem Konfigurationsserver zwei Abhängigkeiten hinzu, um Konfigurationsänderungen vollständig zu automatisieren.

 org.springframework.cloud spring-cloud-config-monitor 2.2.2.RELEASE 

Die neueste Version finden Sie hier.

 org.springframework.cloud spring-cloud-starter-stream-rabbit 3.0.4.RELEASE 

Die aktuellste Version finden Sie hier.

Wir werden den spring-cloud-config-monitor verwenden , um Konfigurationsänderungen und Broadcast-Ereignisse mit RabbitMQ als Transport zu überwachen.

Wir müssen nur application.properties aktualisieren und RabbitMQ-Details angeben:

spring.rabbitmq.host=localhost spring.rabbitmq.port=5672 spring.rabbitmq.username=guest spring.rabbitmq.password=guest

4.3. GitHub Webhook

Everything is set now. Once the server gets notified about configuration changes, it will broadcast this as a message to RabbitMQ. The client will listen to messages and update its configuration when configuration change event is transmitted. However, how a server will now about the modification?

We need to configure a GitHub Webhook. Let's go to GitHub and open our repository holding configuration properties. Now, let's select Settings and Webhook. Let's click on Add webhook button.

Payload URL is the URL for our config server ‘/monitor' endpoint. In our case the URL will be something like this:

//root: [email protected] _IP:8888/monitor

We just need to change Content type in the drop-down menu to application/json. Next, please leave Secret empty and click on Add webhook button – after that, we are all set.

5. Testing

Let's make sure all applications are running. If we go back and check client it will show user.role as ‘Programmer' and user.password as ‘d3v3L‘:

$> curl //localhost:8080/whoami/Mr_Pink Hello Mr_Pink! You are a(n) Programmer and your password is 'd3v3L'.

Previously, we had to use ‘/refresh' endpoint to reload configuration changes. Let's open properties file, change user.role back to Developer and push the changes:

user.role=Programmer

If we check the client now, we will see:

$> curl //localhost:8080/whoami/Mr_Pink Hello Mr_Pink! You are a(n) Developer and your password is 'd3v3L'.

Der Konfigurationsclient hat seine Konfiguration fast gleichzeitig ohne Neustart und ohne explizite Aktualisierung aktualisiert. Wir können zu GitHub zurückkehren und den kürzlich erstellten Webhook öffnen. Ganz unten befinden sich die letzten Lieferungen. Wir können eine oben in der Liste auswählen (vorausgesetzt, dies war die erste Änderung - es wird sowieso nur eine geben) und JSON untersuchen, das an den Konfigurationsserver gesendet wurde.

Wir können auch Konfigurations- und Serverprotokolle überprüfen und sehen Einträge:

o.s.cloud.bus.event.RefreshListener: Received remote refresh request. Keys refreshed []

6. Fazit

In diesem Artikel haben wir den vorhandenen Spring Cloud-Konfigurationsserver und -Client verwendet und einen Aktorendpunkt hinzugefügt, um die Clientkonfiguration zu aktualisieren. Als Nächstes haben wir Spring Cloud Bus verwendet, um Konfigurationsänderungen zu übertragen und Client-Updates zu automatisieren. Wir haben auch GitHub Webhook konfiguriert und das gesamte Setup getestet.

Wie immer ist der während der Diskussion verwendete Code auf GitHub zu finden.