Microservices, insb. unter dem Einsatz von Docker, bieten vielfältige Möglichkeiten für große verteilte Softwaresysteme, wie man sie z.B. bei Netflix findet. Hier stellen wir unsere Erfahrungen vor, wie Microservices als Architekturstil und Docker als konkretes Produkt auch bei traditioneller Anwendungsentwicklung helfen können.
4. Motivation
Virtualisierung ist ein spannendes Thema
¡ Umstellung unser lokalen Server-Infrastruktur (a.k.a Küche) vor etwa 6 Jahren
¡ Ebenfalls schon länger lokal bei Entwicklern im Einsatz
¡ Windows für die MacBooks :-)
¡ Isolierte RDBMS (Oracle, DB2), oder AppServer (WebSphere)
¡ Isolierte Test-Systeme
=> gute Erfahrungen,
aber etwas schwerfällig
Docker war sofort spannend
¡ Leichtgewichtig, lebendige Ökostruktur
¡ Anfangs noch buggy
¡ Anscheinend jetzt Konsolidierungsphase
Thoughtworks – Technology Radar
9. Ein paar Anmerkungen...
Microservice (MS) :=
¡ Vertikal geschnittene Komponente mit starker fachlicher Kohäsion
¡ Einzeln betreibbar
Ein getrennter Betrieb der SW-Komponenten
¡ Ermöglicht Aktualisierung von Einzelkomponenten ohne Abschalten des Gesamtsystems
¡ Isoliert Einzelfehler und ermöglicht Fehlerbehebung ebenfalls ohne Gesamtabschaltung
¡ Ermöglicht häufigere und risikoärmere Releases
Wichtig dafür ist
¡ Klare lose Kopplung (insb.: MS bleiben funktional, wenn andere nicht verfügbar sind)
¡ Entflechtung der Daten in der DB
Dennoch
¡ Transformation: lokales System => verteiltes System (mit allen Herausforderungen)
15. Projekterfahrungen – Projekt I
Kunde mit VM-basierten Microservices
¡ Microservice := VM mit REST-Schnittstelle (Implementierung beliebig)
¡ Anfänglich hohe Entwicklungsgeschwindigkeit
¡ Dann (nach etwa 3 Jahren)
¡ Wartungsprobleme
(nichtfunktionale Builds, verlorenes Entwicklerwissen, unklare Verantwortungen)
¡ Nichtfunktionale Probleme durch zu enge Kopplung
(Performance, Verfügbarkeit)
¡ Aktuell
¡ Aufwändiger Betrieb und Wartung
19. Bestandteile des Konfigurationsmanagements
Varianten
¡ Entwicklung - JRebel, Batchsize=1, Logging, Standard-DB-User, Testdaten,
DB im Container
¡ Testsystem - Batchsize>1, Logging, Extern verwaltete DB-User
DB außerhalb des Containers
¡ CI-Tests - wie Testsystem, aber mit Testdaten
¡ Produktivsystem - wie Testsystem, aber mit Produktivdaten
Konfigurationsartefakte
¡ Java EE – Komponenten (WARs, EARs, EJB-Jars)
¡ Applicationserver
¡ Docker Container mit ihrer Verdrahtung
20. Umsetzung
Maven als führendes System
¡ Image := 1 Maven-Komponente
¡ Vererbungshierarchie auf Container um Gemeinsamkeiten der Staging-Varianten zu
konzentrieren
¡ Einsatz eines docker-maven-plugin
¡ Verwaltung von Container-Geflechten mit Docker-Compose
Bewertung
¡ Nicht komplexer als bisherige Alternativen
¡ Schnell genug bei der Entwicklung
23. Vorher ....
Typischerweise in Projekten:
¡ 1 Seite im Confluence „Aufsetzen der Entwicklungsumgebung“
Beinhaltet
¡ Installation + Konfiguration des RDBMS (inkl. Testdaten)
¡ Installation der Build-Werkzeuge (Java, Maven, Node, Gulp ...)
¡ Installation des Quellcodeverwaltungssystems (z.B. Git)
¡ Auschecken des Quellcode
¡ Installation und Konfiguration des Appservers
Dauer: 0,5 bis 1 PT
Probleme:
¡ „Verstöße“ gegen die Vorgaben (z.B. die neueste DB...)
¡ Interaktion mit anderen Produktversionen aus anderen Projekten
24. .... Nachher
Aufsetzen beinhaltet
¡ Installation von Java, Maven, Docker, Quellcodeverwaltung
¡ Auschecken des Quellcodes
¡ Per Maven:
¡ Konfiguration von Docker-Images für DB und AppServer
¡ Start der kompletten Entwicklungsumgebung
Dauer: 1Ph
¡ mit geringer Fehlerwahrscheinlichkeit
Kommentar:
¡ Zusätzliche Docker-Schicht erhöht die Komplexität
=> wenn etwas nicht funktioniert, wird die Analyse noch schwieriger
25. More to come ...
Vision:
¡ nur noch Docker für die lokale Softwareinstallation
kein Maven, Java, Git, Node.js etc.
Erste praktischen Erfahrungen
¡ Kapseln von „exotischeren“ Werkzeugen im Build
durch Docker (z.B. ASCIIDoc => Confluence)
¡ Docker for Windows != Docker
¡ BTW, Docker for Mac hat Performance-Probleme bei
Dateizugriffen
¡ STMP-Server als Docker-Container