Der Spring Cloud Netflix Stack Grundkurs
Die Anwendung um eine E-Mail-Komponente erweitern
Machen Sie sich anhand dieses Videos mit den erforderlichen Schritten vertraut, um die Gästebuch-Anwendung um eine E-Mail-Komponente zu erweitern. Diese werden Sie mit Hilfe eines Microservices umsetzen und in Eureka integrieren.
mit Karsten Samaschke
So ein Gästebuch ist schon eine feine Angelegenheit, allerdings macht es erst dann richtig Spaß, wenn wir uns per E-Mail darüber benachrichtigen lassen können, dass es einen neuen Eintrag in unserem Gästebuch gibt. In diesem Video werden wir die dafür notwendige Infrastruktur anlegen, wir werden ein Microservice schreiben, der mit Hilfe der Spring Mail-Komponente eine Nachricht versendet, sobald ein Eintrag dem Gästebuch hinzugefügt worden ist. Um dies zu ermöglichen, legen wir zunächst einmal ein neues Projekt per Rechtsklick in dem Project Explorer, "New" "Project", an. Das Projekt ist vom Typ "Spring Starter Project". Es heißt "guestbook-mail", Artifact-ID ist "guestbook mail" und wir legen eine entsprechende Beschreibung ebenfalls mit an. Ein Klick auf "Next" erlaubt es uns, die benötigten Abhängigkeiten auszuwählen. Zum eine benötigen wir "Eureka Discovery", mit deren Hilfe wir Clients in die Lage versetzen, sich am Eureka-Server anzumelden und wir benötigen "Mail". Das ist eine Komponente aus dem Spring Framework, die es uns erlaubt, eine E-Mail deutlich einfacher zu versenden, als wir dies auf Ebene der Java Mail-Komponente tun könnten. Ein Klick auf "Finish" legt das Projekt an. Nach ein paar Sekunden sind alle benötigten Komponenten geladen und wir können uns der Konfiguration dieses Projektes widmen. Zu diesem Zweck wechseln wir im Projekt in die Datei "application.properties" und legen hier zunächst einmal die fast schon üblichen Standardkonfigurationseinträge zu Applikationsname, Serverport und dem Eureka-Service an. Nun werden wir die für Mail benötigten Einstellungen hinterlegen. In diesem Fall sind das Einstellungen, mit denen Sie eine Nachricht über Gmail versenden könnten, allerdings werden Sie es mir nachsehen, wenn ich Ihnen meinen Benutzernamen und mein Kennwort hier nicht im Klartext zeige. Die Einstellungen umfassen das Festlegen des Hosts, des Ports, für den Zugriff auf Gmail, Benutzername, Kennwort und Information darüber, dass die Authentifizierung per SSL aktiviert ist. Nun werden wir noch zwei eigene Einstellungen treffen, die wir später im Service benutzen werden. Und zwar sind dies die Einstellungen "mail.from". "mail.from" soll den Absender festlegen, diese Festlegung kann entweder über den Aufrufparameter "mail_from" erfolgen oder wird in Standardwert "Guestbook" mit der Absenderadresse "karsten.samaschke@gmail.com" beinhalten und die entsprechende E-Mail geht an den Wert, der über den Umgebungsparameter "mail_to" angegeben worden ist. Ist dieser Wert nicht vorhanden, geben wir einen Standardwert an, in diesem Fall eine weitere E-Mail-Adresse, die natürlich idealerweise existieren sollte. Damit haben wir die Konfiguration auf Ebene der "application.properties"-Datei abgeschlossen. Nun wechseln wir in die Bootstrapping-Datei und fügen hier die Annotation "EnableEurekaClient" ein. Das kann ein paar Sekunden dauern, bis die entsprechende Abhängigkeit aufgelöst ist, eventuell gibt es auch einen Fehler, trotzdem funktioniert das zuverlässig bei Eclipse, sodass Sie sich verlassen können, dass das entsprechende Import-Statement im Kopf der Datei eingefügt wird. Im nächsten Schritt bedienen wir uns schamlos bei uns selbst, denn unser E-Mail-Microservice soll ja darüber informieren, dass es einen neuen Gästebucheintrag gab. Dafür benötigen wir naheliegenderweise auch die Daten des Gästebucheintrags und diese Daten lassen wir uns gleich in Form einer Klasse geben. Wir wechseln also einmal in das "guestbook-backend"-Projekt, und hier im Bereich "src/main/java" auf die "GuestbookEntry"-Klasse; wir kopieren diese Klasse einmal und fügen sie dann, so wie sie ist, in unsere neue Applikation ein. Müssen nun allerdings ein paar Anpassungen vornehmen, zum einen müssen wir die nicht mehr benötigten "javax.persistance"-Annotationen entfernen und zum anderen auch die entsprechenden Imports. Das ist aber schnell erledigt und damit haben wir dann schon einen fertigen Guestbook-Entry, den wir später benutzen können, um darüber die Daten zu repräsentieren, die wir versenden wollen. Der eigentliche Versandvorgang findet in Form eines Controllers statt. Wir legen zu diesem Zweck einen neuen Controller an mit dem Namen "GuestbookMailController". Diesen annotieren wir mit der Controllerannotation aus dem Spring Framework und wir versehen ihn mit der "RequestMapping"-Annotation, und legen hier mit Hilfe des "value"-Attributs fest, dass dieser Controller auf den virtuellen Pfad "mail" lauschen wird. Anschließend fügen wir dem Controller drei Felder hinzu. Zum einen das Feld "sender" vom Typ "MailSender" aus dem "org.springframework.mail"-Package. Dieses Feld beinhaltet dann eine automatisch hinzugefügte Komponente, deswegen die "Autowired"-Annotation, die den eigentlichen Mailversand übernehmen wird und zum anderen die beiden Felder "from" und "to", die die Werte aus der Konfigurationsdatei aufgreifen und die es uns dann gestatten, auf die dort hinterlegten Einstellungen im Bezug auf Absender und Empfänger zuzugreifen. Nun benötigen wir noch eine Methode, die wir ansprechen können, um die E-Mail zu versenden. Diese Methode ist vom Rückgabetyp "ResponseEntity" und heißt "sendMail", und nimmt als Parameter im Body der Anforderung, ausgedrückt über die "RequestBody"-Annotation, die gerade eben reinkopierte GuestbookEntry-Instanz mit dem Namen "entry" entgegen. Bevor wir die Methode weiter implementieren, werden wir zunächst einmal die "RequestMapping"-Annotation auch auf dieser Ebene setzen, um festzulegen, wie denn genau auf dieser Methode zugegriffen werden kann. Zum einen gibt es hier den virtuellen Pfad "/", sodass sich der Gesamtpfad "/mail/" ergibt, um auf diese Methode zuzugreifen und zum anderen legen wir fest, dass der Zugriff über die HTTP-Methode "POST" passieren muss, damit können nämlich überhaupt Daten erst mal im Body der Anforderung übertragen werden, und dass die Daten, die übergeben werden, im JSON-Format vorliegen müssen. Das legen wir über die MediaType "APPLICATION_JSON_VALUE"-Information fest. Nun müssen wir uns nur noch um den eigentlichen Versand der Nachricht kümmern. Dieser Versand erfolgt mit Hilfe einer SimpleMailMessage-Instanz, die wir hier neu anlegen. Und dieser SimpleMailMessage-Instanz weisen wir dann über ihre Eigenschaften "from" zum einen den Absender und über die Eigenschaft "to" den Empfänger zu. Anschließend können wir uns mit Hilfe der Eigenschaft "subject" einen aussagekräftigen Betreff überlegen. Einen Wert, der da heißt "Guestbook", und dann fügen wir aus der übergebenen GuestbookEntry-Instanz den Titel hinzu. Die eigentliche Nachricht wird über "setText" dann repräsentiert und hier werten wir zunächst einmal die Eigenschaft "Commenter" der Entry-Instanz aus und lassen uns darüber informieren, was dieser Kommentator denn geschrieben hat und diese Information befindet sich in der Eigenschaft "Comment". Und sobald wir diese Informationen miteinander verknüpft haben, ist die E-Mail auch soweit fertig und kann versandt werden. Der eigentliche Versand geschieht durch Aufruf der Methode "send", der MailSender-Instanz. Und zu guter Letzt signalisieren wir der aufrufenden Komponente, also dem Browser oder einer anderen Komponente, dass alles erfolgreich war, indem wir den HTTP-Status-Code "ok" generieren und zurück geben lassen. Damit haben wir diesen Controller dann auch fertig gestellt und damit ist auch die Gesamtapplikation fertig gestellt. Nun müssen wir lediglich die Applikation noch in Betrieb setzen, um sie dann später auch nutzen zu können. Zu diesem Zweck führen wir einen Rechtsklick auf die Applikation aus, wählen aus dem Kontextmenü "Run As" "Spring Boot App" und lassen die Applikation starten. Nach ein paar Sekunden steht sie dann zur Verfügung und könnte genutzt und angesprochen werden. In diesem Video haben wir unserem Projekt einen Microservice hinzugefügt, der mit Hilfe von Spring Mail in der Lage ist, eine E-Mail an den Betreiber des Gästebuchs zu versenden, diese E-Mail wird darüber informieren, dass einer neuer Gästebucheintrag angelegt worden ist. Die Applikation ist fertig gestellt, die Applikation integriert sich auch in Eureka und kann somit dann auch von anderen Komponenten der Gesamtapplikation genutzt werden.
Lernen Sie den Open Source Cloud Stack und seine vielfältigen Einsatzmöglichkeiten kennen.
Karsten Samaschke
Softwaredesign