API-gateways gebruiken in microservices

Azure Application Gateway
Azure API Management

In een microservicesarchitectuur kan een client communiceren met meer dan één front-endservice. Gezien dit feit, hoe weet een client welke eindpunten moeten worden aangeroepen? Wat gebeurt er wanneer nieuwe services worden geïntroduceerd of bestaande services worden geherstructureerd? Hoe verwerken services SSL-beëindiging, -verificatie en andere problemen? Een API-gateway kan helpen deze uitdagingen aan te pakken.

Diagram of an API gateway

Een Visio-bestand van deze architectuur downloaden.

Wat is een API-gateway?

Een API-gateway bevindt zich tussen clients en services. Het fungeert als een omgekeerde proxy, routeringsaanvragen van clients naar services. Het kan ook verschillende kruislingse taken uitvoeren, zoals verificatie, SSL-beëindiging en frequentiebeperking. Als u geen gateway implementeert, moeten clients aanvragen rechtstreeks verzenden naar front-endservices. Er zijn echter enkele mogelijke problemen met het rechtstreeks beschikbaar maken van services aan clients:

  • Dit kan leiden tot complexe clientcode. De client moet meerdere eindpunten bijhouden en fouten op een flexibele manier afhandelen.
  • Er wordt een koppeling gemaakt tussen de client en de back-end. De client moet weten hoe de afzonderlijke services worden uitgesplitsd. Dat maakt het moeilijker om de client te onderhouden en ook om services te herstructureren.
  • Voor één bewerking zijn mogelijk aanroepen naar meerdere services vereist. Dit kan leiden tot meerdere netwerkrondes tussen de client en de server, waardoor aanzienlijke latentie wordt toegevoegd.
  • Elke openbare service moet problemen afhandelen, zoals verificatie, SSL en clientsnelheidsbeperking.
  • Services moeten een clientvriendelijk protocol beschikbaar maken, zoals HTTP of WebSocket. Dit beperkt de keuze van communicatieprotocollen.
  • Services met openbare eindpunten zijn een potentieel kwetsbaarheid voor aanvallen en moeten worden beperkt.

Een gateway helpt bij het oplossen van deze problemen door clients los te koppelen van services. Gateways kunnen een aantal verschillende functies uitvoeren en u hebt ze mogelijk niet allemaal nodig. De functies kunnen worden gegroepeerd in de volgende ontwerppatronen:

Gatewayroutering. Gebruik de gateway als een omgekeerde proxy om aanvragen naar een of meer back-endservices te routeren met behulp van laag 7-routering. De gateway biedt één eindpunt voor clients en helpt om clients los te koppelen van services.

Gatewayaggregatie. Gebruik de gateway om meerdere afzonderlijke aanvragen samen te voegen in één aanvraag. Dit patroon is van toepassing wanneer voor één bewerking aanroepen naar meerdere back-endservices zijn vereist. De client verzendt één aanvraag naar de gateway. De gateway verzendt aanvragen naar de verschillende back-endservices en voegt vervolgens de resultaten samen en stuurt ze terug naar de client. Dit helpt om de chattiness tussen de client en de back-end te verminderen.

Offloading van gateway. Gebruik de gateway om functionaliteit van afzonderlijke services naar de gateway te offloaden, met name om verschillende problemen. Het kan handig zijn om deze functies op één plaats samen te voegen, in plaats van elke service verantwoordelijk te maken voor de implementatie ervan. Dit geldt met name voor functies waarvoor gespecialiseerde vaardigheden nodig zijn om correct te implementeren, zoals verificatie en autorisatie.

Hier volgen enkele voorbeelden van functionaliteit die kunnen worden offload naar een gateway:

  • SSL-beëindiging
  • Verificatie
  • IP-acceptatielijst of blokkeringslijst
  • Clientsnelheidsbeperking (beperking)
  • Logboekregistratie en bewaking
  • Antwoordcaching
  • Web Application Firewall
  • GZIP-compressie
  • Statische inhoud onderhouden

Een gatewaytechnologie kiezen

Hier volgen enkele opties voor het implementeren van een API-gateway in uw toepassing.

  • Omgekeerde proxyserver. Nginx en HAProxy zijn populaire reverse proxy-servers die ondersteuning bieden voor functies zoals taakverdeling, SSL en laag 7-routering. Ze zijn beide gratis, opensource-producten, met betaalde edities die extra functies en ondersteuningsopties bieden. Nginx en HAProxy zijn beide volwassen producten met rijke functiesets en hoge prestaties. U kunt ze uitbreiden met modules van derden of door aangepaste scripts te schrijven in Lua. Nginx ondersteunt ook een op JavaScript gebaseerde scriptmodule, aangeduid als NGINX JavaScript. Deze module heeft formeel de naam nginScript gekregen.

  • Service mesh-ingangscontroller. Als u een service-mesh zoals Linkerd of Istio gebruikt, moet u rekening houden met de functies die worden geleverd door de ingangscontroller voor die service-mesh. De Istio-ingangscontroller ondersteunt bijvoorbeeld laag 7-routering, HTTP-omleidingen, nieuwe pogingen en andere functies.

  • Azure-toepassing Gateway. Application Gateway is een beheerde taakverdelingsservice die laag-7-routering en SSL-beëindiging kan uitvoeren. Het biedt ook een Web Application Firewall (WAF).

  • Azure Front Door is het moderne CDN (Content Delivery Network) van Microsoft dat snelle, betrouwbare en veilige toegang biedt tussen uw gebruikers en de statische en dynamische webinhoud van uw toepassingen over de hele wereld. Azure Front Door levert uw inhoud met behulp van het wereldwijde edge-netwerk van Microsoft met honderden wereldwijde en lokale aanwezigheidspunten (PoPs) verspreid over de hele wereld, dicht bij uw zakelijke en consumentengebruikers.

  • Azure API Management. API Management is een kant-en-klare oplossing voor het publiceren van API's naar externe en interne klanten. Het biedt functies die handig zijn voor het beheren van een openbare API, waaronder snelheidsbeperking, IP-beperkingen en verificatie met behulp van Microsoft Entra ID of andere id-providers. API Management voert geen taakverdeling uit, dus deze moet worden gebruikt in combinatie met een load balancer zoals Application Gateway of een omgekeerde proxy. Zie API Management integreren in een intern VNet met Application Gateway voor meer informatie over het gebruik van API Management met Application Gateway.

Houd bij het kiezen van een gatewaytechnologie rekening met het volgende:

Functies. De opties die boven alle ondersteuningslaag 7-routering worden vermeld, maar ondersteuning voor andere functies varieert. Afhankelijk van de functies die u nodig hebt, kunt u meer dan één gateway implementeren.

Installatie. Azure-toepassing Gateway en API Management zijn beheerde services. Nginx en HAProxy worden doorgaans uitgevoerd in containers in het cluster, maar kunnen ook worden geïmplementeerd op toegewezen VM's buiten het cluster. Hiermee wordt de gateway geïsoleerd van de rest van de workload, maar er is een hogere beheeroverhead nodig.

Beheer. Wanneer services worden bijgewerkt of nieuwe services worden toegevoegd, moeten de regels voor gatewayroutering mogelijk worden bijgewerkt. Bedenk hoe dit proces wordt beheerd. Vergelijkbare overwegingen zijn van toepassing op het beheren van SSL-certificaten, IP-acceptatielijsten en andere aspecten van de configuratie.

Nginx of HAProxy implementeren in Kubernetes

U kunt Nginx of HAProxy implementeren in Kubernetes als een ReplicaSet of DaemonSet waarmee de Nginx- of HAProxy-containerinstallatiekopieën worden opgegeven. Gebruik een ConfigMap om het configuratiebestand voor de proxy op te slaan en koppel de ConfigMap als een volume. Maak een service van het type LoadBalancer om de gateway beschikbaar te maken via een Azure Load Balancer.

Een alternatief is het maken van een ingangscontroller. Een toegangsbeheerobjectcontroller is een Kubernetes-resource waarmee een load balancer of omgekeerde proxyserver wordt geïmplementeerd. Er bestaan verschillende implementaties, waaronder Nginx en HAProxy. Een afzonderlijke resource met de naam Inkomend verkeer definieert instellingen voor de ingangscontroller, zoals routeringsregels en TLS-certificaten. Op die manier hoeft u geen complexe configuratiebestanden te beheren die specifiek zijn voor een bepaalde proxyservertechnologie.

De gateway is een potentieel knelpunt of single point of failure in het systeem, dus implementeer altijd ten minste twee replica's voor hoge beschikbaarheid. Mogelijk moet u de replica's verder uitschalen, afhankelijk van de belasting.

Overweeg ook om de gateway uit te voeren op een toegewezen set knooppunten in het cluster. Voordelen van deze aanpak zijn:

  • Isolatie. Al het binnenkomende verkeer gaat naar een vaste set knooppunten, die kan worden geïsoleerd van back-endservices.

  • Stabiele configuratie. Als de gateway onjuist is geconfigureerd, is de hele toepassing mogelijk niet beschikbaar.

  • Prestaties. U kunt om prestatieredenen een specifieke VM-configuratie voor de gateway gebruiken.

Volgende stappen

In de vorige artikelen zijn de interfaces tussen microservices of tussen microservices en clienttoepassingen bekeken. Deze interfaces behandelen elke service standaard als een ondoorzichtig vak. Microservices mogen met name nooit implementatiedetails weergeven over hoe ze gegevens beheren. Dit heeft gevolgen voor gegevensintegriteit en gegevensconsistentie, die in het volgende artikel zijn besproken.