3.16

View in English

3.16 API-gateways en service mesh

Overzicht en motivatie

Zodra je één programma in veel services splitst, verschijnt een nieuwe vraag: wie gaat over het verkeer tussen ze, en over het verkeer dat van buiten binnenkomt? Je kunt die vraag slecht beantwoorden door dezelfde zorgen (authenticatie, herhalingen, time-outs, ratelimieten, logging) met de hand in elke service te verspreiden, of je kunt haar goed beantwoorden door die zorgen naar een gedeelde laag te duwen die elke service gratis erft. Dit hoofdstuk gaat over twee van zulke lagen. Een API-gateway zit aan de voordeur en beheert het verkeer dat van clients binnenkomt. Een service mesh zit tussen je services en beheert het verkeer dat ertussen stroomt. Ze lossen verwante problemen op verschillende plekken op, en de twee verwarren is een gangbare en dure fout.

De branche benoemt de twee richtingen van verkeer met een kompasmetafoor. Noord-zuidverkeer is het verkeer dat de grens van je systeem overschrijdt: een mobiele app, een browser of een partner die binnenbelt. Oost-westverkeer is het verkeer dat binnen je systeem blijft: service A die service B aanroept die service C aanroept om één verzoek te vervullen. Een API-gateway is de specialist voor noord-zuid. Een service mesh is de specialist voor oost-west. Dat onderscheid scherp houden is het nuttigste idee in dit hoofdstuk, omdat het vertelt welk gereedschap welk beleid bezit en voorkomt dat je hetzelfde werk tweemaal doet.

Voor grote teams zijn deze lagen hoe je beleid eenmaal afdwingt in plaats van honderd keer. Wanneer authenticatie, versleuteling tijdens transport en ratelimiting in een gedeelde laag leven, bereikt een beveiligingsfix elke service op de dag dat je de laag deployt, in plaats van op honderd backlogs te wachten. In omgevingen van onderneming en overheid is die centralisatie vaak het punt: auditors willen één enkele, aantoonbare plek waar toegang wordt gecontroleerd en verkeer wordt versleuteld, en een gedeelde gateway of mesh geeft hen precies dat handhavingspunt voor beleid. Dit hoofdstuk bouwt voort op de architectuurstijlen van hoofdstuk 3.2, de werkelijkheid van gedistribueerde systemen van hoofdstuk 3.3 en de netwerkfundamenten van hoofdstuk 3.13, en zet ze om in concrete richtlijnen over wie je verkeer afhandelt.

Kernprincipes

  • Scheid noord-zuid (gateway) van oost-west (mesh). Laat elk zijn richting bezitten.
  • Duw dwarsdoorsnijdende zorgen naar een gedeelde laag zodat je ze eenmaal schrijft, niet per service.
  • Neem een service mesh alleen aan wanneer het aantal services het bedraden per service de grotere kost maakt.
  • Definieer één handhavingspunt voor beleid per zorg. Laat gateway en mesh nooit hetzelfde werk doen.
  • Houd services dun: het platform handelt transport af, de service handelt bedrijfslogica af.
  • Geef de voorkeur aan op identiteit gebaseerd, zero-trustnetwerken boven vertrouwen op basis van netwerklocatie.
  • Koop de operationele complexiteit van een mesh met open ogen en meet of ze loont.

Aanbevelingen

Begrijp wat een API-gateway doet

Een API-gateway is één enkel toegangspunt dat voor je services zit en elk verzoek van de buitenwereld bemiddelt. In zijn eenvoudigste vorm is het een slimme reverse proxy (een server die clientverzoeken ontvangt en naar de juiste backend doorstuurt), maar een gateway verdient zijn naam door veel meer te doen dan doorsturen. Hij routeert elk verzoek naar de juiste service op basis van pad, host of headers. Hij authenticeert de aanroeper (verifieert wie ze zijn) en autoriseert het verzoek (controleert wat ze mogen), zodat een service erachter kan vertrouwen dat een verzoek de voordeur al passeerde. Hij dwingt ratelimiting (verzoeken per client begrenzen over de tijd) en quota (totaal gebruik begrenzen over een langer venster) af zodat één luidruchtige of misbruikende client de rest niet kan uithongeren.

Een gateway hervormt ook verkeer. Verzoektransformatie herschrijft headers, vertaalt tussen protocollen of past het formaat van een oude client aan op de verwachtingen van een nieuwe service. API-compositie laat de gateway één inkomend verzoek uitwaaieren naar verschillende services en hun antwoorden aan elkaar naaien, zodat een client één aanroep doet in plaats van zes. Versieondersteuning laat je v1 en v2 van een API naast elkaar draaien en elke client naar de versie routeren die hij verwacht, wat je ruimte koopt om te evolueren zonder iemand te breken. Deze zorgen aan de edge concentreren houdt je services gericht op bedrijfslogica en geeft je één plek om alles wat binnenkomt te observeren, beveiligen en af te knijpen. Het ontwerp van de API’s waarvoor de gateway staat is het onderwerp van hoofdstuk 2.3, en de identiteitscontroles die hij uitvoert putten uit hoofdstuk 4.7.

Gebruik het backend-for-frontend-patroon voor uiteenlopende clients

Eén algemene API bedient vaak tegelijk een webapp, een mobiele app en partnerintegraties, en bedient ze allemaal een beetje slecht. De mobiele client wil kleine payloads en weinig retourreizen omdat bandbreedte en batterij schaars zijn. De webclient kan meer praatzieke, rijkere antwoorden aan. De partner wil een stabiel contract dat hem nooit verrast. Het backend for frontend-patroon (BFF) lost deze spanning op door elke klasse client zijn eigen dunne gateway te geven, afgestemd op de behoeften van die client, voor de gedeelde services erachter.

Een BFF is een gateway met een smaller publiek. De mobiele BFF componeert en snoeit antwoorden zodat de app één efficiënte aanroep doet. De web-BFF legt een volledigere vorm bloot. De partner-BFF houdt een langzaam bewegend, zorgvuldig geversioneerd contract. Elk team kan zijn eigen BFF laten evolueren zonder op de anderen te wachten, wat vaak de echte winst is, omdat het clientteams van elkaar ontkoppelt. De kosten zijn meer bewegende delen en wat gedupliceerde logica over BFF’s, dus bewaar het patroon voor gevallen waar clientbehoeften werkelijk uiteenlopen. Wanneer elke client hetzelfde wil, is één gateway eenvoudiger en beter.

Begrijp wat een service mesh doet

Een service mesh beheert het oost-westverkeer tussen je services, en doet dat zonder die services te vragen hun code te wijzigen. De klassieke mesh werkt door een sidecarproxy te deployen (een klein proxyproces dat naast elke service-instantie draait en al zijn netwerkverkeer onderschept). Je service denkt rechtstreeks met een andere service te praten. In werkelijkheid praat ze met haar lokale sidecar, die de echte netwerkaanroep afhandelt. Omdat elk verzoek nu door een proxy stroomt die het platform beheerst, kan de mesh gedrag uniform afdwingen over elke service, in elke taal, zonder gedeelde bibliotheek om synchroon te houden.

Wat dwingt hij af? Ten eerste mutual TLS (mTLS), waarbij beide kanten van elke verbinding certificaten presenteren en het verkeer versleutelen, zodat aanroepen tussen services standaard geauthenticeerd en privé zijn. Ten tweede verkeersbeheer: de mesh kan een klein percentage verkeer naar een nieuwe versie verschuiven voor een canary-release, verkeer splitsen op header voor testen of verkeer spiegelen naar een schaduwservice. Ten derde veerkracht: herhalingen, time-outs en circuit breaking (de patronen van hoofdstuk 2.20) toegepast op de platformlaag, geconfigureerd door beleid in plaats van in elke service gecodeerd. Ten vierde observeerbaarheid: omdat elk verzoek door een proxy gaat, zendt de mesh consistente statistieken, logs en gedistribueerde traces uit voor al het verkeer tussen services, wat de observeerbaarheidspraktijken van hoofdstuk 9.2 voedt. De serviceauteur schrijft niets hiervan en krijgt het allemaal.

Ken het sidecarpatroon en de sidecarloze alternatieven

Het sidecarmodel is elegant maar niet gratis. Elke service-instantie draait nu een extra proxycontainer die geheugen en CPU verbruikt, en elke aanroep maakt twee extra netwerkhops (in de lokale sidecar en uit de externe), wat wat latentie toevoegt. Bij een handvol services is die overhead onzichtbaar. Over duizenden pods wordt ze een echte regel in je rekenrekening en je latentiebudget. Die kost heeft een golf van sidecarloze, of proxyloze, aanpakken aangedreven.

Twee richtingen doen ertoe. De ene verplaatst meshfuncties van een sidecar per pod naar een proxy per node, zodat veel services op dezelfde machine één proxy delen in plaats van elk hun eigen te draaien. Dit ruilt wat isolatie voor een grote daling in overhead. De andere, proxyloze aanpak, bedt de logica van de mesh rechtstreeks in de service in via een dunne bibliotheek of de runtime, wat de extra hops volledig wegneemt ten koste van een afhankelijkheid per taal. Een nieuwere ontwikkeling duwt sommige meshfuncties in de kernel van het besturingssysteem met eBPF (een technologie om sandboxed programma’s binnen de Linux-kernel te draaien), wat beleid kan afdwingen en telemetrie kan verzamelen met minder overhead dan een userspaceproxy. Je hoeft vandaag niet op één winnaar in te zetten. Je moet wel weten dat de sidecarbelasting echt is, dat alternatieven bestaan en dat je platformkeuzes je niet mogen uitsluiten van het later aannemen ervan. Deze patronen staan op het fundament van containerorkestratie van hoofdstuk 8.3.

Besluit wanneer een mesh haar complexiteit verdient

Een service mesh is krachtig en werkelijk ingewikkeld om te draaien. Ze voegt een controlevlak toe om te beheren, proxy’s om te upgraden, certificaten om te roteren en een nieuwe laag om te debuggen wanneer een verzoek zoekraakt. Die complexiteit is het waard wanneer je genoeg services hebt dat deze zorgen met de hand bedraden, per service en per taal, meer kost dan de mesh beheren. Het ruwe signaal is schaal en polyglotte diversiteit: tientallen of honderden services, in meerdere talen geschreven, waar een gedeelde bibliotheek voor mTLS en herhalingen een nachtmerrie zou zijn om consistent te houden. Op die schaal betaalt een mesh zichzelf terug in uniformiteit en aantoonbare beveiliging.

De mesh verdient haar complexiteit niet wanneer je een handvol services hebt, één taal of een klein team. Voor een bescheiden systeem kan een goede bibliotheek of een goed framework je mTLS, herhalingen en statistieken geven met veel minder operationele last dan een volledige mesh, en een gewone gateway plus verstandige clientbibliotheken dekt vaak alles wat je nodig hebt. Een mesh aannemen omdat het modieus is, voordat je schaal het eist, is een gangbare manier om een jaar infrastructuur te beheren die een probleem oplost dat je niet hebt. Begin met de gateway, voeg veerkrachtpatronen toe in code of bibliotheken en grijp naar een mesh wanneer het aantal services en talen de aanpak per service de duurdere maakt. Dit is dezelfde discipline “verdient het zijn complexiteit” waar de hoofdstukken over cloud en gedistribueerde systemen (3.11 en 3.3) steeds op terugkomen.

Vermijd dubbele afhandeling waar gateway en mesh overlappen

Gateways en meshes overlappen, en de overlap is waar teams zichzelf pijn doen. Beide kunnen herhalen, beide kunnen time-outs afdwingen, beide kunnen identiteit controleren, beide kunnen telemetrie verzamelen. Als de gateway een verzoek drie keer herhaalt en de mesh het ook drie keer herhaalt bij elke interne hop, kan één clientherhaling uitgroeien tot tientallen backendaanroepen en een kleine hapering in een herhaalstorm veranderen. Als beide lagen een time-out afdwingen en de binnenste langer is dan de buitenste, geeft de buitenste op terwijl de binnenste blijft werken, inspanning verspillend aan een antwoord dat niemand zal lezen.

De oplossing is een heldere arbeidsverdeling, opgeschreven en afgesproken. Wijs elke zorg aan precies één laag toe. De gateway bezit noord-zuidzorgen: authenticatie van eindgebruikers, externe ratelimieten en quota, verzoektransformatie en API-compositie voor clients. De mesh bezit oost-westzorgen: mTLS tussen services, interne herhalingen en circuit breaking en verkeersverschuiving tussen serviceversies. Waar een zorg in beide kan leven, kies één eigenaar en laat de andere laag doorlaten. Configureer herhaalbudgetten en time-outhiërarchieën zodat een buitenste time-out altijd langer is dan het binnenste werk waarop hij wacht. Het doel is dat elk verzoek precies één plek heeft die elke zorg afhandelt, en geen verzoek per ongeluk tweemaal wordt herhaald, geauthenticeerd of gelogd.

Behandel gateway en mesh als handhavingspunten voor beleid voor zero trust

De diepste reden om deze lagen te draaien is beveiligingsarchitectuur. Zero trust is het principe dat geen verzoek wordt vertrouwd vanwege waar het vandaan kwam. Elk verzoek moet zijn identiteit en autorisatie bewijzen, zelfs binnen je eigen netwerk. Het oude model vertrouwde alles wat al binnen de perimeter was, wat betekende dat één gecompromitteerde service vrij kon rondzwerven. Zero trust vervangt vertrouwen op netwerklocatie door op identiteit gebaseerd vertrouwen op elke hop, en gateways en meshes zijn de natuurlijke handhavingspunten waar die identiteit wordt gecontroleerd.

De gateway is het handhavingspunt voor beleid voor externe identiteit: hij verifieert de eindgebruiker of partner voordat iets je services bereikt. De mesh is het handhavingspunt voor beleid voor werklastidentiteit: elke service krijgt een cryptografische identiteit, mTLS bewijst haar bij elke aanroep en beleid bepaalt welke services met welke mogen praten. Samen geven ze je verdediging in de diepte, waarbij een verzoek aan de edge wordt gecontroleerd en opnieuw tussen services, zodat een compromittering van één service de rest geen vrije beweging geeft. In multicluster- en multiregio-deployments kan een mesh dit identiteitsweefsel over clustergrenzen uitbreiden, zodat een service in het ene cluster zich bij een service in een ander authenticeert met dezelfde mTLS-garanties die ze lokaal gebruikt, wat consistent zero-trustnetwerken geeft ook als de voetafdruk zich verspreidt. De identiteitsfundamenten hier sluiten direct aan op hoofdstuk 4.7.

Afwegingen: voor- en nadelen

AanpakVoordelenNadelen
API-gatewayEén plek voor authenticatie, ratelimieten, compositie, versioneringEén knelpunt om te schalen en hoog beschikbaar te houden
Backend for frontendElke client krijgt een op maat gemaakte, onafhankelijk evoluerende APIMeer gateways om te draaien. Logica gedupliceerd over BFF’s
Service mesh (sidecar)Uniforme mTLS, herhalingen, observeerbaarheid zonder codewijzigingProxy-overhead, latentie en een controlevlak om te beheren
Sidecarloze / proxyloze meshLagere overhead en latentie dan sidecars per podMinder volwassen. Zwakkere isolatie of afhankelijkheid per taal
Bibliotheekgebaseerde veerkrachtEenvoudig te draaien. Geen extra infrastructuurDuplicatie per taal. Moeilijk consistent te houden op schaal
Mesh over clustersConsistente zero-trustidentiteit overalAanzienlijke operationele en netwerkcomplexiteit

De centrale spanning is uniformiteit tegenover operationele kosten. Een gedeelde laag koopt je consistentie, aantoonbare beveiliging en beleid dat je eenmaal schrijft, maar het is een echt systeem dat je moet draaien, schalen, beveiligen en debuggen, en het voegt zichzelf in het pad van elk verzoek. Los de spanning op naar schaal en behoefte. Een gateway loont bijna altijd zodra je externe clients hebt, omdat de zorgen die hij centraliseert onvermijdelijk zijn. Een mesh loont later, wanneer het aantal services en talen het bedraden per service het duurdere pad maakt. Onder die drempel geven bibliotheken en een gewone gateway je het grootste deel van het voordeel voor een fractie van de kosten. Erboven is de uniformiteit van de mesh haar gewicht waard. De fout in beide richtingen is aannemen op mode in plaats van behoefte: een mesh te vroeg is een jaar het kaalscheren van een jak, en een mesh te laat overgeslagen is honderd inconsistente, met de hand gerolde implementaties van mTLS.

Vragen om met je team te bespreken

  1. Welke enkele laag bezit elke dwarsdoorsnijdende zorg (authenticatie, herhalingen, time-outs, ratelimiting, versleuteling, telemetrie), en kan iedereen de eigenaar noemen zonder te raden? Dit is de vraag die dubbele afhandeling voorkomt, en de meeste teams hebben haar nooit expliciet beantwoord, wat betekent dat het antwoord per service en per auteur verschilt. Neem een concrete lijst zorgen mee langs de linkerkant en je lagen (clientbibliotheek, gateway, mesh, individuele service) bovenaan, en vul het raster samen in. De plekken waar twee cellen voor één zorg zijn aangevinkt zijn je herhaalstormen en time-outinversies die wachten te gebeuren. De lege rijen zijn de zorgen die niemand afhandelt. De opbrengst is één afgesproken tabel, gepubliceerd waar elk team haar kan zien, die zegt dat precies één laag elke zorg bezit en de anderen doorlaten. Die tabel is meer waard dan enige hoeveelheid gateway- of meshconfiguratie, omdat ze is wat de twee lagen ervan weerhoudt met elkaar te vechten.

  2. Hebben we werkelijk genoeg services en taaldiversiteit om een service mesh te rechtvaardigen, of staan we op het punt een controlevlak te kopen om een probleem op te lossen dat we niet hebben? Een mesh is een serieuze operationele verbintenis, en het eerlijke antwoord voor veel teams is dat een goede bibliotheek plus een gateway hen vandaag beter zou bedienen. Neem het echte aantal van je services mee, het aantal talen waarin ze zijn geschreven en een eerlijke inschatting van hoeveel gedupliceerde netwerklogica je nu werkelijk pijn doet. Neem dan de andere kant mee: wie zal de mesh beheren, haar proxy’s upgraden, haar certificaten roteren en worden gepaged wanneer ze een verzoek verkeerd routeert. Als de pijn van het bedraden per service kleiner is dan de kosten van het draaien van de mesh, heb je je antwoord, en het is te wachten. Als je verdrinkt in inconsistente mTLS- en herhaalcode over tientallen polyglotte services, verdient de mesh haar plek. Het punt is op bewijs te besluiten, niet op hoe een conferentiepraatje de mesh liet lijken.

  3. Waar ligt onze zero-trustgrens vandaag, en wat gebeurt er als één interne service wordt gecompromitteerd? Veel systemen vertrouwen nog alles wat al binnen het netwerk is, wat betekent dat één gecompromitteerde service zich lateraal kan verplaatsen en al het andere kan bereiken, en teams ontdekken dit vaak pas tijdens een incident. Loop eerlijk door de schadezone: als een aanvaller één van je services bezit, wat kan hij aanroepen, wat kan hij lezen en wat stopt hem? Neem je huidige antwoord mee over hoe aanroepen tussen services worden geauthenticeerd en versleuteld, en wees specifiek over welke aanroepen door mTLS zijn beschermd en welke platte vertrouwen zijn op basis van op hetzelfde netwerk zitten. De actie die volgt is een bewust plan voor op identiteit gebaseerde toegang op elke hop, met de gateway die externe identiteit controleert en de mesh of een equivalent die werklastidentiteit controleert, zodat een compromittering wordt beperkt in plaats van catastrofaal. Ook als je nog niet klaar bent een volledige mesh te draaien, is benoemen waar de vertrouwensgrens werkelijk ligt de eerste eerlijke stap.

  4. Als onze API-gatewaylaag nu uitviel, hoeveel van het systeem gaat dan op zwart, en hebben we dat falen getest in plaats van weggedacht? De gateway centraliseert zoveel dat zijn storing alles erachter offline haalt, en grote teams investeren juist te weinig in zijn redundantie omdat hij stil werkt tot hij dat niet meer doet. Weeg de concurrerende trekken: één enkele eenvoudige gateway is makkelijk om over te redeneren en goedkoop te draaien, terwijl een horizontaal geschaalde laag over meerdere zones meer kost en zijn eigen failoverconfiguratie en complexiteit toevoegt. Neem echte getallen mee naar de discussie, inclusief hoeveel instanties er vandaag draaien, over hoeveel beschikbaarheidszones, wat de failovertijd is en wanneer je voor het laatst een game day draaide die de gateway met opzet neerhaalde. Voeg voor platforms van onderneming en overheid met uptimeverplichtingen of wettelijke serviceniveaus de contractuele of regelgevende boete voor een storing toe, want een voordeur zonder redundantie is een beschikbaarheidsrisico dat je stilletjes hebt aanvaard namens elke service en elke burger erachter.

  5. Hebben we de sidecarbelasting gemeten die onze mesh werkelijk rekent, en hebben we een plan voor de sidecarloze en eBPF-alternatieven, of betalen we blind? Op schaal houdt de proxy-overhead per pod in rekenkracht en latentie op onzichtbaar te zijn en wordt een echte regel in het budget, toch draaien veel teams duizenden sidecars zonder ooit de kosten te meten. De spanning is tussen de volwassenheid en isolatie van het sidecarmodel aan de ene kant en de lagere overhead van proxy’s per node, proxyloze bibliotheken of eBPF-aanpakken in de kernel aan de andere, die nieuwer zijn en wat isolatie inruilen of een afhankelijkheid per taal toevoegen. Neem de gemeten cijfers mee: geheugen en CPU verbruikt door proxy’s over de vloot, de toegevoegde staartlatentie per hop en welk deel van je rekenrekening de mesh vertegenwoordigt. Voor een grote onderneming die de mesh over duizenden pods draait, of een overheidsplatform onder budgettoetsing, is dit een uitgavenbeslissing waar toezicht uiteindelijk naar zal vragen, dus de belasting kennen en of je platformkeuzes de goedkopere alternatieven openhouden is basale zorgvuldigheid.

  6. Heeft elke clientklasse werkelijk een eigen backend for frontend nodig, of staan we op het punt logica te dupliceren over gateways voor clients die eigenlijk hetzelfde willen? Het BFF-patroon ontkoppelt clientteams en laat elk een op maat gemaakt contract laten evolueren, maar elke nieuwe BFF is nog een gateway om te draaien, te beveiligen en synchroon te houden, en de gedupliceerde logica over ze heen wordt stilletjes een onderhoudsbelasting. De concurrerende overwegingen zijn teamautonomie en clientspecifieke efficiëntie tegenover de operationele kosten en afdrijving van veel bijna identieke gateways. Neem bewijs mee hoeveel de behoeften van clients werkelijk uiteenlopen: payloadgroottes, aantallen retourreizen, versioneringsritme en hoe vaak de wijziging van de ene client een andere onder één gedeelde gateway had geblokkeerd. In een grote organisatie met veel clientteams, of een overheidsplatform dat tegelijk een publieke webapp, een mobiele app en partnerintegraties bedient, is de eerlijke vraag of de divergentie de proliferatie rechtvaardigt, want een BFF per client die allemaal dezelfde vorm willen is wildgroei waarvoor je jarenlang onderhoud betaalt.

Sectorperspectief

Startup. Lever een API-gateway op en sla de mesh over. Met een handvol services en een piepklein team handelt één gateway authenticatie, ratelimieten en compositie af, terwijl een gedeelde clientbibliotheek je mTLS en herhalingen geeft voor een fractie van de kosten van een controlevlak. Je schaarsste middel is engineeringaandacht, dus een mesh die je niet kunt beheren is een verplichting, geen slotgracht. Houd de gateway redundant genoeg om het sterven van één node te overleven en herzie de mesh pas wanneer het aantal services en de taaldiversiteit de kwestie werkelijk afdwingen.

Kleinbedrijf. Je hebt geen platformteam om een mesh te beheren, dus leun op wat je hostingplatform of gatewayproduct standaard geeft: beheerde TLS, ingebouwde ratelimiting en een gehoste gateway in plaats van een die je zelf patcht. Formuleer de keuze als kopen tegenover bouwen, en koop, omdat een beheerde API-gateway minder kost dan de engineeruren om je eigen te beheren. Behandel interne versleuteling tussen services als functie die je platform biedt, niet als project dat je bemant.

Grote onderneming. Met honderden services over veel teams en talen verdient een mesh haar complexiteit, en het echte werk is governance: één opgeschreven arbeidsverdeling zodat gateway en mesh nooit een zorg dubbel afhandelen, uniforme mTLS en telemetrie en een platformteam dat proxy-upgrades en certificaatrotatie bezit. Auditors willen één aantoonbaar handhavingspunt voor toegang en versleuteling, dus standaardiseer de interface en maak beleid iets wat teams erven in plaats van opnieuw implementeren. Beheer de sidecarbelasting als echte budgetregel en houd sidecarloze opties open zodat je later niet wordt uitgesloten van goedkopere aanpakken.

Overheid. Aanbestedingsregels, transparantie en publieke verantwoording geven de architectuur vorm. Behandel de gateway en mesh als de zero-trustruggengraat die toezichthouders verwachten: elke burger en partner geauthenticeerd aan de voordeur, elke interne aanroep geauthenticeerd en versleuteld door werklastidentiteit en een auditspoor bij elk handhavingspunt dat bewijst waar toegang werd gecontroleerd en waar verkeer werd versleuteld. Geef de voorkeur aan open standaarden en overdraagbare configuratie boven propriëtaire afhankelijkheid die aanbestedingsregels kunnen verbieden, en publiceer waar gepast hoe het platform burgerdata beschermt terwijl die elke grens overschrijdt.

Voorbeelden

Startup. Een startup van twaalf personen draait acht services achter één API-gateway. De gateway handelt al het noord-zuidwerk af: hij authenticeert gebruikers met een tokencontrole, dwingt ratelimieten per abonnement af zodat gebruikers van het gratis niveau het systeem niet kunnen overspoelen en componeert een paar praatzieke endpoints tot enkele mobielvriendelijke aanroepen. Voor oost-westverkeer slaan ze bewust een service mesh over, omdat acht services in twee talen geen controlevlak rechtvaardigen. In plaats daarvan krijgen ze mTLS en herhalingen van een gedeelde clientbibliotheek en het ingebouwde certificaatbeheer van hun platform, en verzamelen ze traces met een lichtgewicht agent. Wanneer ze later een toegewijde mobiele client met strakkere payloadbehoeften toevoegen, introduceren ze een mobiele backend for frontend naast de bestaande webgateway. Ze herzien de meshvraag elk jaar en besluiten steeds, terecht, dat ze de drempel nog niet hebben overschreden waar ze zou lonen.

Grote onderneming. Een multinationale bank draait enkele honderden services over veel teams en talen, en hier verdient een service mesh haar complexiteit. Elke service krijgt standaard een werklastidentiteit en mTLS, zodat al het interne verkeer geauthenticeerd en versleuteld is zonder dat een team cryptocode schrijft, wat zowel de beveiligingsorganisatie als de auditors tevredenstelt die één aantoonbaar handhavingspunt willen. De mesh past uniforme herhalingen, time-outs en circuit breaking toe door beleid, en verschuift verkeer geleidelijk voor canary-releases zodat een slechte deploy één procent van de gebruikers raakt voordat hij ze allemaal raakt. Een laag API-gateways staat voor het externe en partnerverkeer, bezit authenticatie, quota en versionering, met een vaste schriftelijke regel dat interne herhalingen alleen in de mesh leven en externe ratelimieten alleen in de gateways, zodat de twee lagen een verzoek nooit dubbel afhandelen. Consistente telemetrie van elke proxy voedt een centraal observeerbaarheidsplatform waarmee één engineer met bereikbaarheidsdienst een verzoek over tientallen servicehops kan traceren.

Overheid. Een nationale belastingdienst moderniseert een burgergericht indieningsplatform en behandelt de gateway en mesh als de ruggengraat van een zero-trustarchitectuur die toezichthouders eisen. Een API-gateway is de beheerste voordeur: elke burger en elke partner wordt daar geauthenticeerd en geautoriseerd, externe ratelimieten beschermen het systeem tijdens de piek op de indieningsdeadline en oude clientformaten worden aan de edge getransformeerd zodat legacyintegraties blijven werken. Erachter geeft een service mesh elke interne service een cryptografische identiteit en dwingt mTLS af bij elke aanroep, zodat geen service wordt vertrouwd enkel omdat ze binnen het netwerk zit, en toegangsbeleid expliciet opsomt welke services welke mogen aanroepen. Omdat het platform meerdere datacenters beslaat voor veerkracht, breidt de mesh dezelfde identiteits- en versleutelingsgaranties uit over clusters, wat consistent zero-trustnetwerken landelijk geeft. Elk handhavingspunt zendt een auditspoor uit, zodat de dienst aan toezichthoudende organen kan bewijzen waar toegang werd gecontroleerd en waar verkeer werd versleuteld.

Zakelijke onderbouwing: motivatie, ROI en TCO

Het rendement van een gateway is makkelijk te zien en meestal groot. In plaats van dat elke service authenticatie, ratelimiting en verzoeklogging opnieuw implementeert, bouw je die eenmaal aan de edge en erft elke service ze. Een beveiligingsfix of een nieuw ratelimietbeleid gaat uit in één deploy in plaats van honderd, wat de tijd verkort om een kwetsbaarheid te sluiten en de kosten van elke audit verlaagt, omdat er één plek is om te inspecteren. De compositie- en versioneringsfuncties snijden clientretourreizen weg en laten je API’s evolueren zonder aanroepers te breken, wat zowel latentiekosten als de coördinatiebelasting tussen teams vermindert. Voor bijna elk systeem met externe clients betaalt een gateway zichzelf snel terug.

De service mesh heeft een subtielere zakelijke onderbouwing, omdat haar total cost of ownership echt en doorlopend is. Je betaalt voor de rekenkracht en latentie van de proxy’s, voor de engineers die het controlevlak beheren en voor de leercurve van het debuggen van een nieuwe laag. Die kost is gerechtvaardigd wanneer het alternatief (implementaties per service en per taal van mTLS, herhalingen en telemetrie) groter zou zijn en, erger, inconsistent op manieren die beveiligingsgaten en storingen creëren. Op hoge schaal zet de mesh honderd broze met de hand gerolde oplossingen om in één uniforme, aantoonbare, en de ROI toont zich als minder beveiligingsincidenten, snellere veilige deployments door verkeersverschuiving en dramatisch betere observeerbaarheid. Onder die schaal helt de eerlijke berekening vaak naar bibliotheken en een gateway, en de gedisciplineerde zet is te wachten. Verbind de gateway om het bestuur te overtuigen aan de statistieken die ze al volgen (tijd om kwetsbaarheden te herstellen, auditkosten, API-coördinatie-overhead) en verbind de mesh aan beperking van beveiligingsincidenten, deploymentveiligheid en de kosten van de polyglotte duplicatie die ze vervangt.

Antipatronen en valkuilen

  • Mesh voordat je haar nodig hebt: een volledige service mesh aannemen bij een handvol services, een controlevlak kopen om een probleem op te lossen dat je nog niet hebt.
  • Dubbele herhalingen: de gateway en de mesh herhalen allebei, zodat één clientaanroep zich vermenigvuldigt tot een backendherhaalstorm die een storing versterkt.
  • Time-outinversie: een binnenste time-out langer dan de buitenste, zodat de aanroeper opgeeft terwijl de aangeroepene blijft werken aan een antwoord dat niemand zal lezen.
  • Gateway als monoliet: bedrijfslogica in de gateway proppen tot ze een gedeeld knelpunt wordt dat elk team moet coördineren om te wijzigen.
  • Single point of failure: één gatewayinstantie draaien zonder redundantie, zodat het falen van de voordeur elke service erachter neerhaalt.
  • Het netwerk vertrouwen: alles binnen de perimeter als veilig behandelen, zodat één gecompromitteerde service zich lateraal kan verplaatsen en alles kan bereiken.
  • Overlappend eigenaarschap: geen schriftelijke arbeidsverdeling, zodat dezelfde zorg per ongeluk in beide lagen wordt afgehandeld en niemand weet welke gezaghebbend is.
  • BFF-wildgroei: een backend for frontend per client opzetten wanneer de clients hetzelfde willen, gateways vermenigvuldigend en logica dupliceren zonder winst.
  • De sidecarbelasting negeren: duizenden sidecars deployen zonder de rekenkracht- en latentie-overhead te meten, en dan afvragen waar het budget bleef.

Volwassenheidsmodel

  • Niveau 1, Initiëren: Services praten rechtstreeks met elkaar zonder gedeelde laag. Authenticatie, herhalingen en time-outs zijn per service met de hand gecodeerd en inconsistent. Intern verkeer is vaak platte tekst en vertrouwd omdat het op het netwerk zit, en er is geen enkele plek om beleid af te dwingen of verkeer te observeren. Beslissingen zijn reactief, genomen service voor service naarmate problemen opduiken.
  • Niveau 2, Ontwikkelen: Een API-gateway staat voor extern verkeer en centraliseert authenticatie, ratelimiting en routering, maar oost-westzorgen worden afgehandeld door gedeelde bibliotheken met ongelijke adoptie. Sommige services hebben mTLS, veel niet. Teams herkennen het onderscheid tussen noord-zuid en oost-west, maar eigenaarschap is informeel en praktijken verschillen van team tot team.
  • Niveau 3, Standaardiseren: Noord-zuid- en oost-westzorgen zijn schoon gescheiden met een opgeschreven arbeidsverdeling toegepast over de organisatie. De gateway bezit externe identiteit, quota en compositie. Een mesh of een consistente bibliotheeklaag bezit interne mTLS, herhalingen en telemetrie. Overlappen zijn opgelost zodat geen zorg dubbel wordt afgehandeld, intern verkeer is standaard versleuteld en op identiteit gecontroleerd en de standaard is gedocumenteerd en gehandhaafd in plaats van aan de discretie van elk team overgelaten.
  • Niveau 4, Beheersen: De verkeerslaag wordt gemeten en beheerst aan de hand van uitgangswaarden. Je volgt de sidecarbelasting in rekenkracht en staartlatentie per hop, beschikbaarheid van gateway en mesh tegen foutenbudgetten, incidenten van herhaalversterking en time-outinversie, mTLS-dekking als percentage van interne aanroepen en de tijd om een beleidswijziging over de vloot door te voeren. Statistieken poorten beslissingen: een proxy-upgrade, een nieuw herhaalbudget of een canaryregel wordt beoordeeld op data tegen een uitgangswaarde in plaats van op intuïtie, en elke afdrijving van de standaard triggert een oplossing.
  • Niveau 5, Orkestreren: Gateway en mesh zijn handhavingspunten voor beleid voor een volwassen zero-trustarchitectuur, met identiteit gecontroleerd op elke hop over clusters en regio’s. Verkeersverschuiving drijft veilige progressieve oplevering, observeerbaarheid is uniform en rijk, en de organisatie evalueert en neemt continu sidecarloze, proxyloze en eBPF-aanpakken aan waar ze lonen. De verkeerslaag is geïntegreerd met beveiliging, oplevering en capaciteitsplanning, en past zich aan naarmate schaal, talen en het risicobeeld verschuiven.

Ideeën voor discussie

  1. Als je enige API-gateway nu uitviel, hoeveel services zouden onbereikbaar worden, en wat is je plan om de voordeur redundant te maken?
  2. Welke zorg in je systeem wordt nu zowel in de gateway als in een service (of een bibliotheek) afgehandeld, en hoe zou je bewijzen dat ze niet dubbel wordt afgehandeld?
  3. Bij welk aantal services en talen zou je team het eens zijn dat een mesh haar complexiteit eindelijk heeft verdiend, en hoe ver ben je van die lijn?
  4. Als een aanvaller morgen één interne service compromitteerde, welke andere services kon hij bereiken, en welke identiteitscontrole zou hem stoppen?
  5. Zijn de sidecarloze of op eBPF gebaseerde meshaanpakken volwassen genoeg voor je platform, en wat zou je meten om te beslissen?
  6. Heeft elk van je uiteenlopende clients werkelijk een eigen backend for frontend nodig, of sta je op het punt logica te dupliceren die gedeeld zou kunnen blijven?

Belangrijkste inzichten

  • Scheid noord-zuidverkeer (afgehandeld door een API-gateway) van oost-westverkeer (afgehandeld door een service mesh). Elk bezit zijn richting, en ze verwarren veroorzaakt dubbele afhandeling.
  • Een gateway centraliseert routering, authenticatie, autorisatie, ratelimiting, quota, verzoektransformatie, compositie en versionering, zodat services dun blijven en beleid op één plek leeft.
  • Een service mesh geeft je mTLS, verkeersverschuiving, herhalingen en circuit breaking op platformniveau en uniforme observeerbaarheid zonder servicecode te wijzigen, klassiek via sidecarproxy’s.
  • Neem een mesh alleen aan wanneer het aantal services en talen het bedraden per service het duurdere pad maakt. Eronder winnen bibliotheken plus een gateway, en de sidecarbelasting is echt genoeg om op te letten.
  • Behandel gateway en mesh als de handhavingspunten voor beleid van een zero-trustarchitectuur, wijs elke dwarsdoorsnijdende zorg aan precies één laag toe en controleer identiteit op elke hop over clusters.

Referenties en verder lezen

  • Sam Newman, Building Microservices: Designing Fine-Grained Systems
  • Chris Richardson, Microservices Patterns: With Examples in Java
  • Lee Calcote and Zack Butcher, Istio: Up and Running
  • Ken Owens, Alois Reitbauer, and others; the CNCF Cloud Native Landscape and service mesh documentation
  • Evan Gilman and Doug Barth, Zero Trust Networks: Building Secure Systems in Untrusted Networks
  • Scott Rose, Oliver Borchert, Stu Mitchell, and Sean Connelly, Zero Trust Architecture, NIST Special Publication 800-207
  • Susan Fowler, Production-Ready Microservices