Flink-ESB Message-Gateway Tutorials
Ausgangssituation: Anwendungsserver im Back-End-Netzwerk bietet mehrere verschiedene Dienste,die über HTTP URLs URL1, URL2, ... URLn erreicht werden können.
Diese Dienste können mit GET, POST, PUT, DELETE HTTP-Methoden aufgerufen werden.
Ziel: den externen Clients, die Anwendungsserver im Back-End-Netzwerk nicht direkt ansprechen können, die Mögligkeit anzubieten diese Dienste zu erreichen.
Flink-ESB Message-Gateway soll dabei als Reverse-Proxy verwenden werden. Die externen Clients werden die Anfragen an Message-Gateway verschicken. Message-Gateway wird eine separate Verbindung zum Anwendungsserver aufbauen, die vom Client erhaltene Nachricht an den Server senden, die Antwort vom Server erhalten, und sie an den Client durchgeben.
Da wo es nötig ist, soll noch die Authentifizierungssschicht zu den Diensten hinzugefügt werden.
Voraussichtliche Kosten:
Programmieraufwand: 0
Administratoraufwand: 15 Minuten
In diesem Tutorial werden Elasticsearch-Dienste verwendet, die Teil der Installation von Flink-ESB oder Flink-ESB Message-Gateway sind.
Elasticsearch bietet eine Vielzahl verschiedene Dienste, die über HTTP GET, POST, PUT und DELETE konsumiert werden können.
Selbstverständlich, Sie können, wenn Sie wünschen, den anderen Anwendungsserver in diesem Tutorial benutzen, vergessen Sie aber nicht das Ziel im Schritt 2 entsprechend anzupassen.
Flink-ESB Message-Gateway Konfig-Konsole im Browser öffnen. Standard-URL: https://localhost:8082. Einloggen mit Standard Benutzername/Passwort: admin/admin
Klicken Sie auf "Gateway Config" Registerkarte, wenn Sie nicht bereits da sind, und drücken Sie "Add Entry" Taste.
Geben Sie die Daten wie auf dem Bild unten ein: "Config Id" : 1001 (oder jede beliebige eindeutige Id), "Method" : GET, "URI" : /es/.*. Lassen Sie alle anderen Felder unverändert.
Klicken Sie auf der hinzugefügten Zeile um Detailspanel zu verbergen. Klicken Sie auf "Add Entry" Taste erneut, und geben Sie die Daten für den zweiten Fassade-Eintrag ein: "Config Id" : 1002 (oder jede beliebige eindeutige Id), "Method" : POST, "URI" : /es/.*
Detailspanel verbergen. Klicken Sie auf "Add Entry" Taste, und geben Sie die Daten für den dritten Fassade-Eintrag ein: "Config Id" : 1003 (oder jede beliebige eindeutige Id), "Method" : PUT, "URI" : /es/.*
Detailspanel verbergen. Klicken Sie auf "Add Entry" Taste, und geben Sie die Daten für den vierten Fassade-Eintrag ein: "Config Id" : 1004 (oder jede beliebige eindeutige Id), "Method" : DELETE, "URI" : /es/.*
Detailspanel für den vierten Fassade-Eintrag ausblenden. Überprüfen Sie jetzt die Daten für alle 4 Einträge. Die sollen wie auf dem Bild unten aussehen:
Wenn Sie irgendwo Fehler gefunden haben, klicken Sie auf der jeweiligen Zeile um Details-Panel sichtbar zu machen, und beheben Sie die Daten. Klicken Sie nun auf "Save Modifications" um die neuen Fassade-Einträge zu speichern.
"Destinations"-Reiter wählen und auf "Add Entry" Knopf drücken. Geben Sie die Daten wie auf dem Bild unten ein: "Destination Id" : 1001 (oder irgendeine eindeutige ID), "Protocol" : HTTP, "Method" : GET, "Destination Expression" : 'http://192.168.2.116:9200/'+property['http.url'].substring(4)+(property['http.queryString']!='' ? '?'+property['http.queryString'] : '') (IP-Adresse der Maschine verwenden, wo Message-Gateway installiert ist)
Klicken Sie auf der hinzugefügten Zeile um Detailspanel zu verbergen. Klicken Sie auf "Add Entry" Taste erneut, und geben Sie die Daten für das zweite Ziel ein: "Destination Id" : 1002 (oder jede beliebige eindeutige Id), "Protocol" : HTTP, "Method" : POST, "Destination Expression" : 'http://192.168.2.116:9200/'+property['http.url'].substring(4)+(property['http.queryString']!='' ? '?'+property['http.queryString'] : '')
Detailspanel verbergen. Klicken Sie auf "Add Entry" Taste, und geben Sie die Daten für das dritte Ziel ein: "Destination Id" : 1003 (oder jede beliebige eindeutige Id), "Protocol" : HTTP, "Method" : PUT, "Destination Expression" : 'http://192.168.2.116:9200/'+property['http.url'].substring(4)+(property['http.queryString']!='' ? '?'+property['http.queryString'] : '')
Detailspanel verbergen. Klicken Sie auf "Add Entry" Taste, und geben Sie die Daten für das vierte Ziel ein: "Destination Id" : 1004 (oder jede beliebige eindeutige Id), "Protocol" : HTTP, "Method" : DELETE, "Destination Expression" : 'http://192.168.2.116:9200/'+property['http.url'].substring(4)+(property['http.queryString']!='' ? '?'+property['http.queryString'] : '')
Detailspanel für das vierte Ziel ausblenden. Überprüfen Sie jetzt die Daten für alle 4 Ziele. Die sollen wie auf dem Bild unten aussehen:
Lassen Sie uns erklären, wie dieser lange Ausdruck für die Ziele sich zusammensetzt.
'http://192.168.2.116:9200/' + property['http.url'].substring(4) + (property['http.queryString'] != '' ? '?' + property['http.queryString'] : '' )
1) 'http://192.168.2.116:9200/' - ist ein Literal-Wert für die HTTP-Adresse des Elasticsearch. Achten Sie darauf, IP-Adresse entsprechend anzupassen. Port ist 9200 standardmäßig nach der Insallation von Flink-ESB Message-Gateway.
2) property['http.url'].substring(4) ist die URI des empfangen Requests, wo die ersten 4 Zeichen entfernt sind. Zum Beispiel, wenn Sie Anfrage an die URL https://localhost:8081/es/test/some/function schicken, fügt Flink-ESB jeder entgegengenommenen Nachricht eine Eigenschaft hinzu, die den Namen "http.url" und den Wert "/es/test/some/function" hat. substring(4) entfernt "/es/" aus der URI. Warum "/es/"? Weil wir die Fassade-Einträge im Schritt 1 mit der URI "/es/.*" konfiguriert haben.
3) (property['http.queryString'] != '' ? '?' + property['http.queryString'] : '' ) überprüft, ob die Eigenschaft mit dem Namen "http.queryString" nicht leere Zeichenfolge ist. Ist dies der Fall: verkettet es dann '?' mit dem Wert der Eigenschaft "http.queryString", ansonsten gibt dieser Ausdruck leere Zeichenfolge '' aus. Woher kommt dieser Eigenschaft "http.queryString"? Bei jeder Anfrage an die URL http://localhost:8081/es/test/some/function?param1=value1¶m2=value2, der Teil nach dem '?' Zeichen heisst "query string". Flink-ESB fügt jeder über HTTP entgegengenommen Anfrage eine Eiganschaft mit dem Namen "http.queryString" hinzu. So wird dieser Ausdruck verwendet, um den Wert des Query-String aus der Abfrage zu greifen, und es unverändert an das Ziel zu senden.
Andersherum, wenn sie die Dienst erreichen möchten, welche auf der Elasticsearch-Adresse http://192.168.2.116:9200/_cat/nodes verfügbar ist, so müssen Sie die Abfrage an Flink-ESB Message-Gateway an diese URL schicken: https://localhost:8081/es/_cat/nodes.
Klicken Sie nun auf "Save Modifications" um die Ziele zu speichern.
Klicken Sie auf "Gateway Config" -Reiter und klichen Sie danach auf der Zeile mit der "Config Id" 1001 (oder was auch immer Id Sie den GET-Fassade-Eintrag zugewiesen haben) um Detailspanel sichtbar zu machen.
Klicken Sie auf "Edit Destination Rules" -Link, wählen Sie "Show all rules" -Checkbox aus, und wählen Sie ein Kontrollkästchen auf der linken Seite des Ziel mit Id 1001 (oder was auch immer Id Sie das Ziel zugewiesen haben). Dies sollte die Farbe der Zeile von grau zu schwarz ändern, wie auf dem Bild unten:
Klicken Sie auf Fassade Eingabezeile um Detailspanel zu verbergen. Nun wiederholen Sie den Vorgang für die anderen drei Fassade-Einträge. Stellen Sie sicher POST-Ziel den POST-Eintrag zuzuweisen, PUT den PUT, und DELETE den DELETE. Überprüfen Sie die Daten erneut, und stellen Sie sicher, dass sie wie auf dem Bild unten aussehen:
Wenn Fehler gefunden, klicken Sie auf Fassade-Eingabezeile um Details-Panel zu enthüllen, und beheben sie die Daten. Drücken Sie nun auf "Save Modifications", um die Änderungen zu speichern.
Klicken Sie auf "Gateway Config" Registerkarte, wenn Sie noch nicht da sind, und klicken Sie auf "Trigger Instances" -Taste. Bestätigen Sie die Meldung mit der Taste "OK".
Öffnen Sie den Browser und geben Sie die URL http://localhost:8081/es/_cat ein (oder was auch immer IP und Port, die Ihr Message-Gateway hat). Sie sollten die Antwort wie auf dem Bild unten bekommen:
Machen Sie weiter und versuchen Sie die anderen URIs aus dem Bild von oben. Vergessen Sie aber nicht /es/ an die URIs forne anzuhängen.
Öffnen Sie Flink-ESB Admin-Konsole im Browser. Standard-URL: https://localhost:8443/console/star. Melden Sie sich mit Ihrem Konto/Passwort an (Standard nach der Installation: admin/admin).
Klicken Sie auf "Applications Overview" um es zu erweitern. Nun sollten Sie einen Instanznamen sehen. Klicken Sie auf Dreieck auf der linken Seite des Instanznamen um es zu erweitern. Sie sollten jetzt die auf dieser Instanz installierten Anwendungen sehen. Klicken Sie auf das Dreieck neben "Message Gateway" Anwendung und klicken Sie auf "Routes".
Nun sollten Sie die Routen sehen. Klicken Sie auf "from-HTTP-1001" Route, wobei "1001" - Id des Fassade-Eintrags ist. Jetzt sollten Sie folgendes sehen:
Klicken Sie auf "Events" Reiter auf der rechten Seite direkt unterhalb der grafischen Darstellung der Route.
Kopieren Sie "msgId" des letzten Ereignisses wie Abbildung unten zeigt:
Jetzt können Sie Elasticsearch-Dienst mit einem langen Query-String versuchen. Geben Sie folgende URL im Browser ein: https://localhost:8081/es/flink_message_*/_search?q=msgid:5d1a97d3-866e-4aaa-b4b3-6750e994fee4&size=100&sort=starttime:desc&pretty
Die Ausgabe sollte die Liste alle Prozessierungsereignisse für die angegebene "msgId" darstellen, sortiert in umgekehrter Reihenfolge:
Jetzt versuchen Sie die gleiche Suchabfrage mit Elasticsearch REST-API HTTP POST auszuführen. Dazu können Sie entweder curl, oder einige Browser-Plugins, oder SoapUI, oder ein anderes geeignetes Werkzeug benutzen.
Der Befehl in curl sieht wie folgt aus:
curl -k -XPOST 'https://localhost:8081/es/flink_*/_search?pretty' -d '{ "size" : 100, "from" : 0, "query" : { "filtered" : { "filter" : { "bool" : { "must" : [ { "term" : {"appid" : "message-gateway"}} ,{ "term" : {"msgid" : "5d1a97d3-866e-4aaa-b4b3-6750e994fee4"}} ] } } } }, "sort" : [ {"endtime" : {"order" : "desc"}} ], "_source": { "include": [ "*" ] } }'
Mit Brwoser-Plugin, SoapUI oder irgendwelchen anderen Werkzeugen, stellen Sie nur sicher, dass JSON-Nachricht (auf dem Bild im blau) als Message-Body verwendet wird, und die HTTP POST Anfrage soll an die URL geschickt, die in der braunen Farbe dargestellt ist.
Klicken Sie auf "Gateway Config" -Reiter und klichen Sie danach auf der Zeile mit der "Config Id" 1002 um Detailspanel sichtbar zu machen. Im "Roles" -Textfeld geben Sie admin,user ein, so wie auf dem Bild unten:
Klicken Sie auf "Save Modifications" und danach auf "Trigger Instances".
Wenn Sie nun HTTP POST wiederholen, erhalten Sie "Error 401 Unauthorized". Damit es wieder funktioniert, müssen Sie Benutzername/Passwort mitgeben, dabei soll der Benutzer Mitglied der Rolle "admin" oder "user" sein. Standardmäßig nach der Installation von Flink-ESB Message-Gateway eine Datei basierte Login aktiviert ist, wo alle Benutzer, Passwörter und die Rollen in der Datei mit dem Namen etc/realm.properties gespeichert sind (Dateipfad ist relativ zum Installationsverzeichnis vom Flink-ESB Message-Gateway).
Verwenden Sie default Username/Passwort: admin/admin. Ändern Sie curl Befehl wie folgt:
curl -k -XPOST --digest --user admin:admin 'https://localhost:8081/es/flink_*/_search?pretty' -d '{ "size" : 100, "from" : 0, "query" : { "filtered" : { "filter" : { "bool" : { "must" : [ { "term" : {"appid" : "message-gateway"}} ,{ "term" : {"msgid" : "5d1a97d3-866e-4aaa-b4b3-6750e994fee4"}} ] } } } }, "sort" : [ {"endtime" : {"order" : "desc"}} ], "_source": { "include": [ "*" ] } }'
Jetzt sollten Sie die richtige Ausgabe des gesicherten Dienstes erhalten, nachdem Sie von Message-Gateway authentifiziert worden sind.
Wenn Sie nur bestimmte Dienste schützen möchten, zum Beispiel nicht alle HTTP GET Dienste, sondern nur ein Teil von HTTP GET, dann müssen Sie einen anderen Fassade-Eintrag für diese URI (oder den regulären Ausdrück für URI) erstellen, die "Role" spezifizieren, und das Ziel zuweisen:
Klicken Sie auf "Save Modifications" und danach auf "Trigger Instances".
Nun stehen alle HTTP-GET-Dienste nach wie vor ohne Authentifizierung zur Verfügung, außer /es/_cat/health. Um diesen Dienst zu nutzen, müssen Sie sich authentifizieren.