Home » Begrippen » Wat is microservices?

Wat is microservices?

Microservices is een softwarearchitectuur waarbij een applicatie niet als één groot geheel wordt gebouwd, maar als een verzameling kleine, onafhankelijke services die elk een specifieke taak uitvoeren en via API’s met elkaar communiceren. In plaats van één monolithische codebase die alles doet, heb je bij microservices aparte services voor bijvoorbeeld gebruikersbeheer, betalingen, productcatalogus en notificaties. Grote techbedrijven als Netflix, Amazon en Spotify zetten microservices in om hun platforms schaalbaar en betrouwbaar te houden, zelfs bij miljoenen gelijktijdige gebruikers. Elke service kan onafhankelijk worden ontwikkeld, getest, uitgerold en geschaald, wat teams de vrijheid geeft om snel te itereren zonder het hele systeem te hoeven aanraken. Voor groeiende organisaties biedt microservices een manier om complexe software beheersbaar te houden.

Microservices versus monolithische architectuur

Om microservices goed te begrijpen, is het nuttig om het te vergelijken met de traditionele aanpak: de monoliet. Bij een monolithische applicatie zit alle logica in één grote codebase. Dat werkt prima voor kleine projecten, maar naarmate de applicatie groeit, worden deployments risicovoller, is de testoppervlakte groter en heeft een fout in één module gevolgen voor het hele systeem.

Bij microservices is elke service een zelfstandig programma met zijn eigen database, eigen taal en eigen deployment-pipeline. Een bug in de betaalservice raakt de productcatalogus niet. Een team dat werkt aan de zoekfunctie hoeft niet te wachten op het team dat de profielpagina verbetert. Deze onafhankelijkheid is de kern van de microservices-filosofie.

Wanneer is een monoliet nog de betere keuze?

Microservices zijn niet voor elk project de juiste oplossing. Voor een startup met een klein team en een onzeker businessmodel is een monoliet vaak sneller te bouwen en makkelijker te onderhouden. De operationele complexiteit van microservices, zoals het beheren van meerdere services, netwerkcommunicatie en gedistribueerde logging, is aanzienlijk. Pas als jouw applicatie en organisatie groot genoeg zijn om die complexiteit te rechtvaardigen, leveren microservices hun maximale waarde op.

Hoe communiceren microservices met elkaar?

Omdat elke service onafhankelijk draait, moeten services een manier hebben om gegevens uit te wisselen. Dat gebeurt op twee manieren:

  • Synchrone communicatie via REST of gRPC: Service A stuurt een verzoek naar service B en wacht op een antwoord. Dit is eenvoudig te implementeren, maar creëert een afhankelijkheid: als service B traag of onbeschikbaar is, wacht service A.
  • Asynchrone communicatie via message brokers: Service A plaatst een bericht in een wachtrij (zoals RabbitMQ of Apache Kafka), en service B verwerkt dat bericht wanneer het er klaar voor is. Dit maakt services losser gekoppeld en verhoogt de veerkracht van het systeem.

De keuze tussen synchroon en asynchroon hangt af van de aard van de operatie. Een directe zoekopdracht vraagt om een synchroon antwoord. Het versturen van een bestelbevestigingsmail kan prima asynchroon via een wachtrij.

Containerisatie en orkestratie

Microservices en containers zijn bijna onlosmakelijk verbonden. Een container (zoals Docker) verpakt een service samen met alles wat die service nodig heeft: de runtime, libraries en configuratie. Dat maakt de service draagbaar en consistent tussen ontwikkel-, test- en productieomgevingen.

Maar tientallen of honderden containers beheren is een uitdaging op zich. Daarvoor gebruik je een orkestratieplatform zoals Kubernetes. Kubernetes zorgt voor automatische deployment, schaling, herstart bij falen en loadbalancing van containers. Het is de motor die grote microservices-architecturen draaiende houdt.

Service mesh

In complexe microservices-omgevingen gebruik je soms een service mesh zoals Istio of Linkerd. Dit is een infrastructuurlaag die communicatie tussen services beheert: het regelt versleuteling, authenticatie, retry-logica en observability zonder dat je die logica in elke service hoeft te herhalen.

Voordelen van microservices

  • Onafhankelijke schaalbaarheid: Je kunt alleen de services schalen die dat nodig hebben. Als jouw zoekfunctie veel belasting heeft, schaal je alleen die service op, niet de hele applicatie.
  • Technologievrijheid: Elke service kan in een andere programmeertaal of met een ander framework worden gebouwd, afhankelijk van wat het beste past bij de taak.
  • Snellere deployments: Teams kunnen hun eigen service deployen zonder coördinatie met andere teams, wat de deploymentfrequentie verhoogt.
  • Foutenisolatie: Een crash in één service brengt het hele systeem niet neer, mits de architectuur goed is ingericht met circuit breakers en fallbacks.
  • Betere onderhoudbaarheid: Kleine codebases zijn makkelijker te begrijpen, te testen en te refactoren dan een grote monoliet.

Uitdagingen en valkuilen

Microservices brengen ook serieuze uitdagingen met zich mee die je niet mag onderschatten.

Operationele complexiteit

Je hebt plotseling tientallen services die je moet monitoren, loggen en beveiligen. Gedistribueerde systemen mislukken op subtiele manieren die in een monoliet niet voorkomen. Investeer in goede observability: gecentraliseerde logging (zoals ELK Stack of Datadog), distributed tracing (zoals Jaeger of Zipkin) en uitgebreide monitoring zijn geen optionele extra’s, maar noodzakelijkheden.

Gedistribueerde transacties

In een monoliet kun je database-operaties in een transactie wikkelen. In een microservices-architectuur heeft elke service zijn eigen database, waardoor je geen traditionele ACID-transacties kunt gebruiken die meerdere services overspannen. Patronen zoals Saga helpen dit op te lossen, maar voegen complexiteit toe aan jouw ontwerp.

Netwerkcommunicatie

Functioneel aanroepen die in een monoliet in-process zijn, worden over het netwerk gedaan in microservices. Dat introduceert latency, de kans op netwerkstoringen en de noodzaak voor retry-mechanismen en timeouts. Dit moet je meenemen in jouw architectuurontwerp.

Conclusie

Microservices bieden een krachtige manier om grote, complexe softwaresystemen te bouwen die schaalbaar, onderhoudbaar en veerkrachtig zijn. De onafhankelijkheid van services stelt teams in staat om snel te innoveren zonder elkaar in de weg te zitten, en de technologievrijheid zorgt ervoor dat je altijd het juiste gereedschap voor de klus kunt kiezen. Tegelijkertijd is de operationele complexiteit niet gering: je hebt de juiste tooling, kennis en organisatiestructuur nodig om microservices succesvol te implementeren. Overweeg of jouw organisatie en applicatie groot genoeg zijn om de voordelen te rechtvaardigen, en begin indien mogelijk met het opdelen van één goed gedefinieerde functionaliteit uit jouw monoliet voordat je de volledige overstap maakt.

Veelgestelde vragen

  1. Hoe groot moet een microservice zijn?
    Er is geen vaste regel, maar een goede richtlijn is dat een service één duidelijke verantwoordelijkheid heeft en door een klein team volledig te begrijpen en te beheren is. Het concept van een “two-pizza team” van Amazon is populair: als twee pizza’s het team dat een service beheert niet kan voeden, is de service waarschijnlijk te groot. In de praktijk varieert de grootte van een paar honderd tot enkele duizenden regels code.
  2. Wat is het verschil tussen microservices en SOA (Service-Oriented Architecture)?
    Beide architecturen verdelen een applicatie in services, maar er zijn belangrijke verschillen. SOA gebruikte vaak zware Enterprise Service Buses (ESB) voor communicatie en richtte zich op hergebruik van services. Microservices zijn lichter, communiceren via eenvoudige API’s en HTTP, en richten zich op onafhankelijke deployment van kleine services. Microservices zijn in veel opzichten een evolutie van SOA-ideeën.
  3. Moet elke microservice zijn eigen database hebben?
    De aanbeveling is van wel. Wanneer services een database delen, ontstaan afhankelijkheden tussen services en kunnen schema-wijzigingen in één service andere services breken. Een eigen database per service borgt de onafhankelijkheid volledig. Dit betekent wel dat je data-synchronisatie tussen services via events of API-calls moet regelen in plaats van via directe databasequeries.
  4. Is Kubernetes verplicht voor microservices?
    Nee, Kubernetes is niet verplicht, maar wel de meest gebruikte oplossing voor orkestratie van containers in productie. Voor kleinere setups kun je ook Docker Compose, AWS ECS of andere lichtere alternatieven gebruiken. Bij groei en complexiteit biedt Kubernetes echter functionaliteiten die moeilijk zelf te bouwen zijn, zoals automatische schaling, rolling updates en zelfreparatie bij uitval.
  5. Hoe begin ik met migreren van een monoliet naar microservices?
    De meest succesvolle aanpak is het strangler fig pattern: je vervangt de monoliet stukje bij beetje door nieuwe microservices, terwijl de monoliet nog actief blijft. Begin met een goed afgebakende functionaliteit die weinig afhankelijkheden heeft, bouw die uit als aparte service, en leid het verkeer geleidelijk om. Zo vermijd je een risicovolle big-bang migratie en leer je onderweg wat microservices in jouw specifieke context betekent.

Al onze begrippen

A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 0-9