Der Spring Cloud Netflix Stack Grundkurs

Den Feign-Client zur Kommunikation zwischen Backend- und Mail-Service implementieren

LinkedIn Learning kostenlos und unverbindlich testen!

Jetzt testen Alle Abonnements anzeigen
Der Feign-Service erlaubt es, die Kommunikation zwischen Microservices abzubilden, ohne selbst den notwendigen Code für den Aufruf von RESTful Services schreiben zu müssen. In diesem Video werden Sie die Kommunikation zwischen Backend- und Mail-Service implementieren und die notwendigen Timeout-Informationen definieren, damit alles reibungslos läuft.

Transkript

Wenn Microservices miteinander kommunizieren wollen, geschieht dies üblicherweise in Form von RESTful Service Calls. RESTful Service Calls sind Aufrufe, die HTTP als Transportprotokoll verwenden und die Daten in aller Regel als JSON austauschen. Das Ganze zu bauen und bereitzustellen ist nicht schwierig. Die Komplexität kommt dann in einem Cloud-Umfeld dazu. Dort müssen wir nämlich zunächst einmal bei der Service-Registry nachfragen, welche Instanzen eines Services zu einem bestimmten Zeitpunkt überhaupt verfügbar sind. Und wir müssen der Service-Registry nach Durchführung des Calls auch mitteilen, wenn das Ganze nicht funktioniert hat. Um das alles zu automatisieren, gibt es im Spring Cloud Netflix Stack das Feign-Framework. Wir werden uns in diesem Video einmal damit auseinandersetzen und die Kommunikation zwischen dem Backend-Service und dem Mail-Service für die Benachrichtigung über einen neuen Eintrag umsetzen. Feign müssen wir auf Ebene des Backendprojektes hinzufügen. Zu diesem Zweck öffnen wir dort die Datei "pom.xml" und wechseln in den Reiter "Dependencies". Nun klicken wir auf die Schaltfläche "Add", um eine neue Abhängigkeit hinzuzufügen. Die Group-Id lautet "org.springframework.cloud" und die Artifact-Id lautet "spring-cloud-starter-feign", die Version ist "1.2.3.RELEASE". Ein Klick auf "OK" übernimmt die Einstellung. Nachdem wir die Datei gespeichert haben, wird die Dependency entsprechend aufgelöst und nach ein paar Sekunden können wir in unserem Projekt die notwendigen nächsten Schritte gehen. Feign verwendet intern das Hysterix-Framework, um zu verhindern, dass die Applikation in Timeouts hineinläuft. Aus diesem Grund werden wir zunächst einmal im Bereich "Source" "Main Resources" die Datei "application.properties" editieren und werden hier einen neuen Eintrag hinzufügen. Dieser Eintrag hat den Namen "hysterix.command.default.execution. isolation.thread.timeoutInMilliseconds" und nimmt den Wert 15000 an. Damit legen wir fest, dass ein Request 15 Sekunden dauern kann. Das ist schon ziemlich lang. Wenn wir das nicht tun, werden die Calls, die wir auf das Mail-Backend machen, später zu Fehlern führen, denn das standardmäßige Timeout ist nur 1 Sekunde. Und in einer Sekunde ist in aller Regel keine E-Mail versendet. Deswegen fügen wir diesen Eintrag hinzu, speichern die Datei und können uns nun der Implementierung des Calls hin zum Mail-Backend widmen. Im ersten Schritt der Implementierung öffnen wir einmal die Bootstrappingdatei "Guestbook.Backend.Application" und fügen hier eine weitere Annotation hinzu. Die Annotation, die wir hinzufügen, nennt sich "EnableFeignClients". Und sobald wir dies erledigt haben, ist die Applikation nämlich in der Lage, mit Feign zu arbeiten. Nun legen wir ein Interface an. Wir führen zu diesem Zweck auf den Packagenamen "de.applicity.guestbook" einen Rechtsklick aus und wählen aus dem Kontext-Menü den Eintrag "New" "Interface". Und das Interface nennt sich "Guestbook.Mail.Client". Ein Klick auf "Finish" legt das Interface an. Und nun werden wir hier die Definition der Schnittstelle auf dem Mailserver hinterlegen. Das ist nichts anderes als der Aufruf der Methode samt Requestmapping, Method- und Consumes-Informationen. Diese Informationen existieren bereits. Wir haben sie nämlich auf Ebene der Mailapplikation bei der Implementierung des Controllers bereits hinterlegt. Und aus diesem Grund werden wir den Eintrag, den wir hier haben, einfach kopieren und in unser Interface übernehmen. Statt dass wir hier nun eine sprechende Implementierung bereitstellen, schließen wir die Operation mit einem Semikolon ab. Es handelt sich ja um ein Interface, dass eben keine eigene Implementierung kennt. Damit haben wir für Feign im Grunde schon den Großteil der Vorarbeiten geleistet. Jetzt fehlt noch eine Kleinigkeit, nämlich auf dem Interface die Feign-Client-Annotation. Und diese Feign-Client-Annotation nimmt in Klammern den Namen des Services entgegen, den wir ansprechen wollen. Das ist der Name, unter dem sich der Service bei Eureka angemeldet hat. Und der Mail-Service, das kann man in seinen "application.properties" sehen, meldet sich mit dem Namen "mail" an. Und genau diese Informationen übertragen wir in unser Interface auf Ebene der Feign-Client-Annotation. Damit ist der Feign-Client schon fertig gebaut und wir können uns nun auf Ebene des Guestbook-Controllers der Implementierung des Aufrufs des Backend-Services widmen. Diese Methode müssen wir natürlich nicht implementieren, deswegen setzen wir ein Semikolon an deren Ende. Der Rückgabetyp wird auf "void" geändert, denn wir sind an keiner Rückgabe interessiert. Und wir passen das Requestmapping noch an auf "/mail/". Warum wir das tun? Werfen Sie einmal einen Blick auf den Controller. Hier haben wir nämlich im Kopf des Controllers, den wir ansprechen wollen, ebenfalls eine Requestmapping-Annotation definiert, nämlich mit dem Wert "/mail". Das ist der virtuelle Pfad, auf den dieser Gesamtcontroller hört. Und die Methode, die wir ansprechen wollen, hört auf den untergeordneten Pfad "/", sodass sich der Pfad "/mail/" ergibt. Wir können die nicht mehr benötigte Importdeklaration für "ResponseEntity" entfernen und auf Ebene des Interfaces eine Annotation hinzufügen, die wir dringend benötigen, damit das Ganze wirklich automatisiert läuft. Das ist die Feign-Client-Annotation. Und diese Feign-Client-Annotation nimmt in Klammern nun den Namen des Services entgegen, den wir ansprechen wollen, und das ist der Name "mail". Dieser Name ist auf Ebene des Mail-Services definiert worden, und zwar in der "application.properties"-Datei im Feld "spring.application.name". Genau diesen Namen geben wir dann hier auf Ebene des Mail-Clients an. Damit ist dieser Mail-Client fertig implementiert und wir können uns der restlichen Implementierung auf Ebene des Controllers widmen. Im Controller selber legen wir nun eine zusätzliche private Membervariable vom Typ "GuestbookMailClient" an. Die bekommt den Namen "mailClient" und wird mit der "Autowired"-Annotation versehen. Damit wird jetzt nämlich der eigentliche Feign-Client automatisch gebaut und uns zugewiesen. Den Versand der E-Mail stoßen wir über diesen Mail-Client an, und zwar verwenden wir dessen Methode "sendMail", der wir den gerade gespeicherten Gästebucheintrag übergeben. Sobald das geschehen ist, können wir alle eventuell laufenden Instanzen des Backends beenden und das Backend dann per "Run As" "Spring Boot App" starten. Selbiges sollten Sie, soweit noch nicht geschehen, auch mit dem Mail-Service tun. Nachdem sowohl Backend als auch Mail-Service gestartet worden sind, können wir auf Ebene des Gästebuchs einen neuen Eintrag anlegen und können uns dann anschauen, wie die generierte E-Mail aussehen wird. Nun bleibt noch, den eigentlichen Versand vorzunehmen und das machen wir mit Hilfe der gerade angelegten und initiierten Mail-Client-Instanz und deren Methode "sendMail". Der übergeben wir den gerade gespeicherten Gästebucheintrag und stoßen damit den Versand der E-Mail an. Damit das dann auch wirklich problemlos funktioniert, öffnen wir zuletzt das "guestbook-proxy"-Projekt und wechseln hier in die Datei "application.yml". Hier müssen wir nämlich ebenfalls noch einen zusätzlichen Eintrag hinzufügen, im Grunde denselben Eintrag, den wir schon in der "application.properties"-Datei des Backendprojektes hinzugefügt haben, nur in "yml"-Notation, nämlich die Festlegung eines Timeouts, denn der Feign-Client wird über den Proxyserver gehen bzw. mit diesem Proxyserver interagieren. Damit ist die Implementierung des Aufrufs des Versandes einer E-Mail abgeschlossen und wir können nun alle Applikationen, soweit notwendig, neu starten. Zunächst einmal beende ich die laufenden Applikationen für das "GästebuchBackend" und für den Proxyserver und starte sie neu. Dabei starte ich das Backend wie gehabt zweimal und den Proxyservice einmal neu. Sobald das alles abgeschlossen ist, kann ich danach das Gästebuch im Browser öffnen und einen neuen Eintrag anlegen. Hier im Gästebuch klicken wir auf "Neuen Eintrag hinzufügen" und vergeben einen Titel, einen Beitragstext und unseren Namen. Ein Klick auf "Speichern" speichert diesen Eintrag. Nach ein paar Sekunden erhalten wir entweder eine Fehlermeldung oder die Meldung, dass das Ganze erfolgreich gespeichert worden ist. Sollten wir eine Fehlermeldung erhalten, kann das daran liegen, dass die Registrierung des Backend-Services und/oder des Mail-Services mit den jeweils anderen Services noch nicht durch ist. Wir könnten hier eventuell in ein Problem mit dem Timeout der Registrierungen bei Eureka laufen. Es empfiehlt sich in diesem Fall, einfach 30-60 Sekunden zu warten und es danach erneut zu versuchen. Und dann wird das Ganze auch zuverlässig laufen. Wenn wir jetzt auf "Zur Startseite" klicken, dann ist der Eintrag auch da. Und nun schauen wir uns einmal an, wie das Ganze per E-Mail aussieht. Ich habe einmal die E-Mail geöffnet, die vom Mail-Service versandt worden ist und es sind alle Informationen da, die wir tatsächlich eingegeben hatten, zum einen der Betreff, dann der Name des Absendenden und zu guter Letzt der Beitragstext. Hat also alles ganz genauso geklappt, wie wir es erwartet haben. In diesem Video haben wir uns damit auseinandergesetzt, wie wir unsere Applikation mit Hilfe von Feign in die Lage versetzen, eine Kommunikation zwischen Microservices abzubilden. Das Ganze ist sehr einfach umzusetzen. Es waren lediglich ein paar zusätzliche Konfigurationsänderungen darüber hinaus noch notwendig, um dann wirklich das gewünschte Verhalten erreichen zu können. Diese Konfigurationsänderungen beschränken sich in aller Regel auf das Festlegen von Request-Timeouts. Wir haben das in unserem Fall auf 15 Sekunden gesetzt. Natürlich sind das Werte, die man in der Praxis entsprechend anpassen würde.

Der Spring Cloud Netflix Stack Grundkurs

Lernen Sie den Open Source Cloud Stack und seine vielfältigen Einsatzmöglichkeiten kennen.

2 Std. 5 min (13 Videos)
Derzeit sind keine Feedbacks vorhanden...
Exklusiv für Abo-Kunden
Erscheinungsdatum:06.03.2017

Dieser Online-Kurs ist als Download und als Streaming-Video verfügbar. Die gute Nachricht: Sie müssen sich nicht entscheiden - sobald Sie das Training erwerben, erhalten Sie Zugang zu beiden Optionen!

Der Download ermöglicht Ihnen die Offline-Nutzung des Trainings und bietet die Vorteile einer benutzerfreundlichen Abspielumgebung. Wenn Sie an verschiedenen Computern arbeiten, oder nicht den ganzen Kurs auf einmal herunterladen möchten, loggen Sie sich auf dieser Seite ein, um alle Videos des Trainings als Streaming-Video anzusehen.

Wir hoffen, dass Sie viel Freude und Erfolg mit diesem Video-Training haben werden. Falls Sie irgendwelche Fragen haben, zögern Sie nicht uns zu kontaktieren!