© Excellent backgrounds/Shutterstock.com
Message-driven Microservices mit Spring Cloud Stream

Miteinander reden


Microservices-Architekturen bringen einen erhöhten, systemgrenzenübergreifenden Kommunikationsaufwand mit sich. Als Schnittstelle zwischen den Systemen kommt für synchrone Kommunikation häufig HTTP und für asynchrone Kommunikation ein Message Bus zum Einsatz. Wir schauen uns Messaging in Spring-Boot-Anwendungen an – genau gesagt Message-driven Microservices mit Spring Cloud Stream.

Spring bietet für das Messaging verschiedene Möglichkeiten. Eine einfache Lösung ist Spring JMS [1]. Es arbeitet mit Java Message Service (JMS), einem Standard-API der Java-Plattform zum Senden und Empfangen von Messages. Spring unterstützt zwei Implementierungen dieses API: ActiveMQ und Artemis. Spring JMS vereinfacht den Zugriff auf diese beiden sogenannten Message-oriented Middlewares. Der Versand einer Message erfolgt mit einem Spring JmsTemplate, der Empfang mit einer @JmsListener-Methodenannotation. Spring Boot stellt für JMS mit ActiveMQ und JMS mit Artemis entsprechende Starter bereit.

Spring AMQP [2] ist eine weitere Messaging-Lösung von Spring. Das Advanced Message Queuing Protocol (AMQP) ist ein plattform- und programmiersprachenunabhängiges Protokoll für eine Message-oriented Middleware. Analog zum Zugriff via JMS bietet Spring ein AmqpTemplate und ein RabbitMessagingTemplate für den Versand und eine @RabbitListener-Methoden­annotation für den Empfang via RabbitMQ. RabbitMQ ist ein auf AMQP basierender Message Broker, der von Spring für die Kommunikation über AMQP verwendet wird. Auch für Spring AMQP mit RabbitMQ wird ein Spring Boot Starter angeboten.

Im Spring-Messaging-Portfolio ist zudem noch Spring Kafka [3] zu finden. Apache Kafka ist mit den traditionellen Messaging-Systemen wie ActiveMQ und RabbitMQ vergleichbar und bietet sich vor allem als gute Lösung für Systeme mit hohem Durchsatz an. Wie auch bei Spring JMS und der Spring-Rabbit-Unterstützung via AMQP bietet Spring Kafka für das Versenden von Messages ein KafkaTemplate und für den Empfang eine @KafkaListener-Methodenannotation an.

So sieht eine Message-driven Architektur aus

Das Prinzip der Trennung von Zuständigkeiten, auch bekannt als Separation of Concerns, wird bei vertikaler Betrachtung durch eine Schichtenarchitektur ermöglicht. Deren lose Kopplung wird durch die Vereinbarung von Schnittstellen zwischen den Schichten untersützt. Message-driven Architekturen verfolgen ebenso eine lose Kopplung, jedoch auf horizontaler Ebene. Message-driven Systeme folgen dem Pipes-and-Filters-Muster, das eine Gesamtaufgabe in mehrere aufeinanderfolgende Verarbeitungsschritte aufteilt (Abb. 1). Die einzelnen Verarbeitungsschritte werden dabei in sogenannte Filter gekapselt, die durch Pipes verbunden sind. Die Ausgabe des einen Verarbeitungsschritts ist die Eingabe des nächsten Verarbeitungsschritts. Durch die Verbindung der Filter durch Pipes ergibt sich ein Datenstrom, der Stream. Das Grundprinzip kennt jeder, der schon einmal Unix-Kommandos durch eine Pipe verknüpft hat. Das Pipes-and-Filter Muster ist ausführlich im Buch „Pattern-orientierte Softwarearchitektur“ [4] beschrieben.

hoffmann_springcloudstream_1.tif_fmt1.jpgAbb. 1: Das Prinzip einer Pipes-and-Filter-Architektur: Es entsteht ein Datenstrom

Pipes and Filters mit Spring Integration

Im Zusammenhang mit Unix-Pipes darf die Unix-Philosophie nicht unerwähnt bleiben, die verkürzt „Mach nur eine Sache und mach sie gut“ lautet. Dieser Philosophie entspricht auch weitgehend der Gedanke hinter Microservices, was dazu beiträgt, dass immer mehr verteilte Systeme entstehen. Damit einhergehend ergibt sich ein erhöhter Kommunikationsaufwand über Systemgrenzen hinweg, wobei die Problematik nicht neu ist – ein System kann nicht isoliert von anderen Systemen leben. Der Thematik der Integration von Systemen und vor allem dem Messaging widmet sich das Buch „Enterprise Integration Patterns“ [5] aus dem Jahr 2003. Dieses Buch bildet aus einer Sammlung von Entwurfsmustern eine Mustersprache, die Message-orientierte Integrationslösungen beschreibt. Das Spring-Integration-Projekt [6] unterstützt diese Enterprise-Integration-Patterns und stellt aufbauend auf dem Spring-Programmiermodell eine leichtgewichtige Messaging-Lösung bereit, bei der das Pipes-and-Filter-Muster zur Anwendung kommt.

Zu den Hauptkomponenten von Spring Integration zählen Message, Message Channel und Message-Endpunkte. Eine Message besteht aus der Payload und dem Header. Die Payload enthält die eigentlichen Daten, und der Header ermöglicht die Speicherung von Key-Value-Paaren. Ein Message Channel repräsentiert die Pipe einer Pipes-and-Filters-Architektur. Producer senden Messages zu einem Channel, Consumer empfangen Messages von einem Channel. Der Message Channel entkoppelt die Messaging-Komponenten ...

Neugierig geworden? Wir haben diese Angebote für dich:

Angebote für Teams

Für Firmen haben wir individuelle Teamlizenzen. Wir erstellen Ihnen gerne ein passendes Angebot.

Das Library-Modell:
IP-Zugang

Das Company-Modell:
Domain-Zugang