fb
API Management 5 minuten

Hoe maak je een API met Failover endpoints?

Geschreven voor API Manager 3.X.0

Rob Blaauboer
Rob Blaauboer
Integration Consultant & WSO2 Trainer
Create an API with Failover Endpoints
Scroll

De WSO2 API Manager biedt naast de mogelijkheid om met load balanced endpoints te werken ook een optie om failover endpoints te gebruiken. In deze blog gaan we in de API Manager een API met Failover endpoints maken. Daarvoor gebruiken we API Manager 3.2.0.

De API Manager installeren

Ik ga hier niet uitgebreid in op de installatie van de API Manager. In het kort is dit wat je nodig hebt qua installatie: Allereerst Java, als je dat nog niet hebt, dan kun je kiezen tussen Java 8 en 11, omdat beide ondersteund worden door API Manager 3.2.0, zowel van Oracle als OpenJDK. Neem een kijkje naar de documentatie als je meer wilt weten of meer achtergrondinformatie nodig hebt. Na het installeren van Java_home kun je het zip-bestand met de API Manager downloaden en uitpakken. Dit werkt zowel op Windows als Linux / Mac OS. Lees deze deze blog over hoe je WSO2-producten kunt installeren.

Wiremock

Om een schijn API te maken (de mock API) voor de failover, gebruik ik WireMock. Dat is een simpele java-applicatie die ik lokaal run en die deployment van de mock API’s standaard via poort 8080 uitvoert. Voor jouw installatie kun je het lokaal laten runnen of op een server.

Uitgebreidere instructies voor de installatie en het runnen van WireMock vindt je in artikel van mijn collega Dušan Dević. Daar staat beschreven dat een mock gecreëerd kan worden door een mapping bestand te gebruiken. Wij hebben hier een aantal mappings in WireMock nodig, daarom maak ik drie mock API’s: api_6, api_7 en api_8.

Hieronder staat het api_6 mock-endpoint (api6.json) die te laat reageert voor een normaal (niet geconfigureerd) eindpunt.

{
    "request": {
        "method": "GET",
        "url": "/api_6"
    },
    "response": {
        "status": 200,
        "body": "30 seconds passed so here I am!",
        "fixedDelayMilliseconds": 30000, 
        "headers": {
            "Content-Type": "application/json" }
    }
}

Dit is api_7 (api7.json) die zonder vertraging reageert en API 8 is een identieke kopie hiervan, maar natuurlijk met een andere url (api_8) en naam (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" }
    }
}

Je kunt de respons van de mocked endpoints zien met bijvoorbeeld SoapUI. 

API Failover endpoints 1

Een nieuwe API genaamd ‘Failover’ maken met API Manager

Laten we nu beginnen met het maken van een nieuwe API die we ‘Failover’ noemen. 

Open de API Publisher door naar https://localhost:9443/publisher te gaan. Log in op het admin account en kies voor de optie ‘design new rest API’ in het menu in de API publisher.

API Failover endpoints 2

Vul de volgende gegevens in voor de API definitie: 

API Failover endpoints 3

De gegevens zijn:

NameFailover
Contextfail
Version1.0
Endpointhttp://[your-hostname]:8080/api_6
Business plan(s)Gold

Klik op ‘create’ om de API te maken. Dit is het overzichtsscherm.

Design configuraties in API Manager

In deze blog richten we ons vooral op de technische installatie van de failover eindpunten. Het is goed om te bedenken dat het Devportal (voorheen was dat de Store) de plek is waar developers je API’s kunnen vinden, uitproberen en erop kunnen abonneren. Zoals iedere winkel die iets aanbiedt, is het belangrijk om tijd te besteden aan de niet technische zaken zoals documentatie (hoe de API te gebruiken is), tags om vindbaarheid te vergroten en een mooie afbeelding waardoor de API opvalt. Dit doe je allemaal onder het tabblad Design Configuration. 

Ik heb een speciaal logo geüpload. Als jij ook je logo zou willen veranderen, klik dan op ‘design configurations’ en upload jouw logo.

API Failover endpoints 4

Upload het logo naar de API en voer de volgende veranderingen door in de design configuration.

API Failover endpoints 5
Namefailoverlogo
DescriptionFailover API
Publisher Access ControlAll
Designer Portal VisibilityPublic
TagsFailover

Klik op ‘Save’ om de wijzigingen op te slaan. 

Ga nu naar ‘resources’ en verwijder alle wildcard resources die standaard aangemaakt zijn, BEHALVE DE GET /*. Normaal wil je geen wildcard resources hebben, omdat ze een veiligheidsrisico vormen. Een API definitie hoort juist zo gesloten mogelijk te zijn. Maar om het kort te houden, staan we hier een wildcard resource toe.

API Failover endpoints 6

Klik op ‘Save’ om de wijzigingen op te slaan. 

Op het overzichtscherm klik je op de eindpunten en zie je het volgende:

API Failover endpoints 7

Klik op ‘Not Configured’ bij de Load Balance en Failover Configurations.

API Failover endpoints 8

Kies voor ‘Failover’ als endpoint type en voeg 2 failover eindpunten toe door het originele eindpunt te kopiëren (verwijzend naar api_6) en gebruik api_7 en api_8 als extra failover eindpunten zoals in het onderstaande screenshot te zien is.

API Failover endpoints 9

Voor het eerste eindpunt (api_6) veranderen we de geavanceerde configuratie als volgt. Voeg de foutcodes 101503, 101504, 101505, 101507 toe door ze te selecteren in het dropdown menu. 

API Failover endpoints 10

Normaliter zouden we dit doen voor alle eindpunten, maar omdat api_6 het enige eindpunt is dat laat reageert, is dit voldoende. Om het proces te versnellen heb ik de Connection Timeout op 5000 ms gezet. 

Klik op ‘Save to store’ om de wijzigingen op te slaan. 

API Failover endpoints 11

Publiceer de API in de lifecycle definition en ga naar het Devportal om die te kunnen zien API. Abonneer op de API, genereer een token, kopieer dat token en probeer de API uit met Soap UI.

API Failover endpoints 12

SoapUI

In SoapUI creëer je een nieuw REST-project op basis van de URL https://localhost:8243/fail/1.0. De authenticatie zal ingesteld moeten worden op Oauth 2.0 en het gegenereerde Access Token moet naar het Access Token veld in Soap UI gekopieerd worden. Je kunt het echter ook zo configureren dat het een token genereert in Soap UI. We gaan hier niet in op de details, behalve dat je in dat geval op de ‘Get Token’ button kunt klikken in het Authorizationscherm en daar de gevraagde gegevens kunt invullen. De informatie daarvoor kun je vinden in het Devportal.

API Failover endpoints 13

Even later krijg je een reactie. Vanwege de failover configuratie in de API Manager zou je de respons van het tweede eindpunt, api_7, moeten zien in je lijst met eindpunten.

API Failover endpoints 14

Op de console kun je aflezen wat er gebeurde.

[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