Bachelorarbeit: "Code-basierte Dokumentation evolutionärer Software-Architekturen"
Code-basierte Dokumentation evolutionärer Software-Architekturen
Software-Systeme unterliegen durch wechselnde Anforderungen einem stetigem Wandel. Die Software-Entwicklung steht vor der Herausforderung einer evolutionären Software-Architektur, die die Anforderungen erfüllen kann.
Das Domain-Driven-Design mit dem Microservice-Ansatz und ein agiles Projektvorgehen addressieren diese Herausforderung. Die Kapselung von Domänen-Funktionalitäten in Bounded Contexts erlauben eine inkrementelle und unabhängige Weiterentwicklung eines Software-Systems.
Microservice-Architekturen erschweren allerdings die Dokumentation, wie die Erfassung der Beziehungen zwischen den beteiligten Komponenten innerhalb des verteilten Systems. Microservices abstraiieren Funktionalitäten und kommunizieren über das Netzwerk per REST und Messaging.
Auf Ebene der Microservices erlaubt die statische Code-Analyse die Auflösung der internen Abhängigkeiten zwischen Modulen, Packages und Klassen. Eine Zyklenfreiheit kann mit bewähreten Werkzeugen zuverlässig festgestellt und visualisiert werden (JDepend, Sonar, etc.).
Die Beziehungen zwischen Microservices sind allerdings nur indirekt über Schnittstellen-Aufrufe im Code oder anhand des Kommunikationsverhaltens zur Laufzeit sichtbar.
Zum Auflösen dieser Problematik versucht diese Arbeit die Informationen einzelner Microservices zusammenzuführen und (teil-)automatisiert eine Dokumentation der gesamten Architektur zu erzeugen. Meta-Daten zur Dokumentation sollen daher zusammen mit dem Code versioniert werden und auf bereits bekannten Informationen basieren.
Diese Arbeit soll Möglichkeiten zur code-basierten Dokumentation von Software-Architekturen eruieren und prototypisch eine Lösung implementieren.
Folgende Ansätze sollen beleuchtet werden:
Jeder Microservice stellt die Dokumentation zur inneren Struktur und der genutzten Services einheitlich in einem definierten Format bereit. Eine strukturierte Dokumentation gestattet eine maschinelle Analyse und Darstellung der Informationen.
Über den Build-Prozess sind allgemeine Informationen wie der Name, das Repository, die Build-Version und die verwendete Bibliotheken (z.B. Maven Dependencies) bekannt.
Mit Hilfe der metadaten-basierten Schnittstellen-Dokumentation, wie Swagger (Open API Specification), liegt zur Kompilierzeit eine strukturierte Dokumenation des Service-Angebots vor.
Über zusätzliche Meta-Daten werden die Bereitstellung und das Konsumierung von Service-Schnittstellen identifiziert. Diese Daten werden beim Build-Prozess erzeugt und bereitstellt.
Option:
Die Kommunikationsinfrastruktur, wie die Service Discovery, der Load-Balancer oder die Firewall, kann das Konsumieren der Service-Angebote, also die Kommunikationsbeziehungen zwischen den Microservices auflösen.
Ein Service zum Architektur-Management aggregiert und visualisiert die bereitgestellten Informationen. Wünschenswert ist eine automatische Erzeugung der Software-Architektur auf Ebene der Kontext- und Struktursicht. Bei Option 2 werden zusätzlich die Beziehungen zu anderen Microservices aufgelöst.
Siehe original README