Der WSO2 API Manager kann sowohl mit Failover Endpunkten als auch mit Load Balanced Endpunkten arbeiten. In diesem Blog werden wir eine API mit dem Failover Endpunkt aus dem API Manager heraus erstellen. Wir verwenden den API Manager 3.2.0.
Einrichten des API-Managers
Die Installation des API-Managers werde ich hier nicht beschreiben. Was Sie installieren müssen, ist natürlich Java. Falls Sie es nicht bereits haben, unterstützt der API Manager 3.2.0 Java 8 und 11, sowohl Oracle als auch OpenJDK. Schauen Sie in die Dokumentation, wenn Sie weitere Informationen wünschen oder benötigen. Nachdem Sie Java_home eingestellt haben, können Sie die Zip-Datei mit dem API Manager herunterladen und entpacken. Das funktioniert sowohl auf Windows als auch auf Linux / Mac OS. Bitte besuchen Sie diesen Blog über die Installation von WSO2-Produkten.
Wiremock
Um die APIs zu mocken, verwende ich für die ausfallbedingte Nutzung WireMock, eine einfache Java-basierte Anwendung. Ich führe sie lokal aus und sie verwendet standardmäßig Mock-APIs auf Port 8080. Für Ihr Setup können Sie es lokal oder auch auf einem Server laufen lassen.
Sie finden in diesem Artikel von meinem Kollegen Dusan Dević eine Anleitung, wie Sie WireMock ausführen können. Darin wird erwähnt, dass ein Mock mithilfe einer Mapping-Datei erstellt werden kann. Für diesen Blog benötigen wir einige Mappings in WireMock. Ich erstelle drei Mock-APIs: api_6, api_7 und api_8.
Im Folgenden sehen Sie den api_6 Mock-Endpunkt (api6.json), der für einen regulären (nicht konfigurierten) Endpunkt zu spät antwortet.
{
"request": {
"method": "GET",
"url": "/api_6"
},
"response": {
"status": 200,
"body": "30 seconds passed so here I am!",
"fixedDelayMilliseconds": 30000,
"headers": {
"Content-Type": "application/json" }
}
}
Dies ist api_7 (api7.json), die ohne Verzögerung antwortet, API 8 ist eine Kopie davon, aber natürlich mit einer anderen url (api_8) und einem anderen Namen (api8.json).
{
"request": {
"method": "GET",
"url": "/api_7"
},
"response": {
"status": 200,
"body": "Here I am API 7. no delay",
"fixedDelayMilliseconds": 0,
"headers": {
"Content-Type": "application/json" }
}
}
Sie können die Antworten der gemockten Endpunkte z. B. mit SoapUI sehen.
Erstellen einer neuen API namens Failover mit API Manager
Wir beginnen mit dem Erstellen einer neuen API namens Failover.
Öffnen Sie den API-Publisher, indem Sie zu https://localhost:9443/publisher gehen. Loggen Sie sich mit dem Admin-Konto ein und wählen Sie die Option design new rest API aus dem Menü im API Publisher.
Füllen Sie die folgenden Details in Bezug auf die API-Definition aus:
Die Details sind:
Name | Failover |
Context | fail |
Version | 1.0 |
Endpoint | http://[your-hostname]:8080/api_6 |
Business plan(s) | Gold |
Wählen Sie „Erstellen“, um die API zu erstellen. Dies ist der Übersichtsbildschirm.
Design-Konfigurationen im API Manager
Im diesem Blog konzentrieren wir uns hauptsächlich auf die technische Einrichtung der Failover-Endpunkte. Es ist wichtig zu wissen, dass das Devportal (früher als Store bekannt) ein Ort ist, an dem Entwickler Ihre APIs finden, ausprobieren und abonnieren können. Wie jeder Store, der etwas anbietet, ist es wichtig, dass Sie auch Zeit auf die nicht-technischen Aspekte verwenden, wie z. B. die Dokumentation (wie man die API verwendet), Tags, um die Auffindbarkeit zu verbessern und ein schönes Bild, das die API hervorhebt. Dies erfolgt auf der Registerkarte Designkonfiguration.
Warum Brauchen Sie Überhaupt Ein API-Management?
Jetzt herunterladenWir haben ein eigenes Logo erstellt. Wenn Sie dieses ebenfalls ändern möchten, drücken Sie auf Designkonfigurationen und laden Sie ein Logo Ihrer Wahl hoch.
Laden Sie das Logo in die API hoch und nehmen Sie die folgenden Änderungen an der Designkonfiguration vor.
Name | failoverlogo |
Description | Failover API |
Publisher Access Control | All |
Designer Portal Visibility | Public |
Tags | Failover |
Betätigen Sie „Save“, um die Änderungen zu speichern.
Wechseln Sie zu Ressourcen und entfernen Sie alle standardmäßig erstellten Platzhalter-Ressourcen, AUSSER GET /*. Normalerweise würden Sie niemals Platzhalter-Ressourcen haben, da diese ein Sicherheitsrisiko darstellen. Eine API-Definition sollte so geschlossen wie möglich sein. Der Einfachheit halber werden wir jedoch die Platzhalter-Ressource zulassen.
Betätigen Sie „Save“, um die Änderungen zu speichern.
Klicken Sie auf dem Übersichtsbildschirm auf die Endpunkte und Sie sehen den folgenden Inhalt:
Klicken Sie bei den Load Balance- und Failover-Konfigurationen auf ‚Not Configured‘.
Wählen Sie Failover als Endpunkttyp und ergänzen Sie 2 Failover-Endpunkte, indem Sie den ursprünglichen Endpunkt (der auf api_6 zeigt) kopieren und api_7 und api_8 als zusätzliche Failover-Endpunkte verwenden, wie in der folgenden Abbildung gezeigt.
Ändern Sie für den ersten Endpunkt (api_6) die erweiterte Konfiguration wie folgt. Fügen Sie die Fehlercodes 101503, 101504, 101505, 101507 hinzu, indem Sie sie in der Dropdown-Liste auswählen.
In der Regel würden Sie dies für alle Endpunkte tun, aber da der api_6 der einzige ist, der spät antwortet, genügt dies. Um das Ganze zu beschleunigen, habe ich den Connection Timeout auf 5000 ms gesetzt.
Speichern Sie, um die Änderungen zu speichern.
Die API in der Lebenszyklusdefinition veröffentlichen und zum Devportal gehen, um die API zu sehen. Melden Sie sich bei der API an, erzeugen Sie ein Token, kopieren Sie es und probieren Sie die API mit der Soap-Oberfläche aus.
SoapUI
Erstellen Sie in SoapUI ein neues REST-Projekt basierend auf der URL https://localhost:8243/fail/1.0. Die Authentifizierung muss auf Oauth 2.0 eingestellt und das generierte Access Token in das Feld Access Token in Soap UI kopiert werden. Sie können jedoch auch so konfigurieren, dass das Token in Soap UI generiert wird. Wir gehen nicht ins Detail, sondern sagen Ihnen nur, dass Sie in diesem Fall auf die Schaltfläche „Get Token“ im Fenster „Authorization“ klicken und die erforderlichen Details eingeben müssen. Diese Informationen finden Sie im Devportal.
Nach einiger Zeit werden Sie eine Antwort erhalten. Durch die Failover-Konfiguration im API-Manager sollten Sie die Antwort des zweiten Endpunkts, api_7, in unserer Liste der Endpunkte sehen.
Sie können auf der Konsole sehen, was passiert ist.
[2021-04-26 12:36:04,889] INFO - EndpointContext Endpoint : failover--v1.0_APIproductionEndpoint_0 with address http://localhost:8080/api_6 has been marked for SUSPENSION, but no further retries remain. Thus it will be SUSPENDED.
[2021-04-26 12:36:04,893] WARN - EndpointContext Suspending endpoint : failover--v1.0_APIproductionEndpoint_0 with address http://localhost:8080/api_6 - current suspend duration is : 100ms - Next retry after : Mon Apr 26 12:36:04 CEST 2021
[2021-04-26 12:36:04,901] WARN - FailoverEndpoint Endpoint [failover--v1.0_APIproductionEndpoint] Detect a Failure in a child endpoint : Endpoint [failover--v1.0_APIproductionEndpoint_0]
[2021-04-26 12:36:04,919] WARN - TimeoutHandler Expiring message ID : urn:uuid:1609bac3-228b-4698-b78f-430e778c2fe2; dropping message after ENDPOINT_TIMEOUT of : 5 seconds for Endpoint [failover--v1.0_APIproductionEndpoint_1], URI : http://localhost:8080/api_6, Received through API : admin--failover:v1.0
[2021-04-26 12:36:09,039] WARN - SynapseCallbackReceiver Synapse received a response for the request with message Id : urn:uuid:1609bac3-228b-4698-b78f-430e778c2fe2 and correlation_id : null But a callback is not registered (anymore) to process this response