EXPERTEN-DOSSIER 2019 - ÜBER 80 SEITEN MIT PRAXISORIENTIERTEM WISSEN FÜR .NET-ENTWICKLER RUND UM .NET CORE, AZURE DEVOPS, TYPESCRIPT, COSMOS DB ...

 
WEITER LESEN
EXPERTEN-DOSSIER 2019 - ÜBER 80 SEITEN MIT PRAXISORIENTIERTEM WISSEN FÜR .NET-ENTWICKLER RUND UM .NET CORE, AZURE DEVOPS, TYPESCRIPT, COSMOS DB ...
Experten-Dossier
       2019

       Über 80 Seiten mit
 praxisorientiertem Wissen für
    .NET-Entwickler rund um
   .NET Core, Azure DevOps,
TypeScript, Cosmos DB, ML.NET,
         Git und Azure!

       bastacon   www.basta.net
EXPERTEN-DOSSIER 2019 - ÜBER 80 SEITEN MIT PRAXISORIENTIERTEM WISSEN FÜR .NET-ENTWICKLER RUND UM .NET CORE, AZURE DEVOPS, TYPESCRIPT, COSMOS DB ...
Inhalt

Agile & DevOps
Die DevOps-Challenge                                                           4
DevOps-Fallstricke und wie man ihnen entkommen kann
von Kevin Gerndt

Microservices & APIs
Warum einfach? Es geht auch komplex!                                          10
Entwicklung von Microservices mit Microsoft .NET
von Dr. Felix Nendzig

Go Git!                                                                       16
Git erobert die Entwicklerwelt
von Uwe Baumann

Des Kaisers neue Kleider                                                      21
Aus VSTS wird Azure DevOps – mehr als nur ein neuer Name?
von Nico Orschel und Thomas Rümmler

.NET Framework & C#
R. I. P .NET „Core“                                                           29
.NET Framework, .NET Core und Mono sind tot – lang lebe .NET 5.0!
von Dr. Holger Schwichtenberg

Machine Learning für die Zukunft                                              33
Hintergrund und Einstieg in ML mit .NET
von Kevin Gerndt

Architektur
Kolumne: Stropek as a Service                                                 40
Zehn Hausaufgaben für die Cloud-Architektur – Eine gute Softwarearchitektur
setzt klare Ziele voraus
von Rainer Stropek

Große Business-Apps mit Angular meistern                                      43
Nachhaltige Angular-Architekturen mit Nx und Strategic Design
von Manfred Steyer
EXPERTEN-DOSSIER 2019 - ÜBER 80 SEITEN MIT PRAXISORIENTIERTEM WISSEN FÜR .NET-ENTWICKLER RUND UM .NET CORE, AZURE DEVOPS, TYPESCRIPT, COSMOS DB ...
Inhalt

Sicherheit
Du kommst hier nicht rein                                                   48
API Authorization in ASP.NET Core 3.0 mit IdentityServer
von Sebastian Gingter

Wasm – Ist das sicher oder kann das weg?                                    53
Neue Besen kehren gut, sagt man. Aber sind sie auch sicher?
von Carsten Eilers

HTML5 & JavaScript
Das Beste aus zwei Welten                                                   59
Mit ASP.NET Core und Angular eine Webanwendung erstellen
von Fabian Gosebrink

Injections für echte TypeScript-Junkies                                     70
Dependency Injection in unter 200 Zeilen Code – ohne Leerzeilen
von Thomas Mahringer

Olis bunte Welt der IT                                                      76
Wenn’s etwas weniger sein darf: React und Redux kombiniert
von Oliver Sturm

Data Access & Storage
Progressive Web Apps auf Knopfdruck?                                        66
Ohne Umwege zu offlinefähigen Webanwendungen mit Angular
und @ angular/service-worker
von Manfred Steyer

Ganz ir-relational                                                          80
Cosmos DB in eigenen Projekten einsetzen: Grundlagen und Einsatzszenarien
von Thorsten Kansy
EXPERTEN-DOSSIER 2019 - ÜBER 80 SEITEN MIT PRAXISORIENTIERTEM WISSEN FÜR .NET-ENTWICKLER RUND UM .NET CORE, AZURE DEVOPS, TYPESCRIPT, COSMOS DB ...
DOSSIER                 Agile & DevOps

DevOps-Fallstricke und wie man ihnen entkommen kann

Die DevOps-
Challenge
Noch vor einigen Jahren wurde die IT in Unternehmen als notwendiges Übel wahr-
genommen. Doch in Zeiten von digitalen Geschäftsmodellen und Produkten haben
Unternehmen den wahren Wert dieses Bereichs erkannt. Das birgt jedoch eine
Menge neuer Herausforderungen, denn der Wettbewerbsdruck steigt stetig und die
Entwicklungszyklen werden immer kürzer. DevOps scheint das Allheilmittel zu sein,
der Weg dorthin ist aber steinig.

von Kevin Gerndt                                           zur Vermittlung von Dienstleistungen. Doch sind es
                                                           oftmals diese Unternehmen, die durch hohe zweistel-
Das „Digital Mindset“ hat unlängst Einzug in große         lige Wachstumszahlen brillieren und schnell einen
deutsche Konzerne gehalten. Das zeigen diverse Studi-      Milliardenwert auf die Börsenwaage bringen. Um ein
en und dass die Notwendigkeit erkannt wurde, einen         solches produktgetriebenes Wachstum zu erreichen,
neuen Platz in der Führungsetage für den Chief Digital     ist es erforderlich, extrem schnell und agil auf Ver-
Officer (CDO) zu schaffen. Der CDO soll Unterneh-          änderungen und Anforderungen reagieren zu können.
men erfolgreich durch die digitale Transformation füh-     In dieser Disziplin sind die oft „tankerähnlichen“, in
ren. Denn der Wettbewerbsdruck wächst zunehmend            Silos organisierten Großunternehmen ganz klar unter-
und immer mehr Firmen setzen auf die Entwicklung           legen.
digitaler Produkte und Services. Wer nicht Opfer der          Letztendlich ist jedoch alles eine Frage der Strategie
Disruption werden möchte, muss sich diesem Trend           und des Willens. Im Jahr 2018 hat Klaus Straub, CIO bei
anschließen und der Konkurrenz immer einen Schritt         BMW, angekündigt, das Unternehmen im Rahmen einer
voraus sein. Interessanterweise beschränkt sich diese      agilen Transformation ganz klar in Richtung Produkt­
Entwicklung nicht nur auf einzelne Branchen, sondern       orientierung bzw. Agile Operating Model auszurichten.
ist nahezu in allen Marktsegmenten erkennbar. Wer          Unter dem Motto „100 % agil“ ist das erklärte Ziel, bis
hätte vor fünfzehn Jahren schon gedacht, dass Unter-       Ende 2019 nicht nur sämtliche laufende IT-Projekte des
nehmen aus dem Bereich Automotive einmal Unsum-            Unternehmens auf agil umzustellen, sondern auch die
men in die Entwicklung und Bereitstellung digitaler        IT-Organisation vollumfänglich nach agilen Prinzipien
Services investieren würden?                               auszurichten. Ein zwingendes Erfordernis stellt die enge
   Ein gutes Beispiel hierfür ist der Car-Sharing-Dienst   Zusammenarbeit zwischen Fachbereichen und der IT-
DriveNow des Automobilherstellers BMW. Durch               Abteilung dar.
das Car-Sharing-Angebot verlängert sich einerseits            Aber auch hinter den Mauern der IT ist ein enger
die Wertschöpfungskette hin zum Kunden, auf der            Schulterschluss gefragt. Gemeint ist damit natürlich
anderen Seite lassen sich wertvolle Benutzerdaten          DevOps – die Verschmelzung von Entwicklung und Be-
sammeln. Wie lukrativ Servicemodelle sein können,          trieb. Das Schaffen einer DevOps-Kultur ist jedoch viel
zeigen Unternehmen wie myTaxi, HRS oder Uber.              mehr als nur das Vorhaben, Abteilungen und Bereiche
Diese Firmen sind weder im produzierenden Gewerbe          zusammenzuführen. Es handelt sich vor allem um eine
tätig, noch besitzen sie physische Güter. Sie fungieren    Revolution im Kopf aller Beteiligten, einen Umdenkpro-
lediglich als Serviceprovider und bieten die Plattform     zess, der von höchster Ebene angeregt werden muss. Vor

www.basta.net                                                                                                     4
EXPERTEN-DOSSIER 2019 - ÜBER 80 SEITEN MIT PRAXISORIENTIERTEM WISSEN FÜR .NET-ENTWICKLER RUND UM .NET CORE, AZURE DEVOPS, TYPESCRIPT, COSMOS DB ...
DOSSIER                Agile & DevOps

allem ist es wichtig, die so häufig im Kopf existierenden   reiche. Zögerliche Unternehmen riskieren mittel- und
Silos abzureißen. Doch was genau bedeutet das?              langfristig ihre Wettbewerbsfähigkeit. Im schlimmsten
   Stellt man sich einmal den klassischen Entwicklungs-     Fall werden sie Opfer der Disruption und verschwin-
prozess vor, läuft es meist so, dass die Fachabteilung      den vom Markt. Doch auch Unternehmen, die sich un-
mit einem Anforderungskatalog an den Entwicklungs-          längst für eine DevOps-Strategie entschieden haben,
bereich herantritt. Dieser entwickelt die Software, um      kämpfen mit der Umsetzung. Unternehmen buhlen
sie anschließend an den Betrieb zu übergeben. Das Be-       mit allen Mitteln um die Gunst der wertvollen Ent-
triebsteam wiederum stellt dann fest, dass die Software     wicklerressourcen. Keine Entwickler zu finden, ist für
so nicht den Betriebsanforderungen entspricht oder viel-    moderne Unternehmen existenzgefährdender als der
leicht auch einfach nur essenzielle Artefakte wie etwa      fehlende Zugang zu frischem Kapital an den Finanz-
das Betriebshandbuch fehlen. Indes ärgert sich der Fach-    märkten. Umso wichtiger ist es, eine solide und nach-
bereich über die mangelnde Kompetenz der IT und die         haltige Basis für einen langfristigen Erfolg zu schaffen.
Verzögerung bei der Inbetriebnahme. Ist die Software an     Nachfolgend erläutere ich einige der Grundprinzipien
den Betrieb übergeben, lehnt sich die Entwicklungsab-       von DevOps.
teilung oftmals entspannt zurück, denn ihre Bringschuld        Kultur der Zusammenarbeit: Das A und O einer er-
ist erfüllt. Kommt es im Betrieb einer Applikation zu       folgreichen DevOps-Strategie ist das Erlangen einer
Problemen, geht das Fingerzeigen erneut los. Der Betrieb    Kultur der Zusammenarbeit. In einer traditionell aus-
beschuldigt die Entwickler, die Entwickler den Betrieb.     gerichteten IT verfolgen Entwicklung und Betrieb unter-
In großen Unternehmen können diese Extra­          runden   schiedliche Ziele mit unterschiedlichen Prioritäten. Die
schon einmal Wochen oder gar Monate an Verzug be-           Entwicklung ist meist agiler und benötigt die Freiheit,
deuten; ein Zeithorizont, der sich nicht mit einer agilen   Änderungen vornehmen zu können, der Betrieb hinge-
Strategie und der Verkürzung von Go-to-Market-Zyk-          gen schwört auf Stabilität. Eine enge Zusammenarbeit
len vereinbaren lässt.                                      dieser Bereiche ist jedoch einer der wichtigsten Aspekte,
   In einem DevOps-Szenario übernimmt das Team,             wenn es um DevOps geht. Das Schaffen eines Informa-
bestehend aus Produktmanagern, Entwicklern und Be-          tionsaustauschs in Echtzeit ermöglicht es den Teams,
triebsleuten, gemeinsam die Verantwortung für einen         einerseits schnelle Änderungen an einer Applikation
erfolgreichen Ablauf und Betrieb. Alle verfolgen diesel-    vornehmen zu können und andererseits eine stabile und
ben Ziele und ziehen am gleichen Strang. Welche kriti-      robuste Betriebsumgebung zu erhalten. Tools wie etwa
schen Erfolgsfaktoren neben der Kultur noch existieren      Slack, Yammer und Microsoft Teams können dazu
und welche Tools und Plattformen bei der Einführung         verhelfen, die Hürden einer klassisch formalen E-Mail-
von DevOps hilfreich sein können, werden wir im Fol-        Kommunikation abzubauen.
genden betrachten.                                             Einhalten von Architekturrichtlinien: Um die Be-
                                                            treibbarkeit, Stabilität und Kompatibilität einer Soft-
Die Säulen des Erfolgs                                      ware zu sichern, ist es wichtig, Leitlinien zu definieren
Auch wenn einige Unternehmen DevOps nur nutzen,             und diesen zu folgen. Enthält eine Applikation bei-
um kurzfristige Effizienzvorteile zu erhalten, wird         spielsweise viele direkte Abhängigkeiten zu anderen
diese Methodik doch mehr und mehr zu einem unver-           Applikationen, Datenbanken oder anderen Systemen,
zichtbaren Bestandteil für sämtliche Wirtschaftsbe-         kann das schnell zu einem hohen Maß an Komplexität
                                                            führen. Das kann sich wiederum negativ auf Testauf-
                                                            wände, aber auch Key Performance Indicators (KPIs)
                                                            wie die Deployment Success Rate auswirken. Probleme
                                                            im Applikationsbetrieb müssen schnell identifiziert und
   DevOps für klassische                                    behoben werden. Hierfür ist eine standardisierte Integ-
                                                            ration von Logging und Monitoring in die Applikation
   Windows-Desktopanwendungen
                                                            ebenfalls unabdingbar. Oftmals wird im Kontext dieser
   Thomas Schissler (agileMax)                              Design-for-DevOps-Best-Practices von zwölf Faktoren
                  Der Begriff DevOps wird von vielen mit    gesprochen, auf die im späteren Verlauf des Artikels
                  hypermodernen Cloud- und Webtech-         eingegangen wird.
                  nologien in Verbindung gebracht. Die         Infrastruktur und Plattform: Die Infrastruktur trägt
                  Prinzipien von DevOps lassen sich aber
                                                            einen maßgeblichen Teil zu einem stabilen Applikati-
                  auch für klassische Desktopanwendun-
   gen und andere Legacy-Technologien anwenden. Die         onsbetrieb bei und ist eine essenzielle Komponente in
   technischen Hürden sind oftmals gar nicht so groß,       DevOps-Szenarien. Häufig kommen Plattformen wie
   aber natürlich sind ein paar Anpassungen dafür not-      OpenShift, Clound Foundry oder Azure zum Einsatz,
   wendig. Im Vortrag zeigen wir an einem Beispiel, wie     die einen sehr hohen Grad der Automation erlauben
   eine klassische WPF-Anwendung für DevOps fit ge-         und als gemeinsame Basis für das DevOps-Team fun-
   macht werden kann und mit welchen Tools Continuous       gieren. Die Entwickler können sich dadurch voll und
   Delivery und Monitoring möglich werden.
                                                            ganz auf ihre Aufgabe – das Entwickeln – fokussieren.
                                                            Die Betriebseinheit des Teams kann zum Beispiel die

www.basta.net                                                                                                      5
EXPERTEN-DOSSIER 2019 - ÜBER 80 SEITEN MIT PRAXISORIENTIERTEM WISSEN FÜR .NET-ENTWICKLER RUND UM .NET CORE, AZURE DEVOPS, TYPESCRIPT, COSMOS DB ...
DOSSIER                 Agile & DevOps

Entwickler durch das Bereitstellen von Infrastruk-            Erzeugen von Messbarkeit: Damit ein DevOps-Team
turtemplates unterstützen.                                 maximal erfolgreich wird und sich die Erfolge auch be-
   Dass jede Applikation auf einer einheitlichen Platt-    legen lassen, spielt das Erzeugen von Messbarkeit eine
form läuft, trägt zu einer allmählichen Effizienzstei-     große Rolle. Dadurch, dass viele Prozesse zentral und
gerung bei, da nicht bei jeder Inbetriebnahme einer        automatisiert ablaufen, lassen sich jede Menge Daten
Applikation erneut darüber diskutiert werden muss, wo      erzeugen, die sich dann wiederum auswerten lassen und
sich die Logs befinden, wie Loglevel zu konfigurieren      aus denen Optimierungspotenziale abgeleitet werden
sind oder wie ein Rollback auf eine frühere Applikati-     können. Da eine Vielzahl von KPIs existiert, ist eine
onsversion durchzuführen ist.                              projektindividuelle Festlegung durchaus sinnvoll, denn
   CI/CD Pipeline: Das Verwenden eines zentralen           nicht jede KPI hat für jedes Projekt die gleiche Relevanz.
Code-Repositorys ist für Entwickler ein alter Hut und      Gute Beispiele für Metriken im Kontext von DevOps
ein wesentlicher Bestandteil von DevOps. Alle Code-        sind die Bereitstellungsfrequenz sowie die Bereitstel-
änderungen werden regelmäßig in ein zentrales Re-          lungszeit. Ein häufig definiertes Ziel ist es, möglichst vie-
pository wie etwa Git zusammengeführt. Nach dem            le, kleine Deployments durchzuführen. Dadurch sinken

      Damit ein DevOps-Team maximal erfolgreich wird,
       und sich dieser Erfolg auch belegen lässt, spielt
       das Erzeugen von Messbarkeit eine große Rolle.
Check-in werden diese Änderungen automatisiert             die Testaufwände für ein Release, und potenzielle Fehler
erstellt und getestet. Die Hauptziele von Continuous       lassen sich leicht eingrenzen.
Integration bestehen darin, Bugs möglichst schnell zu         In diesem Zusammenhang spielt natürlich auch die
entdecken und zu beheben, die Qualität der Software        für eine Bereitstellung benötigte Zeit eine große Rol-
zu optimieren und den Zeitraum bis zum Go Live             le: Je kürzer die für ein Release benötigte Zeit, desto
auf ein Minimum zu reduzieren. Das übergeordnete           schneller lassen sich im Fehlerfall Korrekturen auf dem
Ziel ist, die Entwicklerproduktivität zu steigern und      System einspielen. Die allgemeine Servicequalität kann
„Stupid Work Tasks“ zu eliminieren bzw. zu auto-           zum Beispiel durch die Verfügbarkeit der Systeme und
matisieren. Das gelingt zum Beispiel durch Testauto-       die Anzahl an Benutzertickets gemessen werden. Im Ide-
matisierung; nach einem erfolgreichen Build-Prozess        alfall werden Störungen und Probleme behoben, bevor
lassen sich beispielsweise Unit-, Komponenten-, UI-,       sie bis zum Benutzer vordringen, zum Beispiel durch ein
Last- oder API-Tests durchführen. Die Ergebnisse           intelligentes Application-Monitoring. Hierzu eignen
fließen wiederum in Reports ein, mit denen sich der        sich Tools wie Retrace, Grafana oder App Dynamics,
Erfolg des Teams messen lässt. Anhand der Resultate        die wiederum eine Vielzahl von Parametern wie etwa
kann ebenfalls eine Entscheidungsgrundlage für z. B.       Application-Performance, Bandbreiten oder Applikati-
ein automatisiertes Deployment geschaffen werden.          onsfehler überwachen. Neben den hier beispielhaft auf-
   Eine hundertprozentige Testautomatisierung ist je-      geführten Metriken existiert natürlich noch eine ganze
doch nicht realistisch. Die Kunst liegt darin, unter den   Reihe weiterer KPIs.
Testtasks diejenigen zu identifizieren, die sich leicht       Um eine kontinuierliche Verbesserung der Werte zu
automatisieren lassen und einen hohen Mehrwert für         erreichen, ist es empfehlenswert, einen regelmäßigen
das Team schaffen. Erfahrungsgemäß lassen sich ca.         Austausch innerhalb des DevOps-Teams anzustreben.
40–60 Prozent aller Testaufgaben automatisieren. Die       Das kann zum Beispiel in Form von Meetings erfolgen,
Integration von Artefakten wie etwa Testautomatisie-       bei denen die Beteiligten darüber sprechen, welche Fak-
rung bildet den Continuous-Delivery-Teil einer CI/CD       toren sich ihrer Meinung nach besonders negativ auf
Pipeline ab. Gelegentlich wird in diesem Zusammen-         einzelne KPIs oder den gesamten Service auswirken.
hang auch von Continuous Deployment gesprochen.            Diese Punkte lassen sich dann wiederum gezielt verbes-
Diese zwei Varianten unterscheiden sich lediglich durch    sern oder gar eliminieren.
das Vorhandensein einer manuellen Genehmigung. Bei
Continuous Delivery erfolgt das Deployment zunächst        DevOps-kompatible Softwarearchitektur
auf eine nicht produktive Test- oder Integrationsumge-     Da es sich bei DevOps in erster Linie um eine Philoso-
bung. Nach erfolgreichem Test und einer Freigabe wird      phie handelt und nicht um eine Technologie, ergeben
das Release dann in die Produktionsumgebung gestaget.      sich vielleicht zunächst Fragen, inwieweit DevOps die
Bei Continuous Deployment wird auf diesen zusätzli-        zugrunde liegende Technologie beeinflusst oder sie gar
chen Prüfschritt verzichtet und die Produktionsumge-       voraussetzt. Das im Mittelpunkt stehende Ziel von Dev­
bung unmittelbar aktualisiert.                             Ops ist meist die Erreichung maximaler Effizienz und

www.basta.net                                                                                                         6
EXPERTEN-DOSSIER 2019 - ÜBER 80 SEITEN MIT PRAXISORIENTIERTEM WISSEN FÜR .NET-ENTWICKLER RUND UM .NET CORE, AZURE DEVOPS, TYPESCRIPT, COSMOS DB ...
DOSSIER                 Agile & DevOps

größtmöglicher Ökonomie. Um diese Ziele zu erreichen,      zentral aufgelöst werden. Auch Problemen, die durch
bedarf es neben dem richtigen Mindset und einer Dev­       eine Diskrepanz in den Versionen entstehen, lässt sich
Ops-kompatiblen Organisation auch der Wahl eines           so vorbeugen. Das gleiche Paradigma gilt für Services
fortschrittlichen Technologiestacks. Die Basis hierfür     oder Ressourcen, die von einer Applikation verwendet
bildet in der Regel eine DevOps-Plattform wie etwa         werden. Dazu zählen zum Beispiel Datenbank- oder
OpenShift, Cloud Foundry oder Azure DevOps. Diese          SMTP-Dienste sowie APIs. Eine App muss stets so
Plattformen bieten integrierte Funktionen wie ein Con-     entwickelt werden, dass es für die Einbindung und
tainermanagement, die notwendige Containerlaufzeit-        Nutzung der Services und Ressourcen unerheblich ist,
umgebung, Lastenausgleichsmodule, Integration von          von welchem Anbieter sie zur Verfügung gestellt wer-
Source-Code-Management und Build-Tools, CI/CD              den. Im Rahmen eines Bereitstellungsprozesses ist es
Pipelines sowie weitere nützliche Features.                üblich, dass pro Umgebung eine eindeutige Konfigu-
   Mit der Festlegung auf eine DevOps-Plattform wird       ration festgelegt wird. Diese Konfigurationsparameter
also in gewisser Weise auch die Entscheidung für einen     müssen sich zwingend von außerhalb der Applikation
Basistechnologiestack gefällt, der in der Regel auch ein   ändern lassen. Ein Hinterlegen dieser Konfiguration
Containerkonzept mit sich bringt. Die aktuell wohl be-     im Code durch Konstanten, zum Beispiel für System-
kannteste Implementierung der Containertechnologie         zugangsdaten oder Datenbankverbindungsfolgen,
ist Docker, die aufgrund ihrer Einfachheit und Benut-      stellt einen klaren Verstoß in einer 12-Faktor-Archi-
zerfreundlichkeit den Begriff überhaupt erst populär       tektur dar.
gemacht hat. Die Idee hinter Containern ist eigentlich        In einer 12-Faktor-App wird strikt zwischen Build-,
recht einfach: Ein Container fasst eine einzelne An-       Release- und Run-Phase unterschieden. Checkt der
wendung mitsamt allen notwendigen Abhängigkeiten           Entwickler neuen Code ins Repository ein, wird mit
wie etwa Bibliotheken oder statischen Inhalten in einer    der Build-Phase die Transformation des Codes in ein
Image-Datei ohne Overhead zusammen. Im Gegensatz           ausführbares Paket angestoßen. Im nächsten Schritt,
zu einer virtuellen Maschine enthält ein Container         der Releasephase, wird das Build-Ergebnis mit der zum
aber kein komplettes Betriebssystem und benötigt da-       Deployment passenden Konfiguration kombiniert.
her auch weniger Ressourcen. Ein bedeutender Vorteil       In der Run-Phase, der sogenannten Laufzeit, wird die
der Docker-Container ist die gute Skalierbarkeit: Wer-     Applikation dann ausgeführt. Aufgrund dieser strikten
den aufgrund des Lastverhaltens zusätzliche Instanzen      Trennung sind Codeänderungen zur Laufzeit nicht mög-
einer Anwendung benötigt, lassen sich nach Belieben        lich, weil es keinen Weg gibt, die Änderungen zurück
neue Container auf Basis eines Images erzeugen. Nach       in die Build-Phase zu übernehmen. Es empfiehlt sich,
dem Stoppen sind die Container wieder vollständig          jedes Release separat mit einem eindeutigen Identifier
aus dem System verschwunden und alle Ressourcen            und Erstelldatum und -uhrzeit abzulegen. Das ermög-
werden freigegeben. Die Konfiguration ist so weit wie      licht im Fehlerfall ein schnelles Rollback der Lösung.
möglich bereits im Container-Image eingerichtet. Zu-       Eine 12-Faktor-App sollte immer zustandslos sein. Alle
sätzlich notwendige Anpassungen sollten skriptbasiert      Daten werden in unterstützenden Diensten, in der Re-
erfolgen.                                                  gel einer Datenbank, gespeichert. Der RAM oder das
   Um das volle Potenzial der Containertechnolo-           lokale Dateisystem können als kurzzeitiger Cache für
gie auszunutzen, müssen die darin ausgeführten             eine Transaktion verwendet werden. Es darf aber nie-
Applikationen verschiedene Architekturrichtlinien          mals davon ausgegangen werden, dass Daten für einen
berücksichtigen. In diesem Kontext wird häufig von         längeren Zeitraum vorgehalten werden oder durch eine
12-Faktor-Applikationen gesprochen [1]. Hinter die-
sem Konzept verbergen sich zwölf Punkte, die Ent-
wicklern dabei helfen sollen, Applikationen so zu
designen und zu entwickeln, dass sich diese als SaaS
(Software as a Service) und letztendlich auch prob-           Architektur, aber bitte agil!
lemlos in Containern betreiben lassen. Ein wichtiges          Urs Enzler (bbv Software Services AG)
und zugleich selbstverständliches Kriterium der zwölf
                                                                            Architektur steht für Stabilität und weit-
Faktoren ist, dass der Quellcode einer Applikation                          reichende Entscheidungen. Und das soll
stets in einer Versionsverwaltung wie zum Beispiel Git                      in einem schnelllebigen, flexiblen agilen
verwaltet wird. Dabei besteht immer eine eindeutige                         Projekt möglich sein? Ich zeige in dieser
Korrelation zwischen einer Codebasis und einer App.                         Präsentation, wie sich Architektur mit
Zwei Applikationen können sich nach diesem Kon-               den User Stories zusammen evolutionär entwickeln
zept also einen Quellcode teilen. Das Vorhalten des           kann, wie Entscheidungen bis zum richtigen Zeit-
                                                              punkt vertagt werden können und welche agilen
Quellcodes ist ebenfalls ein wesentliches Erfordernis
                                                              Architekturmuster es gibt. Ihr lernt, wie eine agile
für den Aufbau einer CI/CD Pipeline. Applikationen            Architektur schnelle Änderungen, einfache Archi-
sollten keine direkten Abhängigkeiten untereinander           tekturvalidierung und ein immer lauffähiges System
aufweisen. Durch das Verwenden eines Package Ma-              ermöglicht.
nagers lässt sich sicherstellen, dass Abhängigkeiten

www.basta.net                                                                                                            7
EXPERTEN-DOSSIER 2019 - ÜBER 80 SEITEN MIT PRAXISORIENTIERTEM WISSEN FÜR .NET-ENTWICKLER RUND UM .NET CORE, AZURE DEVOPS, TYPESCRIPT, COSMOS DB ...
DOSSIER                 Agile & DevOps

                                                             Azure DevOps
                                                             Die Zeichen, die Microsoft aussendet, sind deutlich:
                                                             Schon länger versucht der Konzern, ein Open-Source-
                                                             freundlicheres Image aufzubauen. Ein großer Schritt in
                                                             diese Richtung war der Beitritt Microsofts zum Open
                                                             Innovation Network (OIN) und der damit verbunde-
                                                             nen Bereitstellung von 60 000 eigenen Patenten. Ein
                                                             weiterer bedeutender Schritt ist das Aufgeben der Mar-
                                                             ke „Visual Studio“. Die Cloud-Dienste für Entwickler,
                                                             ehemals Visual Studio Team Services (VSTS), laufen
                                                             ab sofort unter dem Brand „Azure DevOps“. Auch das
                                                             lokal installierbare Gegenstück zu den VSTS, das seit
                                                             2005 unter dem Namen „Team Foundation Server“
                                                             (TFS) auf dem Markt ist, erhält ab der Version 2019
                                                             einen Brand: „Azure DevOps Server 2019“. Dieses
                                                             Rebranding soll vor allem dafür sorgen, die Assozia-
                                                             tion in den Köpfen vieler Entwickler zwischen Visual
                                                             Studio und den klassischerweise damit verbundenen
                                                             Programmiersprachen C++, C#, F# etc. zu lösen. Ne-
                                                             ben dem neuen Markennamen spendiert Microsoft
                                                             natürlich auch noch ein paar neue Features wie etwa
                                                             die „Azure Pipelines“. Hierbei handelt es sich um eine
                                                             leistungsstarke CI/CD Pipeline Engine, die mit nahezu
                                                             jeder gängigen Programmiersprache und einer Vielzahl
                                                             von Projekttypen arbeitet. Natürlich gab es auch in
                                                             der altbekannten Version bereits eine CI/CD Pipeline,
                                                             doch vor dem Hintergrund immer größer werdenden
Abb. 1: Azure DevOps Pipelines
                                                             Leistungsdrucks stellt die CI/CD Pipeline eine Kompo-
                                                             nente dar, die sicherlich noch viel Potenzial für Opti-
andere Transaktion nutzbar sind. In einer skalierbaren       mierung bietet. Azure Pipelines bieten die Möglichkeit,
Umgebung ist es ebenso denkbar, dass ein künftiger           verschiedenste Zielsysteme für Bereitstellungsszenarien
Request von einer anderen Instanz als der ursprünglich       zu adressieren. Dazu gehören neben den Azure-eigenen
angefragten und somit in einem anderen Transaktions-         Services, wie „Azure App Services“ oder „Azure Ku-
Scope bearbeitet wird. Da diese Flexibilität ein we-         bernetes Service“ (AKS), auch virtuelle Maschinen,
sentlicher Teil der Grundidee ist, müssen Prozesse so        klassische Container Registries oder Deployments zu
ausgelegt werden, dass sie eine möglichst geringe Start-     Amazon Web Services. Eine neue Pipeline kann einfach
zeit haben. Im Idealfall ist ein Prozess innerhalb weniger   über den Menüpunkt Pipelines auf der linken Seite
Sekunden hochgefahren und einsatzfähig. Eine kurze           der Azure-DevOps-Weboberfläche erstellt werden
Start-up Time verleiht dem System noch mehr Agilität         (Abb. 1).
und Robustheit. Gleiches gilt natürlich für das Herun-          Für das Erstellen einer Build Pipeline ist es zunächst
terfahren eines Prozesses.                                   erforderlich, eine Quelle auszuwählen, von der aus
   Um das Verhalten einer laufenden Applikation sicht-       der Source Code abgerufen werden soll. Kompatible
bar zu machen, ist Logging unabdingbar. Häufig wer-          Quellcodeverwaltungssysteme sind zum Beispiel Git-
den Logs gezielt an einem bestimmten Ort, wie dem            Hub, Azure Repos Git, Subversion etc. Anschließend
Dateisystem oder einer Datenbank, abgelegt. Dieses           erfolgt die eigentliche Build-Konfiguration, die aber
Verhalten wird oftmals durch die Applikation be-             nicht jedes Mal aufs Neue manuell durchgeführt werden
stimmt. Im Fall einer 12-Faktor-App ist es nicht mehr        muss. Stattdessen kann der Benutzer aus einem Temp-
Aufgabe der Applikation, sich um einen Ablageort zu          latekatalog auswählen. So ist es mittels weniger Klicks
kümmern. Stattdessen werden sämtliche Ereignisse un-         beispielsweise möglich, eine Build Pipeline für eine
gepuffert in den stdout-Stream geschrieben. Die wei-         Azure-Web-App for ASP.NET zu konfigurieren. Sind
tere Verarbeitung dieser Ereignisinformationen obliegt       Container das präferierte Zielmodell, ist eine direkte
dem Hostsystem. Es entscheidet alleinig, ob und wohin        Containerisierung mit anschließender Bereitstellung in
die Logs persistiert werden. Das Einhalten der hier auf-     einer Container-Registry ebenfalls mit einem überschau-
gezeigten Leitlinien trägt zu einer sauberen und ska-        baren Aufwand realisierbar. Wer sich in der Welt von
lierbaren Applikationsarchitektur bei. Auch wenn dies        YAML, einem JSON-ähnlichen deklarativen Format,
prinzipiell für jede Applikation gilt, sollte dem Thema      wohlfühlt, ist eingeladen, die Build-Konfiguration auf
im Kontext von DevOps eine besondere Bedeutung zu-           Basis dieses Formats festzulegen. Das Erstellen einer Re-
gemessen werden.                                             lease-Pipeline fühlt sich ähnlich komfortabel an. End to

www.basta.net                                                                                                       8
EXPERTEN-DOSSIER 2019 - ÜBER 80 SEITEN MIT PRAXISORIENTIERTEM WISSEN FÜR .NET-ENTWICKLER RUND UM .NET CORE, AZURE DEVOPS, TYPESCRIPT, COSMOS DB ...
DOSSIER           Agile & DevOps

Abb. 2: Konfiguration einer Release-Pipeline

end gedacht, dient die Release-Pipeline dazu, den Code       „Agile Operating Model“ bis Ende 2019 angekündigt
für die Benutzer auf einem System verfügbar zu machen.       hat. Das Zauberwort für das Erreichen all dieser Ziele
Ihre Konfiguration erfolgt mittels eines grafischen Edi-     lautet DevOps. Hierzu gehört jedoch viel mehr als nur
tors (Abb. 2).                                               das Einführen neuer Technologien und Plattformen.
   Als Ausgangsbasis dient ein sogenanntes „Artifact“.       Es gehört ebenfalls mehr dazu als nur das Vorhaben,
Hierbei handelt es sich vereinfacht gesagt um den be-        Abteilungen und Bereiche zusammenzuführen. Es han-
reitstellbaren Teil einer Applikation, der in der Regel      delt sich erst einmal um eine Revolution im Kopf aller
durch die Build Pipeline erzeugt wird. Am Artefakt           Beteiligten, einen Umdenkprozess, der von höchster
selbst lässt sich wiederum das Verhalten über soge-          Ebene angeregt werden muss. Dabei ist es vor allem
nannte Trigger festlegen. Der Bereitstellungsprozess         wichtig, die häufig im Kopf existierenden Silos abzu-
wird somit zum Beispiel automatisch gestartet, sobald        reißen. Auch wenn bei DevOps die Technik nicht im
ein neuer Build zur Verfügung steht. Auch ein manu-          Vordergrund steht, bedarf es natürlich entsprechender
eller Eingriff mittels Pull Request lässt sich einstellen.   Konzepte und einheitlicher Plattformen, um die größt-
Über die Stages wird definiert, welche Umgebung zu           mögliche Effizienz bei der Entwicklung zu erzielen.
welchem Zeitpunkt mit welchen Voraussetzungen de-            Finden all diese Punkte Berücksichtigung und gelingt
ployt wird. Um den Konfigurationsprozess so einfach          der Schulterschluss zwischen Entwicklung, Betrieb und
wie möglich zu gestalten, existieren auch hierfür zahl-      Fachbereichen, steht einer erfolgreichen DevOps-Or-
reiche vorgefertigte Tem­plates für eine Bereitstellung      ganisation nichts mehr im Weg.
auf Azure, Kubernetes, IIS etc. Das Deployment einer
Stage kann an verschiedene Pre- und Post-Conditions
geknüpft werden. Hierbei kann es sich beispielsweise                  Kevin Gerndt arbeitet als Lead Consultant im Bereich
um ein automatisch ausgelöstes Event oder eine benut-                 Microsoft .NET Client und Web Technologies und hat
zergetriebene Aktion handeln. Gates ermöglichen eine                  während seiner beruflichen Laufbahn schon eine Viel-
                                                                      zahl an Projekten begleitet. Er gilt als Experte auf dem
Integration von REST APIs, Azure Monitor Alerts oder                  Gebiet der modernen Web- und Softwarearchitektur
Azure Functions. Sollte beim Deployment doch mal et-         und ist darüber hinaus als freiberuflicher Autor tätig, sowie re-
was schieflaufen, erlaubt die History eine transparente      gelmäßig auf namhaften Konferenzen vertreten. Schwerpunkte
Einsicht in Änderungen sowie ein kontrolliertes Zu-          seiner Tätigkeit bilden die Analyse und Implementation von Ge-
rückrollen des Release.                                      schäftsprozessen sowie das Konzipieren und Entwickeln moder-
                                                             ner Softwarelösungen.

Fazit
In Zeiten zunehmenden Wettbewerbsdrucks ist es
wichtiger denn je, der Konkurrenz immer einen Schritt
voraus zu sein. Dies trifft auf die Entwicklung phy-
sischer Güter, aber vor allem immer stärker auf di-
gitale Services und Produkte zu. Mit der klassischen
Unternehmensorganisation fällt es jedoch vor allem
großen Konzernen mit ihrer Silostruktur schwer, mit
dem vorherrschenden Tempo mitzuhalten. Doch im-
mer mehr Unternehmen passen sich an und vollziehen
einen Strukturwandel oder gründen Start-ups aus, um
der heutzutage geforderten Agilität gerecht zu werden.       Links & Literatur
Ein gutes Beispiel ist der Automobilkonzern BMW,
dessen Vorstand einen radikalen Wandel in Richtung           [1] https://12factor.net

www.basta.net                                                                                                               9
EXPERTEN-DOSSIER 2019 - ÜBER 80 SEITEN MIT PRAXISORIENTIERTEM WISSEN FÜR .NET-ENTWICKLER RUND UM .NET CORE, AZURE DEVOPS, TYPESCRIPT, COSMOS DB ...
DOSSIER                   Microservices & APIs

Entwicklung von Microservices mit Microsoft .NET

Warum einfach? Es
geht auch komplex!
Wie zu erwarten zieht das heißdiskutierte Thema Microservices auch an Microsoft nicht
vorüber. Grund genug, einmal näher zu betrachten, wie man als .NET-Entwickler bei der
Entwicklung von Microservices mit Docker von technischer Seite unterstützt wird.

von Dr. Felix Nendzig                                       Entwicklung kann in kleinen, unabhängigen Teams
                                                            mit geringem Kommunikationsbedarf untereinander
Mit „.NET Microservices: Architecture for Contain­          stattfinden. Um einen Vorteil gegenüber einer monoli-
erized .NET Applications“ hat Microsoft nun ein mehr        thischen Anwendung zu erreichen, sollten die Microser-
als dreihundertseitiges E-Book veröffentlicht, in dem       vices jeweils folgende Bedingungen erfüllen:
das Unternehmen seine Sicht auf das Thema umfassend
vorstellt und insbesondere die Benutzung von Docker         • Ein Service erfüllt genau einen fachlichen Zweck und
bei der Entwicklung von Anwendungen mit Microser-             diesen vollständig
vices-Architektur empfiehlt [1].                            • Jeder Service umfasst sämtliche benötigte Schichten,
  In diesem Beitrag soll Microsofts Sicht auf das Thema       Teams arbeiten unabhängig voneinander (vertikaler
Microservices näher beleuchtet und mit Blick auf unsere       Schnitt)
eigene Erfahrung kommentiert werden. Weiterhin wer-         • Asynchrone Kommunikation zwischen Services (kei-
den wir darauf eingehen, wie Docker bei der Entwick-          ne zentral steuernde Einheit)
lung von Microservices genutzt werden kann.                 • Keine gemeinsamen Daten oder Code (shared
                                                              Nothing)
Was ist eine Microservices-Architektur?                     • Jeder Service ist unabhängig deploybar
Das zentrale Erkennungsmerkmal einer Microservices-         • Unabhängige Datenmodelle und minimale APIs zur
Architektur ist, dass sich die gesamte Anwendung aus          Gewährleistung eigenständiger Entwicklungszyklen
einzelnen, voneinander unabhängigen Services zusam-
mensetzt. Durch Dezentralisierung und Autonomiema-          Der Name „Microservices“ impliziert, dass die ein-
ximierung soll auch bei komplexen Anwendungen eine          zelnen Services klein sein sollen. Diese Charakteri-
gute Skalierbarkeit in der Entwicklung – gegenüber ei-      sierung bezieht sich aber nicht auf die Lines of Code
ner monolithischen Architektur – erreicht werden. Die       oder die Anzahl der Klassen je Service. Stattdessen

www.basta.net                                                                                                   10
DOSSIER             Microservices & APIs

Abb. 1: Illustration zweier Bounded Contexts (Quelle: [2])

bedeutet es, dass ein Service nur genau eine sinnvolle         „2-Pizza-Regel“ liegt die maximale Teamgröße bei fünf
Funktion im Sinne der fachlichen Logik erfüllen soll.          bis neun Personen [4].
Diese Idee folgt dem Konzept des Bounded Context                 Eine verteilte Anwendung bringt allerdings auch
aus dem Domain-driven Design [2]. Danach wird ein              zusätzliche Schwierigkeiten mit sich, die bei falscher
großer fachlicher Themenbereich in kleinere Bereiche,          Vorgehensweise zu einer Verschlechterung gegen-
die Bounded Contexts (Abb. 1), aufgeteilt, die jeweils         über einem Monolith führen können: Es gibt keine
ihre eigenen, eindeutigen Fachbegriffe benutzen (Ubi-          zentrale Steuerung, sodass querschnittliche Aufgaben
quitous Language). Ein Microservice überschreitet              wie Service-übergreifendes Monitoring oder Logging
keinesfalls die Grenzen eines Bounded Contexts. Er             zusätzlichen Entwicklungsaufwand mit sich bringen.
implementiert maximal den gesamten Bounded Con-                Externe Tools wie der ELK-Stack [5], Zipkin [6], Jae-
text, typischerweise aber nur einen Teilbereich.               ger [7] und AppDynamics [8] können hier Abhilfe
   Man sollte die kleinsten Microservices implemen-            schaffen. Die Durchführung von Service-übergreifen-
tieren, die die oben genannten Bedingung erfüllen.             den Integrationstests oder Refactorings wird schwie-
Wird die optimale Größe unterschritten, wachsen                riger. Transaktionen sind auf einzelne Microservices
die Abhängigkeiten der Services untereinander. Das             begrenzt. Das Prinzip des „shared Nothing“ erzwingt,
verschlechtert die Performance der Anwendung zur               dass jeder Service seine benötigten Daten replizieren
Laufzeit und während der Entwicklung durch erhöh-              oder über Schnittstellen von anderen Services abfragen
ten Kommunikationsbedarf über Service- und Team-               muss. Jedes Entwicklerteam hat zusätzlichen Aufwand
grenzen hinweg. Der Schnitt der Microservices sollte           durch erschwertes Debugging, eine eigene Fehlerbe-
deren innere Kohäsion maximieren und die Abhän-                handlung je Microservice, die Bereitstellung einer
gigkeiten nach außen minimieren. Gemäß dem Gesetz              Delivery Pipeline etc. Ein ungünstiger Service-Schnitt
von Conway [3] sollten sich die Service-Grenzen hier-          führt zu ständigen Schnittstellenanpassungen, gemein-
bei an der Organisationsstruktur des Unternehmens              samen Releases mehrerer Services oder der Auslastung
orientieren. Es kann sich auch lohnen, dieses Prinzip          mehrerer Services durch eine einzige Anfrage.
umzukehren, und die Organisation so anzupassen,
dass man den aus Softwaresicht sinnvollsten Service-           Stateful oder stateless Microservices?
Schnitt wählen kann.                                           In einer verteilten Anwendung kann eine variierende An-
   Bei richtiger Umsetzung erhält man ein skalierba-           zahl von Service-Instanzen simultan laufen. Der Orchest-
res System lose gekoppelter Services, die unabhängig           rator (mehr dazu etwas später) kann jederzeit Instanzen
voneinander entwickelt und ausgeliefert werden kön-            auf einen anderen Knoten schieben oder die Anzahl lau-
nen. Releasezyklus, Entwicklungs- und Betriebsumge-            fender Instanzen an die momentane Auslastung anpassen.
bung können je Service passend gewählt werden. Der             Man kann sich nicht darauf verlassen, dass eine spezielle
Testaufwand je Service sinkt, da er nicht übermäßig            Service-Instanz dauerhaft existiert. Das spricht gegen die
komplex ist und nur über Schnittstellen kommuniziert.          Implementierung von stateful Services, deren Zustand im
Die Entwicklung in kleinen Teams erzeugt nur geringen          Arbeitsspeicher gehalten und jederzeit repliziert werden
organisatorischen Aufwand. Ausgehend von Amazons               können muss. Für stateless Services stellt das kein Problem

www.basta.net                                                                                                          11
DOSSIER                     Microservices & APIs

Abb. 2: Möglichkeiten zur Strukturierung des GUI in einer Microservices-Architektur (Quelle: [10])

dar, da sie die Daten in eine externe Datenbank schrei-                   direkt auf aufrufende Services auswirken. Auf diese
ben oder im Client oder einem Cachetool wie bspw. Redis                   Weise wird schnell die Performance der Gesamtan-
­cachen. Die externe Datenquelle wird je Service passend                  wendung beeinträchtigt. Das Problem potenziert sich
 zu dessen Anforderungen gewählt.                                         noch, wenn mehrere synchrone Aufrufe in Reihe statt-
    Was ist aber mit Anwendungsfällen, in denen man                       finden. Bei asynchroner Kommunikation wirkt sich der
 Daten von verschiedenen Microservices sammeln oder                       Ausfall eines einzelnen Microservice dagegen nicht so
 anzeigen muss? Tritt ein solcher Fall auf, sollte man                    verheerend auf seine Nachbarn aus. Sie fördert zudem
 sich gut überlegen, ob der Service-Schnitt passend ge-                   die Autonomie der einzelnen Microservices.
 wählt wurde und ob nicht eine Verschmelzung von                             Da an der Verarbeitung eines Geschäftsprozesses im
 Microservices die beste Lösung darstellt. Lässt es sich                  Allgemeinen mehrere asynchron kommunizierende, un-
 jedoch nicht vermeiden, muss man bei der Implemen-                       abhängige Microservices beteiligt sind, ist es nicht mög-
 tierung besonders darauf achten, dass die Autonomie                      lich, stets Konsistenz im Sinne einer ACID-Transaktion
 der betroffen Microservices dadurch nicht einge-                         sicherzustellen. Latenzen, Teilausfälle und unterschied-
 schränkt wird. Zudem kann sich die Aggregation von                       liche Verarbeitungsdauern können zwischenzeitlich
 Daten verschiedener Services aufgrund erhöhter Kom-                      Service-übergreifende, inkonsistente Zustände erzeugen
 munikation negativ auf die Performance des Systems                       (Eventual Consistency), deren Behandlung zusätzlichen
 auswirken.                                                               Aufwand, z. B. in Form von Time­outs, Circuit Breakers
    Microsoft nennt als Alternative noch eine auf den An-                 und Bulkheads, erfordert [9].
 wendungsfall zugeschnittene, denormalisierte Tabelle
 in einer separaten Datenbank, in die die Microservices                   Das GUI
 jeweils ihre Daten schreiben. Aus Konsistenzgründen                      Sollten Clients direkt mit den Microservices kommu-
 dürfen die abfragenden Services auf diese nur lesend zu-                 nizieren oder den Umweg über ein vorgeschaltetes
 greifen. Mit Blick auf die geforderte Autonomie ist diese                API-Gateway nehmen? In der ersten Variante kann der
 Lösung allerdings kritisch zu sehen.                                     Client über einen URL direkt den betreffenden Service
                                                                          (bzw. einen vorgeschalteten Load Balancer) anfragen.
Inter-Service-Kommunikation                                               Jeder Microservice besitzt sein eigenes GUI oder ist in
Wie jede verteilte Anwendung muss auch eine Micro-                        einem Plug-in-Ansatz für einen Teil des GUI innerhalb
services-Anwendung mit Teilausfällen des Systems                          eines allgemeinen Rahmens verantwortlich.
umgehen können. Wie gut die Gesamtanwendung                                 Für kleine Anwendungen mit geringem Aufwand in
solche Ausfälle verkraftet, hängt maßgeblich von der                      der GUI-Entwicklung kann diese Variante ausreichen.
Inter-Service-Kommunikation ab. Synchrone Kom-                            Man bekommt jedoch schnell Probleme, wenn die
munikation, bei der der Aufrufer abwarten muss, bis                       Entwicklung der Benutzeroberfläche in mehreren Mi-
eine Antwort zurückgeliefert wird, kann bei lesendem                      croservices gleichzeitig stattfindet und zudem noch für
Zugriff gegebenenfalls eine Lösung für die Kommuni-                       verschiedene Endgeräte entwickelt werden muss. Sind
kation zwischen Front- und Backend sein. Innerhalb                        zum Aufbau einer Oberfläche mehrere unabhängige
des Backends ist sie allerdings zu vermeiden, da sich                     Abfragen nötig, erhöht das die Latenz. Ein besseres Er-
Verzögerungen und Ausfälle des angefragten Service                        gebnis erhält man, wenn die Daten zuvor serverseitig

www.basta.net                                                                                                                   12
DOSSIER                    Microservices & APIs

Ein Orchestrator ermöglicht eine einfache Steuerung
der Anwendung inklusive Scheduling, Load Balancing
und Gewährleistung von Verfügbarkeit und Robustheit.
aggregiert werden. Auch querschnittliche Anforderun-          Anwendungen, die in Docker-Containern laufen sollen.
gen wie Sicherheit, Autorisierung, Logging und Caching        Unterstützt wird die Entwicklung mit .NET Frame-
möchte man nicht individuell für jeden Microservice,          work, .NET Core und Mono in den Sprachen C#, F#
sondern gerne zentral implementieren.                         und VB. Mit .NET Core entwickelte Microservices sind
   Schaltet man ein API-Gateway zwischen die Clients          auf unterschiedlichen Plattformen lauffähig. Das mo-
und die Microservices-Landschaft, kann es das Routing         dulare .NET Core ist zudem sehr leichtgewichtig und
sowie weitere querschnittliche Aufgaben übernehmen.           damit besser geeignet, containerbasierte Anwendungen
Der Aufbau einer Oberfläche erfordert keine mehrfa-           mit möglichst kleinen Microservices zu entwickeln. Das
chen Roundtrips und Sicherheitsthemen können zentral          klassische .NET Framework ist vorzuziehen, wenn die
implementiert und verwaltet werden. Die Weiterent-            bereits bestehende Anwendung oder andere Abhängig-
wicklung der Anwendung wird erleichtert, da die Cli-          keiten das erfordern. Darunter würden zum Beispiel
ents nicht mehr über die Existenz bzw. Aufteilung der         dringend benötigte Pakete oder Technologien wie ASP.
Microservices Bescheid wissen müssen.                         NET Web Forms oder WCF fallen, die nicht in .NET
   Man sollte jedoch nicht einfach ein einzelnes „monoli-     Core verfügbar sind. Ab Visual Studio 2017 ist die Un-
thisches“ Gateway implementieren, sondern muss auch           terstützung für Docker bereits standardmäßig enthalten.
hier sowohl die Separation nach Geschäftsprozessen als        Für ältere Versionen können die Docker Tools nachins-
auch nach Client-Apps einhalten (Abb. 2). Anderenfalls        talliert werden [16].
erzeugt man ungewünschte Kopplungen zwischen den                Beim Anlegen eines neuen Projekts mit Docker Sup-
Microservices.                                                port wird ein passendes Dockerfile erzeugt. Zusätzlich
   Im Falle eines Web-UI mit dem Browser als Inte­            muss man noch „Container Orchestrator Support“
grationskomponente, dürfte der direkte Ansatz am              aktivieren, um für das Projekt ein Docker Compose
einfachsten umzusetzen sein. Die Entwicklung nativer          anzulegen bzw. zu aktualisieren. Es enthält mit der
Apps für diverse Endgeräte erzwingt dagegen den API-          Datei docker-compose.yml die Konfigurationsdaten
Gateway-Ansatz, bei der die Microservices im Backend          der Container und Deployment-Umgebung. So kann
einer übergeordneten Präsentationsschicht arbeiten            später für jeden Service ein separates Docker Image
(Backend for Frontend). Dieses Muster ist auch dann           erstellt werden. Der Entwicklungsworkflow in Visu-
zu bevorzugen, wenn man besonders viel ausgeklügelte          al Studio bleibt sonst größtenteils unverändert. Beim
Logik in der Oberfläche unterbringen will. Zwar sind
die Microservices ohne eigenes GUI nicht mehr unbe-
dingt als vollständige Anwendungen zu betrachten,
dennoch stellt das API-Gateway-Pattern keine Ver-
letzung der Microservices-Philosophie dar. Die Unab-             Microservices (Teil 1): Pragmati-
hängigkeit der Services untereinander, einschließlich            sche Architekturen mit .NET Core
ihrer Datenhoheit, bleibt bei richtiger Umsetzung er-
halten [11].
                                                                 – Patterns & Code
                                                                               Christian Weyer (Thinktecture)
Entwicklung mit Visual Studio und Docker                                       Angetrieben von möglichen Nachtei-
Microsoft empfiehlt, die Vorteile von Docker bei Ent-                          len einer monolithischen Architektur
wicklung, Deployment und Betrieb von Anwendungen                               sollen Microservices und damit verbun-
mit Microservices-Architektur zu nutzen. Für jeden Mi-                         dene Designpatterns und -ideen das
                                                                 scheinbare Allheilmittel sein. In diesem Vortrag erklärt
croservice wird ein eigenes Docker Image erstellt, sodass
                                                                 Christian Weyer, was Microservices sind, was sie nicht
zur Laufzeit schnell beliebig viele Instanzen in Form von        sind, wann man sie einsetzt und vor allem: Wie man
Docker-Containern erstellt werden können. Für diesen             Microservices in der .NET-Core-Welt baut. Sehen Sie
Ansatz mit allen damit verbundenen Fragestellungen               Architekturansätze und Patterns in Aktion und erleben
existiert eine umfangreiche Dokumentation [1], [12]-             Sie Technologien wie Service Discovery, Web-APIs,
[15]. Docker-Container passen gut in das Konzept der             Push Messaging, Message Queuing und Co. im
Microservices, da sie unabhängiges Deployment und                praktischen Einsatz. Versuchen wir also gemeinsam,
                                                                 langweilige Architekturthemen spannend zu machen –
Skalieren unterstützen.
                                                                 auf pragmatische Weise.
  Microsoft bietet in Visual Studio und Visual Studio
Code integrierte Unterstützung für die Entwicklung von

www.basta.net                                                                                                               13
DOSSIER             Sicherheit

      Abb. 3:                                                                  Containerclusters abstrahiert und so das Management
Auswirkung
  von Auto-
                                                                               einer Multicontaineranwendung ermöglicht. Er er-
 nomie und                                                                     laubt eine einfache Steuerung der Anwendung inklu-
  Komplexi-                                                                    sive Scheduling, Load Balancing und Gewährleistung
  tät bei der                                                                  von Verfügbarkeit und Robustheit. Plattformen, die
   Entwick-
    lung von
                                                                               als Orchestrator agieren können, sind beispielsweise
Monolithen                                                                     Azure Service Fabric, Kubernetes, Docker Swarm und
 und Micro-                                                                    Mesosphere DC/OS [18]-[22].
     services
       (Quel-
      le: [26])
                                                                               Wann verwendet man Microservices?
                                                                               So lange die Prozesse eines Unternehmens oder eines
                                                                               Geschäftsbereichs durch eine Anwendung mit mo-
                                                                               nolithischer Architektur abgebildet werden können,
                                                                               besteht kein Handlungsbedarf. Auch wenn die Anwen-
                                                                               dung schnell auf schwankende Last reagieren können
                                                                               muss, ist es nicht unbedingt nötig, den Flaschenhals
                  Starten der Anwendung werden die Docker Images               im System als eigenen Service auszulagern. Nutzt man
                  automatisch gebaut und direkt in Docker gestartet.           Docker, kann man einfach den gesamten Monolith in
                  Auch eine Multicontaineranwendung kann in Visual             einem Container deployen und bei Bedarf zusätzliche
                  Studio debuggt werden. In Microsofts Visual-Studio-          Instanzen hochfahren. Wird das System aber zu kom-
                  Dokumentation [17] wird erläutert, wie man eine              plex und steigt der Organisationsaufwand, dann wird
                  Containeranwendung direkt in die Azure Container             es zunehmend schwerer, die Weiterentwickelung voran-
                  Registry deployen kann. Das Deployen und Testen              zutreiben, dabei das System wartbar zu halten und den
                  sollte so früh wie möglich in Docker geschehen, da           Qualitätsanforderungen gerecht zu werden. Dann lohnt
                  so die Produktivumgebung exakt reproduziert werden           sich der Übergang zu einer Microservices-Architektur,
                  kann.                                                        um der Komplexität Herr zu werden.
                    Um das System skalierbar zu machen, muss man                  Während komplizierte – aber nicht komplexe –
                  eine Vielzahl Container gebündelt als Cluster mana-          Fachlichkeit gut durch monolithische Systeme abge-
                  gen und je nach Last die Anzahl der Service-Instan-          bildet werden kann, lassen sich komplexe Systeme
                  zen automatisch anpassen. Das wird erst durch einen          aufgrund einer Vielzahl wechselwirkender Teilsys-
                  Orchestrator ermöglicht, der die Komplexität eines           teme nicht vollständig analysieren und nur teilweise
                                                                               steuern. Es ist daher nicht möglich, die optimale Ar-
                                                                               chitektur eines komplexen Systems vorab zu bestim-
                                                                               men. Diese muss viel mehr iterativ entwickelt werden,
                                                                               wobei praktische Erfahrungswerte einfließen können.
                                                                               Damit das möglichst unkompliziert vonstattengehen
                     Microservices (Teil 2): Serverless-
                                                                               kann, sind z. B. kurze Releasezyklen, eine effektive
                     Architekturen – Event-basiert mit                         Delivery Pipeline und geringer Kommunikationsbe-
                     Azure Functions und Co.                                   darf durch kleine Teams nötig, wie es eine Micro-
                                   Christian Weyer (Thinktecture)              services-Architektur ermöglicht [23].Daraus folgt
                                     Wie bitte? Ohne Server? Ähm … Ja,         allerdings auch, dass es gefährlich ist, Microservices
                                     in der Tat. Der Serverless-Ansatz         auf der grünen Wiese zu entwickeln. Wählt man an
                                     verspricht mit niedrigen Hürden den       kritischen Stellen den falschen Service-Schnitt, kann
                                     Einstieg in Microservices zu finden. In   das folgenschwere Konsequenzen nach sich ziehen. Je
                     diesem Vortrag zeigt Christian Weyer die Grundla-         besser man die Geschäftsprozesse und das Verhalten
                     gen von Serverless mit Azure und .NET Core anhand         einer funktionierenden (aber schwer erweiterbaren)
                     praktischer Anwendungsfälle. Auf Basis erprobter
                                                                               monolithischen Anwendung studieren kann, desto
                     Designpatterns können Sie mit Azure Functions, Azure
                     Service Bus und Co. in kurzer Zeit sowohl einfache        besser kann man einschätzen, wo der optimale Schnitt
                     als auch komplexe Services-Anwendungen designen           zu setzen ist. Es ist allerdings anzumerken, dass diese
                     und implementieren – lokal und in der Cloud. Einer        Frage in der Literatur [24], [25] kontrovers diskutiert
                     der Schlüssel ist hierbei das Denken in Events, über      wird (Abb. 3) .
                     die Daten übertragen, verarbeitet und weitergeleitet
                     werden. Kommen Sie vorbei – eventuell lernen Sie die      Fazit
                     Basis für Ihr neues Businesssoftware-Backend kennen.
                                                                               Der Einsatz von Microservices zielt darauf ab, kom-
                                                                               plexe Anwendungen, die als Monolith nur schwer zu
                     HINWEIS: Dieser 2. Teil setzt Grundwissen aus Teil 1      managen wären, durch Dezentralisierung und Auto-
                     voraus!                                                   nomiemaximierung skalierbar, wartbar und leicht er-
                                                                               weiterbar zu machen. Jeder Microservice erfüllt dabei

                  www.basta.net                                                                                                    14
DOSSIER                       Microservices & APIs

genau eine Funktion im Sinne der fachlichen Logik.                         [7] https://www.jaegertracing.io
Die wichtigsten Treiber in Richtung Microservices sind                     [8] https://www.appdynamics.com
hohe Komplexität, hoher Innovationsbedarf sowie                            [9] https://www.informatik-aktuell.de/entwicklung/methoden/
Leidensdruck bei der Skalierung. Microservices erben                           microservices-sind-verteilte-systeme-asynchronitaet-und-eventual-
allerdings alle Probleme, die aus verteilten Anwendun-                         consistency.html
gen bekannt sind. Service-übergreifendes Monitoring                       [10] https://www.embarc.de/wp-content/uploads/2016/06/Architektur-
und Logging aber auch Refactoring und Testen stellen                           Spicker3-Microservices.pdf
eine Herausforderung dar. Zudem muss das System                           [11] https://www.informatik-aktuell.de/entwicklung/methoden/der-
mit Eventual Consistency und Teilausfällen zurecht-                            fachliche-schnitt-von-microservices-was-ist-das-was.html
kommen.                                                                   [12] https://www.docker.com/community-edition
  Auf der technischen Seite bringt Docker bei Entwick-                    [13] https://docs.docker.com/docker-for-windows/
lung und Betrieb von Microservices viele Vorteile wie
                                                                          [14] de la Torre, Cesar; Microsoft: „Containerized Docker Application Lifecycle
etwa schnelles Deployment und einfache Skalierbarkeit
                                                                               with Microsoft Platform and Tools“: https://azure.microsoft.com/de-de/
mit sich. Die nahtlose Integration in den Entwicklungs-                        resources/containerized-docker-application-lifecycle-with-microsoft-
workflow stellt besonders für den .NET-Entwickler ei-                          platform-and-tools/
nen großen Vorteil dar.
                                                                          [15] Lasker, Steve: „.NET Docker Development with Visual Studio 2017“:
                                                                               https://www.youtube.com/watch?v=hFCwfHo_Kbc
                                                                          [16] https://docs.microsoft.com/aspnet/core/publishing/visual-studio-
          Dr. Felix Nendzig studierte Physik am KIT und der Uni-
                                                                               tools-for-docker/
          versität Heidelberg, wo er auch promovierte. Der Wech-
          sel in die IT-Branche führte ihn zur Accso – Accelerated        [17] https://docs.microsoft.com/en-us/azure/vs-azure-tools-docker-
          Solutions GmbH, wo er als erfahrener Senior Software                 hosting-web-apps-in-docker/
          Engineer tätig ist.                                             [18] https://azure.microsoft.com/documentation/articles/container-service-
                                                                               intro/
                                                                          [19] https://docs.docker.com/swarm/overview/
Links & Literatur
                                                                          [20] https://docs.docker.com/engine/swarm/
[1] https://docs.microsoft.com/de-de/dotnet/standard/microservices-       [21] https://docs.mesosphere.com/1.10/overview/
    architecture/                                                         [22] http://kubernetes.io
[2] https://martinfowler.com/bliki/BoundedContext.html                    [23] https://www.informatik-aktuell.de/entwicklung/methoden/
[3] https://de.wikipedia.org/wiki/Gesetz_von_Conway                            microservices-nur-bei-ausreichender-komplexitaet.html
[4] https://www.informatik-aktuell.de/entwicklung/methoden/wie-gross-     [24] https://martinfowler.com/bliki/MonolithFirst.html
    darf-ein-microservice-sein-und-ist-das-ueberhaupt-wichtig.html        [25] https://martinfowler.com/articles/dont-start-monolith.html
[5] https://www.elastic.co/de/elk-stack                                   [26] https://www.informatik-aktuell.de/entwicklung/methoden/wann-und-
[6] https://zipkin.io                                                          fuer-wen-eignen-sich-microservices.html

www.basta.net                                                                                                                                        15
DOSSIER                  Microservices & APIs

Git erobert die Entwicklerwelt

Go Git!
Git ist „hip“ und gilt als Star unter den Versionskontrollsystemen. Der Grund dafür ist
einfach: Git ist schnell, leistungsfähig und plattformunabhängig. Kein Wunder, dass im-
mer mehr Teams, vor allem auch aus der Microsoft-Welt, den Umstieg planen. Doch um
Git optimal zu nutzen, ist fundiertes Hintergrundwissen nötig – denn Git arbeitet von
Grund auf anders als die bekannten „klassischen“ Systeme. Richtig eingesetzt macht Git
aber ordentlich Spaß – durch mehr Performance, Produktivität und Flexibilität im Ent-
wicklungsalltag.

von Uwe Baumann                                            stands, zum Abrufen früherer Versionen sowie zum
                                                           Verwalten von Varianten mittels Branching und Mer-
Eigentlich – so schien es – war das Thema Versions-        ging.
kontrolle in der Microsoft-Welt abgehakt: Team               Aber der Schein trügt: Git funktioniert intern kom-
Foundation Version Control (TFVC) als ausgereif-           plett anders, denn es ist als dezentrales System aus-
tes, stabiles System war gesetzt – als Open-Source-        gelegt. Das bedeutet: Während TFVC und Subversion
Alternative stand Apache Subversion bereit –, um den       auf eine zentral verwaltete Datenbank setzen (Abb. 1),
Rest des Kuchens stritten sich Systeme wie Perforce        kommt Git auch gut ohne zentrale Datenbank aus. Je-
und Rational ClearCase. Doch dann kam Git und er-          der Nutzer hat vielmehr seine eigene Datenbank, unter
oberte die Welt im Sturm: Nach der aktuellen Umfra-        Git „Repository“ oder kurz „Repo“ genannt (Abb. 2).
ge des Entwicklerportals Stack Overflow nutzen rund          Unter Git arbeitet man die meiste Zeit mit dieser lo-
87 Prozent der Entwickler Git; Subversion und TFVC         kalen Datenbank und kann dann die erzeugten Ände-
landen mit 16,1 und 10,9 Prozent abgeschlagen auf          rungen (Commits) mit den anderen Projektbeteiligten
den Plätzen zwei und drei [1].                             austauschen. Obwohl Git dies nicht erfordert, wird
  Was ist der Grund für den kometenhaften Aufstieg         hier dann doch wieder auf die bewährte Architektur
von Git? Was macht Git anders als die etablierten          mit einem Zentralserver (Blessed Repository) zurück-
Platzhirsche? Und was gibt es zu beachten, wenn man        gegriffen.
das eigene Team auf Git migrieren will? Die wichtigs-
ten Antworten auf diese Fragen möchte ich Ihnen im         Schnell, sicher, flexibel
Folgenden liefern.                                         Das lokale Arbeiten bringt einige Vorteile mit sich: Git
                                                           reagiert generell extrem schnell auf Benutzereingaben –
Zentral versus dezentral                                   es müssen ja nicht für jede Aktion langsame Netzwerk-
Wer sich ein Git Cheat Sheet (wie es diesem Heft bei-      zugriffe durchgeführt werden. Diese gute Performance
liegt) besorgt, könnte den Eindruck bekommen, dass         ist in der täglichen Praxis deutlich spürbar.
Git eigentlich nur eine Variante des bereits bekannten        „Völlig losgelöst“ vom Server arbeiten zu kön-
Musters darstellt: Befehle zum Sichern des Versions-       nen, erhöht auch die Flexibilität bei der Arbeit mit

www.basta.net                                                                                                   16
Sie können auch lesen