Introductie in Dapr (Distributed Application Runtime)
Dapr is een open source, draagbare, op gebeurtenissen gebaseerde runtime die het voor ontwikkelaars gemakkelijk maakt om veerkrachtige, stateless en stateful microservices te bouwen die draaien in de cloud en aan de rand, en die de diversiteit van talen en ontwikkel frameworks omarmen.
Dapr is volledig platform- en taalonafhankelijk; dit betekent dat het kan draaien op elk platform, elke Kubernetes-implementatie, in de cloud of on-premise, en zelfs op IoT (Internet of Things)-apparaten. Dapr richt zich op het leveren van bouwstenen die het voor ontwikkelaars gemakkelijker maken om microservices te bouwen, in tegenstelling tot een service mesh, dat zich richt op netwerk gerelateerde zorgen.
In deze blog zullen we kijken naar hoe Dapr werkt en enkele belangrijke Dapr-concepten bespreken.
Hoe Dapr werkt
Communicatie tussen meerdere microservices vereist het gebruik van gRPC (algemene Remote Procedure Calls), API (Application Programming Interface), pub/sub (publish-subscribe patroon), enzovoort. Bovendien moeten ontwikkelaars ook Service Discovery en State Management uitvoeren. Deze twee gevallen omvatten verschillende parameters. Afhankelijk van of het een stateless of stateful app is, moeten ontwikkelaars werken met verschillende SDK's (Software Development Kit) en programmeermodellen.
Dapr maakt gebruik van een sidecar-patroon dat vergelijkbaar is met de side-car-implementatie in de service mesh-architectuur, waarbij een lokale proxy wordt gebruikt om verzoeken te routeren. Side-cars in Dapr worden gebruikt om de integratie van microservice-bouwblokken tijdens runtime in plaats van tijdens compileertijd mogelijk te maken. Dit brengt het voordeel met zich mee dat Dapr geïntegreerd is met bestaande en legacy-code die wordt bediend via een standaard HTTP (Hyper Text Transfer Protocol)/gRPC-interface, waardoor enterprise-ontwikkelaars de voordelen van microservices-ontwikkeling kunnen ervaren zonder hun toepassingen opnieuw te hoeven schrijven.
Dapr Concepten
Hieronder worden enkele prominente Dapr-concepten gegeven. Het doel van deze concepten is om een algemeen en basaal begrip van Dapr te bieden.
- Elk framework, elke taal, overal: Aangezien Dapr volledig platformonafhankelijk is, betekent dit dat je toepassingen lokaal kunt uitvoeren, op elk Kubernetes-cluster en andere beheerde omgevingen geïntegreerd met Dapr. Dit stelt ontwikkelaars in staat om microservice-toepassingen te bouwen die draaien in de cloud en op de edge zonder code te wijzigen. Dapr brengt beste praktijken voor het bouwen van microservice-toepassingen samen in open, onafhankelijke bouwblokken om draagbare toepassingen te bouwen met de taal en het framework van jouw keuze.
- Geheimen: In Dapr is een geheim elk stukje privégegevens dat je wilt beschermen tegen ongewenste gebruikers. Dapr biedt een geheimen-bouwblok-API en integreert het met geheimenopslagplaatsen zoals Azure Key Vault en Kubernetes om de geheimen op te slaan.
- Robuuste microservice bouwblokken voor cloud en edge: Een bouwblok is als een HTTP- of gRPC-API die kan worden aangeroepen vanuit gebruikerscode en die een of meer Dapr-componenten gebruikt.
Dapr bestaat uit een set bouwblokken, met de mogelijkheid om nieuwe bouwblokken toe te voegen.
Elk van deze bouwblokken is onafhankelijk en je kunt er een, enkele of allemaal gebruiken in je toepassing. In de eerste release van Dapr worden de volgende bouwblokken geleverd:
- Service-oproep: Service-oproep maakt communicatie tussen toepassingen mogelijk via bekende eindpunten in de vorm van HTTP- of gRPC-berichten.
- State Management: Dapr biedt een toets- of waardegebaseerde staat-API met plugbare staatopslag voor persistentie. Met state management voor het opslaan van toets- of waardeparen kunnen langdurige, zeer beschikbare, stateful services eenvoudig worden geschreven naast stateless services in je toepassing. De staatopslag is plugbaar en kan Azure CosmosDB, AWS DynamoDB of Redis bevatten.
- Publiceren en abonneren berichten: Dapr ondersteunt het pub/sub-patroon tussen toepassingen. Pub/Sub is een losjes gekoppeld berichtenpatroon waarbij verzenders of uitgevers berichten publiceren naar een onderwerp waarop de abonnees zich abonneren.
- Resource Bindings: Dapr staat toe om de externe service te activeren via de Dapr-binding API, en het stelt je toepassing in staat om te worden getriggerd door gebeurtenissen verzonden door de verbonden service. Een binding biedt een bidirectionele verbinding met een externe cloud-/on-premise-service of systeem.
- Actoren: Een acteur is een geïsoleerde, onafhankelijke eenheid van berekening en toestand met single-threaded uitvoering. Dapr biedt talrijke mogelijkheden in zijn actor-runtime, waaronder gelijktijdigheid, toestand, levenscyclusbeheer voor activeren/deactiveren van actoren en timers en herinneringen om actoren wakker te maken.
- Gedistribueerde tracering: Gedistribueerde tracering verzamelt en aggregeert trace-gebeurtenissen, metrieken en prestatiegegevens tussen Dapr-instanties. Het stelt je in staat om de volledige oproepketen te traceren over meerdere services, of oproepmetingen te zien op een gebruikersservice.
- Geheimen: Servicecode kan de geheimen-API oproepen om geheimen uit de door Dapr ondersteunde geheime opslag te halen. Dapr biedt een eenvoudige geheimen-API en integreert met geheime opslagplaatsen zoals Azure Key Vault en Kubernetes geheime opslagplaatsen.
Zijdelingse architectuur:
Dapr onthult zijn API's als een zijdelingse architectuur, ofwel als een container of als een proces zonder dat de toepassingscode enige Dapr-runtimecode nodig heeft. Dit maakt integratie met Dapr eenvoudig vanuit andere runtimes en biedt scheiding van de toepassingslogica voor een betere ondersteunbaarheid.
Standalone
In de stand-alone modus draait Dapr als een afzonderlijk proces waar je servicecode via HTTP of gRPC naar kan bellen.
Kubernetes
In containerhostingomgevingen zoals Kubernetes draait Dapr als een zijdelingse container samen met de toepassingscontainer in hetzelfde pod.
Hosting-omgevingen
Dapr kan worden uitgevoerd op verschillende hostingplatforms. De ondersteunde hostingplatforms zijn:
- Zelf-gehost: Dapr draait op een enkele machine als proces of in een container.
- Kubernetes: Dapr draait op elk Kubernetes-cluster, of het nu van een cloudprovider is of on-premises.
Dapr uitvoeren op een lokale ontwikkelmachine in zelf-gehoste modus
Dapr kan worden geconfigureerd om op jouw lokale ontwikkelaarsmachine in zelf-gehoste modus te draaien. Elke draaiende service heeft een Dapr-runtimeproces of zijcar dat is geconfigureerd om gebruik te maken van state stores, pub/sub, binding-componenten en andere bouwblokken. Je kunt Dapr CLI gebruiken om een Dapr-ingeschakelde toepassing op jouw lokale machine uit te voeren.
Dapr in Kubernetes-modus uitvoeren
Dapr kan worden geconfigureerd om op elk Kubernetes-cluster te draaien. Het implementeren en uitvoeren van een Dapr-ingeschakelde toepassing in jouw Kubernetes-cluster is net zo eenvoudig als het toevoegen van een paar annotaties aan de implementatieschema's. Om jouw service een id en poort te geven die bekend is bij Dapr, traceringsinformatie in te schakelen en de Dapr-zijcarcontainer te starten, annoteer je jouw Kubernetes-implementatie als volgt.
Ontwikkelerstalen, SDK’s en frameworks
Dapr biedt taalspecifieke SDK's voor Go, .NET, Java, JavaScript en Python. Deze SDK's stellen de functionaliteit in de Dapr-bouwblokken bloot, zoals het opslaan van status, het publiceren van een gebeurtenis of het maken van een acteur, via een getypeerde, taal-API in plaats van het aanroepen van de HTTP/gRPC-API. En omdat deze SDK's de Dapr-runtime delen, krijg je ondersteuning voor cross-language actoren en functies.
Ontwikkelframes
Dapr kan worden geïntegreerd met elk ontwikkelframework. Zo vind je bijvoorbeeld in de Dapr .NET SDK integratie met ASP.NET Core, wat stateful routing-controllers brengt die reageren op pub/sub-gebeurtenissen van andere services. En in de Dapr Java SDK vind je integratie met Spring Boot.
Componenten
Dapr maakt gebruik van een modulair ontwerp waarbij functionaliteit wordt geleverd als een component. Elke component heeft een interface-definitie. Alle componenten zijn uitwisselbaar, zodat je één component met dezelfde interface kunt vervangen door een andere. Je kunt een lijst krijgen van de huidige beschikbare componenten in de huidige hostingomgeving met het dapr components CLI-commando.
Middelsware-componenten
Dapr staat toe dat aangepaste middleware wordt ingevoegd in de verwerkingspijplijn van het verzoek. Middleware kan extra acties uitvoeren op een verzoek, zoals authenticatie, encryptie en berichttransformatie voordat het verzoek wordt gerouteerd naar de gebruikerscode, of voordat het verzoek wordt geretourneerd naar de client. De middleware-componenten worden gebruikt met het Service Invocation-bouwblok.
Conclusie
Dapr biedt best practices voor veelvoorkomende mogelijkheden bij het bouwen van microservice-toepassingen die ontwikkelaars op een standaard manier kunnen gebruiken en implementeren in elke omgeving. Dapr brengt enkele van de gedemonstreerde technieken en best practices naar microservice-ontwikkeling. Sterker nog, Dapr doet wat ODBC (Open Database Connectivity) en JDBC (Java Database Connectivity) deden voor door data gedreven client/server-toepassingen voor het consumeren van gemeenschappelijke services die nodig zijn door moderne, cloud native-toepassingen. TypeScript, C#, Scala, Ruby en Rust staan ook op de planning voor SDK-ontwikkeling in de nabije toekomst.