DAPR – simplify cloud-native application development
DAPR (Distributed Application Runtime) ist eine eine quelloffene, portable, ereignisgesteuerte Runtime, welche es Entwicklern erleichtern soll, Microservices umzusetzen.
Viele haben Erfahrung mit klassischen 3-Tier Architekturen. Microservices, welche skalierbar, schnell veränderbar und resilient sein sollen, stellen jedoch zum Teil eine Herausforderung dar. Es wird nicht nur viel Zusatzwissen von verschiedensten Technologien der Cloud und Microservice Entwicklung benötigt, sondern oftmals auch zusätzlicher runtime Code zur Kommunikation zwischen den Microservices. DAPR setzt an dieser Problemstellung an und vereinfacht die Handhabung und Kommunikation verteilter Anwendungen. DAPR Anwendungen sind plattform-agnostisch wodurch diese sowohl lokal, in einem Kubernetes-Cluster als auch Cloud basiert gestartet werden können.
Quelle: https://github.com/dapr/dapr
DAPR verwendet eine Sidecar-Architektur: Jeder Service erhält ein eigenes DAPR-Sidecar, welches in einem eigenen Container läuft. Dieses kommuniziert über eine API mit der Anwendung. Der Datenaustausch erfolgt über HTTP oder gRPC. Das Sidecar übernimmt Aufgaben, die sonst in der Geschäftslogik enthalten sind. Dazu gehört die Kommunikation mit anderen Services, Datenbankzugriffe und Secrets, aber auch das Veröffentlichen von Diagnosedaten. Die Kommunikation zwischen DAPR Sidecars erfolgt über gRPC und ist standardmäßig per mTLS verschlüsselt.
Jedes Sidecar hat eine Service-URL welche unabhängig von der Instanz und Umgebung erreichbar ist. Das Routing erfolgt hierbei über die DAPR-Instanz. Die Anwendungen selber kennt nur die localhost Umgebung, sprich alles innerhalb des jeweiligen Pods. Diese hören auch nur auf lokale Routen. DAPR verspricht, mit dieser Architektur mit minimalem Konfigurationsaufwand migrierbar zu sein und resistent gegen Adressänderungen, da in der Geschäftslogik nur persistente lokale URLs verwendet werden.
Quelle: eigene Darstellung
Erste Schritte mit DAPR
Installation DAPR CLI
powershell -Command "iwr -useb https://raw.githubusercontent.com/dapr/cli/master/install/install.ps1 | iex"
→ Installiert unter C:\dapr (Nicht vergessen PATH zu ergänzen)
wget -q https://raw.githubusercontent.com/dapr/cli/master/install/install.sh -O - | /bin/bash
→ Installiert unter /usr/local/bin
$ dapr __ ____/ /___ _____ _____ / __ / __ '/ __ \/ ___/ / /_/ / /_/ / /_/ / / \__,_/\__,_/ .___/_/ /_/ =============================== Distributed Application Runtime Usage: dapr [command] Available Commands: completion Generates shell completion scripts components List all Dapr components. Supported platforms: Kubernetes configurations List all Dapr configurations. Supported platforms: Kubernetes dashboard Start Dapr dashboard. Supported platforms: Kubernetes and self-hosted help Help about any command init Install Dapr on supported hosting platforms. Supported platforms: Kubernetes and self-hosted invoke Invoke a method on a given Dapr application. Supported platforms: Self-hosted list List all Dapr instances. Supported platforms: Kubernetes and self-hosted logs Get Dapr sidecar logs for an application. Supported platforms: Kubernetes mtls Check if mTLS is enabled. Supported platforms: Kubernetes publish Publish a pub-sub event. Supported platforms: Self-hosted run Run Dapr and (optionally) your application side by side. Supported platforms: Self-hosted status Show the health status of Dapr services. Supported platforms: Kubernetes stop Stop Dapr instances and their associated apps. . Supported platforms: Self-hosted uninstall Uninstall Dapr runtime. Supported platforms: Kubernetes and self-hosted upgrade Upgrades a Dapr control plane installation in a cluster. Supported platforms: Kubernetes Flags: -h, --help help for dapr -v, --version version for dapr Use "dapr [command] --help" for more information about a command.
Initialisieren von lokaler Umgebung
DAPR kann lokal an Prozesse gebunden werden oder in ein lokales Kubernetes Cluster (Minikube, Kind, …) installiert werden. Siehe DAPR Initialisieren.
Der Einstieg in DAPR an sich ist einfach, da die Runtime logisch aufgebaut ist. Außerdem bietet die Dokumentation zu fast allem eine verständliche Erklärung. Schwierigkeiten gibt es lediglich bei spezifischen Nachforschungen und Fragen: DAPR ist ein aktuelles Cutting Edge Tool, weshalb die Community noch recht neu ist und das Know-how dementsprechend kleiner als bei etablierten Technologien.
Die Programmiersprache ist frei wählbar und die REST API weitestgehend bekannt, was das Entwickeln von Microservices ohne zusätzliche Einarbeitungszeit ermöglicht. Für die meisten gängigen Programmiersprachen sind bereits anschauliche Beispiele in der Dokumentation. Wenn REST gemieden werden soll gibt es alternativ ein SDK für die meisten Sprachen. Damit lässt sich die Kommunikation zwischen App und Sidecar per gRPC mit einfachen Hilfsmethoden realisieren.
Die Migration der lokalen Anwendung zu einem anderen Host ist trivial und bei entsprechenden Kenntnissen des Ziel in kürzester Zeit umgesetzt. Innerhalb der Geschäftslogik muss keine einzige Zeile Code und keine URL angepasst werden, da die verwendeten Docker Images identisch sind und unabhängig vom Cloudvendor betrieben werden. Lediglich die Image Location muss im Deployment File auf das entsprechende Repository angepasst werden.
Erwähnenswert ist, dass die DAPR Instanz selber Overhead mit sich bringt. So benötigt diese alleine pro DAPR System 5 Pods, jeder weitere Microservice einen zusätzlichen Container per Pod.
Gerade bei kleinen Anwendungen ist dies schnell ein vielfaches der eigentlichen Logik, was eventuell zusätzliche Kosten birgt, welche ohne DAPR und mit manuellem Entwicklungsaufwand gespart werden können.
Für größere verteilte System eignet sich ein Einsatz von DAPR aber auf jeden Fall, da keine Routing Logik in den eigentlichen Implementierungen verbaut werden muss.
In einem weiteren Teil gehen wir noch darauf ein, wie sich DAPR in der Azure und AWS Cloud verwenden lässt.
Co-Autor: Jacob Zeising
Mehr über Frontend Entwicklung erfahren
Quellen:
dapr.io
github.com/dapr
Super Blog! Gerne mehr!