Read in English · Leer en español · Lire en français
Abschnitt 4.3 von 4.8 · Mittelstufe · 20 Min. Lesezeit
Das C4-Modell: Kontext, Container, Komponenten und Code
Videolektion
5 Min. · auf Englisch gesprochen, mit UntertitelnNur anhören (Audio)
Transkript lesen
Bitten Sie ein Team, seine Architektur zu zeichnen, und Sie bekommen oft unerklärte Formen, unbeschriftete Linien und vermischte Detailebenen. In dieser Lektion lernen Sie Simon Browns Antwort kennen: das C4-Modell.
Denken Sie an eine Online-Karte. Herausgezoomt sehen Sie ein ganzes Land und die Autobahnen zwischen den Städten. Zoomen Sie hinein, sehen Sie die Bezirke einer Stadt, dann die Straßen eines Bezirks, dann ein einzelnes Gebäude. Jede Zoomstufe ist für andere Menschen nützlich. Und Sie wissen immer, welche Stufe Sie gerade betrachten. C4 macht dasselbe für Software. Es ist keine neue Notation, sondern eine kleine Menge von Abstraktionen und eine Hierarchie von Diagrammen.
Ebene eins, das Systemkontextdiagramm, zeigt Ihr System als einzelnen Kasten, mit den Personen, die es nutzen, und den anderen Softwaresystemen, mit denen es verbunden ist. Es ist für alle gedacht, ob technisch oder nicht. Ebene zwei, das Containerdiagramm, zeigt die Anwendungen und Datenspeicher innerhalb des Systems. C4 empfiehlt diese ersten beiden Ebenen jedem Team. Ebene drei, das Komponentendiagramm, zoomt in einen Container. Zeichnen Sie es nur, wo es einen Mehrwert bietet, für komplexe oder riskante Teile. Ebene vier zeigt den Code selbst. Sie von Hand zu zeichnen lohnt sich selten, weil die meisten Werkzeuge sie bei Bedarf generieren können.
Das Wort Container erfordert Sorgfalt. In C4 ist ein Container eine separat lauffähige oder deploybare Einheit, die Code ausführt oder Daten speichert: eine Web-App, eine Mobile-App, ein Service, ein Datenbankschema oder ein Message-Topic. Das ist nicht dasselbe wie ein Docker-Container. Eine Mobile-App auf einem Smartphone ist ein C4-Container, läuft aber nicht in Docker. Wie viele Kopien eines Containers laufen und wo, gehört in ein Deployment-Diagramm.
Hier ist Ebene eins für die Essenslieferplattform. Kunden, Restaurantpersonal und Kuriere haben je einen beschrifteten Pfeil, der sagt, was sie mit der Plattform tun, die als einzelner Kasten dargestellt ist. Darunter stehen die externen Systeme, von denen sie abhängt: ein Zahlungsanbieter, ein Kartendienst und Push-Dienste. Auf einen Blick zu sehen, dass diese zugekauft sind, ist architekturrelevant.
Zoomen Sie nun in Ebene zwei. Für die meisten Teams ist dieses Containerdiagramm das wertvollste Diagramm, das sie besitzen. Oben hat jede Art von Nutzer eine App, und jede App nennt ihre Technologie. Jede App ruft die Programmierschnittstelle der Plattform, die API, über ein API-Gateway auf, das Nutzer authentifiziert und Anfragen weiterleitet. Beachten Sie das Protokoll an jedem Pfeil. Der Bestellservice nimmt Bestellungen an und kassiert die Zahlung. Er liest aus der Bestelldatenbank und schreibt in sie. Außerdem publiziert er Bestellereignisse in ein Kafka-Topic, das als eigener Container gezeichnet ist. Der Dispositions- und der Benachrichtigungsservice konsumieren daraus. Diese Pfeile sind gestrichelt, weil sie asynchron sind, und die Legende sagt das. Außerhalb der Grenze liegen die drei externen Systeme, und unten steht die Legende. Wie viele Kopien jedes Service laufen, bleibt einem Deployment-Diagramm überlassen.
C4 schreibt keine Formen oder Farben vor, wohl aber, was jedes Diagramm aussagen muss. Jedes braucht einen Titel, der seinen Typ und Umfang nennt, und eine Legende, die jede Form und Linienart erklärt. Jedes Element hat einen Namen, einen Typ, eine Beschreibung in einem Satz und, bei Containern und Komponenten, seine Technologie. Jede Beziehung ist ein Pfeil, in eine Richtung, beschriftet mit dem, was sie tut. Niemals nur „nutzt“. Ergänzen Sie zwischen Containern das Protokoll, und zeigen Sie, ob es synchron oder asynchron ist. Bleiben Sie bei einer Abstraktionsebene: keine Klassen in einem Containerdiagramm. Und nutzen Sie Farbe nur als Ergänzung, denn Diagramme werden schwarz-weiß gedruckt und von farbenblinden Menschen gelesen.
Wenden wir die Regeln an. Ein Team teilt ein Whiteboard-Diagramm: fünf Kästen, darunter App, Backend und DB, Linien ohne Pfeilspitzen, ein grüner Kasten und kein Titel oder Legende. Entscheiden Sie zuerst, was es ist. Es mischt eine App, einen Service und eine Datenbank, also ist es ein Containerdiagramm, und es bekommt einen Titel, der das sagt. Jeder Kasten bekommt einen Namen, einen Typ und eine Technologie. Aus App wird die Kunden-App, und aus DB wird die Bestelldatenbank. Jede einfache Linie wird zu einem beschrifteten Pfeil mit Protokoll. Das Team stellt fest, dass eine Linie zwei verschiedene Dinge bedeutete, einen Aufruf in die eine und einen Webhook in die andere Richtung, also werden daraus zwei Pfeile. Das Beschriften der Pfeile legt auch ein Kafka-Topic offen, das niemand gezeichnet hatte. Und der grüne Kasten bedeutet, wie sich herausstellt, „gehört unserem Team“, und das kommt in die Legende. Das Ergebnis enthält mehr, braucht aber weniger Erklärung, weil es jede Frage beantwortet, die ein Leser stellen würde. Der größte Nutzen kam vom Beschriften der Pfeile.
Der vollständige Abschnitt ergänzt das Komponentendiagramm, die ergänzenden Diagramme und Modellierungswerkzeuge. Als Nächstes betrachten wir in Abschnitt vier Punkt vier die Teile der Unified Modeling Language, kurz UML, die Architekten noch verwenden. Bis gleich.
Was Sie wissen müssen
- Das C4-Modell von Simon Brown beschreibt Software mit einer Hierarchie aus vier Diagrammen (Systemkontext, Container, Komponente und Code), die auf den Abstraktionen Person, Softwaresystem, Container und Komponente aufbauen.
- Ein C4-Container ist eine separat lauffähige oder deploybare Einheit, die Code ausführt oder Daten speichert, etwa eine Web-App, eine Mobile-App, ein Service, ein Datenbankschema oder ein Message-Topic; er ist nicht dasselbe wie ein Docker-Container.
- Systemkontext- und Containerdiagramme werden jedem Team empfohlen, Komponentendiagramme nur, wo sie einen Mehrwert bieten, und Codediagramme selten, vorzugsweise aus dem Code generiert.
- Ergänzende Diagramme sind die Systemlandschaft (alle Systeme einer Organisation), das dynamische Diagramm (Zusammenspiel zur Laufzeit für ein Szenario) und das Deployment-Diagramm (Container auf Infrastruktur abgebildet, eines je Umgebung).
- Jedes Diagramm braucht einen Titel mit Typ und Umfang sowie eine Legende; jedes Element einen Namen, einen Typ, eine Beschreibung und (bei Containern und Komponenten) eine Technologie; jede Beziehung eine einzige Richtung, eine konkrete Beschriftung und, zwischen Containern, ein Protokoll.
- Modellierungswerkzeuge wie Structurizr erzeugen viele konsistente Diagramme aus einem Modell, während Zeichenwerkzeuge unabhängige Bilder erzeugen, die auseinanderdriften.
Landkarten Ihres Codes
Das C4-Modell ist ein Ansatz zur Darstellung von Softwarearchitektur in Diagrammen, den Simon Brown entwickelt hat. Es ist aus den Softwarearchitektur-Schulungen entstanden, die er ab etwa 2006 gab: Laut der C4-Website reichen seine Wurzeln in die Zeit zwischen 2006 und 2009 zurück, die Diagrammtypen erhielten Anfang 2010 ihre Namen, und der Name „C4“ wurde Anfang 2011 erstmals verwendet. Brown war aufgefallen, dass Teams, die ihre Architektur zeichnen sollten, schwer verständliche Diagramme lieferten: unerklärte Formen und Farben, Kästen, die alles von einer Klasse bis zu einem Rechenzentrum sein konnten, unbeschriftete Linien und mehrere Detailebenen auf einer Seite. UML, das das Problem hätte lösen können, war im Alltag weitgehend außer Gebrauch gekommen.
Seine Antwort war keine neue Notation, sondern eine kleine Menge von Abstraktionen und eine darauf aufbauende Hierarchie von Diagrammen, die er mit den Zoomstufen einer Online-Karte vergleicht. Sie beginnen mit dem ganzen Land, zoomen in eine Stadt, dann in einen Bezirk, dann in eine Straße. Jede Stufe zeigt für einen anderen Zweck unterschiedlich viele Details, und Sie wissen immer, welche Stufe Sie betrachten. C4 ist bewusst unabhängig von Notation und Werkzeug: Sie können es auf einem Whiteboard, in einem Zeichenwerkzeug oder mit einem Modellierungswerkzeug zeichnen, sofern Sie ein paar Regeln befolgen.
C4 ist zu einem der am weitesten verbreiteten Ansätze für Architekturdiagramme geworden, weil es leicht zu lernen ist, sich natürlich in das Denken in mehreren Sichten aus Abschnitt 4.2 einfügt und Diagramme hervorbringt, denen Entwicklungsteams wie fachfremde Leser folgen können. In der Begriffswelt von 42010 ist jeder C4-Diagrammtyp ein Blickwinkel mit eigener Modellart; C4 hält die Menge nur klein.
Die Abstraktionen: Personen, Softwaresysteme, Container, Komponenten
C4 baut auf vier Abstraktionen auf, dazu kommt der Code. Eine Person ist ein menschlicher Nutzer des Systems: ein Kunde, ein Kurier, eine Supportkraft. Ein Softwaresystem ist die höchste Abstraktionsebene, etwas, das seinen Nutzern einen Wert liefert und typischerweise von einem Team oder einer Organisation besessen und gebaut wird; die Essenslieferplattform ist eines, ebenso der Zahlungsanbieter und der Kartendienst, von denen sie abhängt.
Ein Container ist etwas, das laufen muss, damit das System funktioniert: nach Browns Worten im Wesentlichen eine Laufzeitgrenze um Code, der ausgeführt wird, oder um Daten, die gespeichert werden. Beispiele sind eine serverseitige Webanwendung, eine Single-Page-App im Browser, eine Mobile-App, eine Desktop-Anwendung, eine Serverless-Funktion, ein Datenbankschema, ein Dateispeicher oder ein Message-Topic. Jeder ist separat deploybar oder lauffähig, und Container kommunizieren über Prozessgrenzen hinweg miteinander, meist über ein Netzwerk.
Eine Komponente ist eine Gruppierung zusammengehöriger Funktionalität hinter einer klar definierten Schnittstelle; sie lebt innerhalb eines Containers und läuft im selben Prozess wie die anderen Komponenten dort. In einem Java-Service kann sie eine Menge von Klassen hinter einer Schnittstelle sein, in einem Node.js-Service ein Modul. Komponenten sind nicht separat deploybar; der Container ist die Deployment-Einheit. Schließlich ist Code die Klassen, Funktionen und Tabellen, die eine Komponente implementieren.
Die vier Kerndiagramme
| Niveau | Umfang | Zeigt | Hauptzielgruppe | Empfohlen? |
|---|---|---|---|---|
| 1. Systemkontext | Ein Softwaresystem | Das System als einzelner Kasten, die Personen, die es nutzen, und die anderen Softwaresysteme, mit denen es interagiert | Alle, technisch und fachfremd, innerhalb und außerhalb des Teams | Ja, für jedes Team |
| 2. Container | Ein Softwaresystem | Die Container darin (Apps, Services, Datenspeicher, Topics), ihre Verantwortlichkeiten, Technologien und wie sie kommunizieren | Architekten, Entwicklungsteams, Betrieb und Support | Ja, für jedes Team |
| 3. Komponente | Ein Container | Die Komponenten darin, ihre Verantwortlichkeiten und Technologien sowie ihre Beziehungen | Architekten und Entwicklungsteams | Nur wo es einen Mehrwert bietet; generieren, wenn es langfristig gepflegt werden muss |
| 4. Code | Eine Komponente | Klassen, Schnittstellen, Funktionen oder Tabellen, typischerweise als UML-Klassendiagramm oder Entity-Relationship-Diagramm | Entwicklungsteams | Selten; bei Bedarf für die komplexesten Teile aus dem Code generieren |
Ebene 1: das Systemkontextdiagramm
Das Systemkontextdiagramm ist der Ausgangspunkt. Es stellt das beschriebene System als einzelnen Kasten in die Mitte und umgibt es mit den Personen, die es nutzen, und den Softwaresystemen, von denen es abhängt oder die von ihm abhängen. Es verbirgt bewusst alle internen Details, einschließlich Technologien, Protokollen und interner Services. Es beantwortet die Fragen, die jeder Neuling, jedes Produktmanagement und jede Sicherheitsprüfung zuerst stellt: Was ist dieses System, wer nutzt es, und womit ist es verbunden?
Weil es das Innenleben verbirgt, ist das Kontextdiagramm auch das richtige Diagramm für Gespräche mit fachfremden Stakeholdern und für die Abgrenzung: Wo endet unsere Verantwortung? Im folgenden Essenslieferbeispiel zeigt es sofort, dass Kartenzahlungen, Routenplanung und Push-Zustellung zugekauft sind, was architekturrelevant ist (jedes davon ist eine externe Abhängigkeit mit eigener Verfügbarkeit, eigenen Kosten und eigenem Vertrag) und in den meisten Sichten auf Codeebene unsichtbar bleibt.
Essenslieferplattform: Systemkontext
Ebene 2: das Containerdiagramm
Das Containerdiagramm zoomt in den Systemkasten und zeigt die Container darin: die Anwendungen und Datenspeicher, aus denen das System besteht, wofür jeder verantwortlich ist, welche Technologie jeder nutzt und wie sie kommunizieren. Für die meisten Teams ist das das wertvollste Diagramm, das sie besitzen. Es zeigt die wichtigsten Strukturentscheidungen (wie viele deploybare Einheiten, welche synchron und welche über Messaging kommunizieren, welche Daten besitzen) und ist konkret genug für Entwicklung und Betrieb, passt aber immer noch auf eine Seite.
Beachten Sie zwei Entscheidungen im folgenden Diagramm. Das Message-Topic für Bestellereignisse ist als eigener Container gezeichnet, weil es ein Speicher ist, in den Produzenten schreiben und aus dem Konsumenten lesen; die C4-Anleitung bietet diesen expliziten Stil an oder alternativ, das Topic wegzulassen und „über Topic für Bestellereignisse“ an die Pfeile zu schreiben. Das Zeichnen macht die Kopplung über das Topic deutlich sichtbar. Und die asynchronen Beziehungen verwenden eine gestrichelte Linie, die die Legende erklärt. Das Containerdiagramm sagt nichts darüber, wie viele Kopien jedes Service laufen, in welcher Region oder hinter welchem Load Balancer; das gehört in ein Deployment-Diagramm.
Essenslieferplattform: Container
Ebene 3: das Komponentendiagramm
Das Komponentendiagramm zoomt in einen Container und zeigt die Komponenten darin. Es richtet sich an Architekten und Entwicklungsteams, die an diesem Container arbeiten, und hier wird die innere Struktur eines Service sichtbar: welcher Teil eingehende Anfragen bearbeitet, wo die Geschäftsregeln liegen, welcher Teil mit der Datenbank spricht, wie Ereignisse den Service verlassen.
Die C4-Anleitung empfiehlt, Komponentendiagramme nur dort zu zeichnen, wo sie einen Mehrwert bieten, typischerweise für Container, die komplex oder riskant sind oder von vielen Personen geändert werden, und sie automatisch zu generieren, wenn sie lange erhalten bleiben sollen, weil sich die Komponentenstruktur so oft ändert wie der Code. Bei der Essenslieferplattform erfüllt der Bestellservice diese Kriterien: Er verarbeitet Geld, spricht mit einem externen Anbieter und muss Ereignisse zuverlässig publizieren. Das folgende Diagramm zeigt eine typische Struktur, einschließlich einer Outbox-Komponente, die Ereignisse in derselben Transaktion wie die Bestellung in die Datenbank schreibt und sie anschließend an Kafka weiterleitet (das Outbox-Muster wird in Kapitel 6 behandelt).
Bestellservice: Komponenten
Ebene 4: Code und die ergänzenden Diagramme
Die Codeebene zoomt in eine Komponente und zeigt ihre Klassen, Schnittstellen oder Tabellen, meist als UML-Klassendiagramm oder Entity-Relationship-Diagramm. Die C4-Anleitung behandelt sie als optional und hält es in der Regel nicht für lohnend, sie von Hand zu zeichnen: Die meisten Entwicklungsumgebungen können sie bei Bedarf generieren, und eine handgezeichnete Kopie ist veraltet, sobald jemand refaktoriert. Zeichnen Sie sie nur für die wichtigsten oder verwickeltsten Teile, etwa ein Domänenmodell im Herzen des Geschäfts (Abschnitt 4.4 zeigt ein solches Klassendiagramm).
Drei ergänzende Diagramme füllen die Lücken, die die Hierarchie lässt. Ein Systemlandschaftsdiagramm ist ein Kontextdiagramm ohne ein einzelnes System im Fokus: Es zeigt alle Softwaresysteme und Personen einer Organisation oder Domäne, was für Enterprise- und Plattformarchitekten nützlich ist. Ein dynamisches Diagramm zeigt, wie Elemente zur Laufzeit für ein Szenario zusammenarbeiten, als nummerierte Interaktionen auf einem Container- oder Komponentendiagramm (oder als UML-Sequenzdiagramm); das ist das C4-Gegenstück zu den Szenarien in 4+1. Ein Deployment-Diagramm zeigt, wie Container in einer Umgebung auf Infrastruktur abgebildet werden: Deployment-Knoten wie Cloud-Regionen, Kubernetes-Cluster, virtuelle Maschinen, Managed-Datenbankdienste und Geräte, mit der Anzahl der Instanzen. C4 empfiehlt ein Deployment-Diagramm je relevanter Umgebung, typischerweise Produktion und vielleicht Staging.
Notationsregeln, die Diagramme lesbar machen
C4 schreibt keine Formen oder Farben vor, wohl aber, was jedes Diagramm aussagen muss. Diese Regeln, verdichtet aus der C4-Notationsanleitung, machen die obigen Diagramme lesbar, ohne dass es eines Meetings zu ihrer Erklärung bedarf.
Checkliste: ein C4-Diagramm, das sich selbst erklärt
- Ein Titel, der Typ und Umfang nenntZum Beispiel „Containerdiagramm für die Essenslieferplattform“, damit Leser die Zoomstufe sofort erkennen.
- Eine LegendeErklären Sie jede verwendete Form, Farbe, Rahmenart, Linienart und Pfeilspitze, auch wenn die Notation offensichtlich scheint. Leser aus anderen Teams kennen Ihre Konventionen nicht.
- Jedes Element hat einen Namen, einen Typ und eine BeschreibungDer Typ in Klammern (Person, Softwaresystem, Container, Komponente) beseitigt Mehrdeutigkeit; ein kurzer Satz zur Verantwortung sagt, wofür das Element da ist.
- Technologie an jedem Container und jeder Komponente„Container: Java“, „Container: PostgreSQL“. Technologieentscheidungen sind Architektur, und Leser brauchen sie.
- Jede Beziehung ist gerichtet und beschriftetVerwenden Sie einen Pfeil pro Beziehung, beschriftet mit dem, was sie in Pfeilrichtung tut („Publiziert Bestellereignisse an“), niemals nur „nutzt“ oder ein Doppelpfeil.
- Protokolle an Beziehungen zwischen ContainernJSON/HTTPS, SQL/TCP, Kafka. Synchron oder asynchron ist eine der wichtigsten Tatsachen im Diagramm.
- Abkürzungen erklärtSchreiben Sie sie aus oder definieren Sie sie in der Legende oder im Glossar.
- Eine Abstraktionsebene pro DiagrammKeine Klassen in einem Containerdiagramm, keine Server in einem Komponentendiagramm.
- Farbe als Ergänzung, nicht als einziges SignalDiagramme werden schwarz-weiß gedruckt und von farbenblinden Menschen gelesen; nutzen Sie auch Linienarten und Beschriftungen, und halten Sie Farbbedeutungen über Diagramme hinweg einheitlich.
Ausgearbeitetes Beispiel
Ausgearbeitetes Beispiel: ein typisches Teamdiagramm verbessern
Ein Team im Essenslieferunternehmen teilt diese Beschreibung seines Whiteboard-Diagramms: fünf Kästen mit den Beschriftungen „App“, „Backend“, „Orders“, „DB“ und „Stripe“; Linien dazwischen ohne Pfeilspitzen; der Kasten Orders ist grün, die anderen blau; es gibt keinen Titel und keine Legende. Die C4-Regeln Schritt für Schritt angewendet:
| Titel und Ebene | Entscheiden Sie, was das Diagramm ist. Es mischt eine Mobile-App, einen Service und eine Datenbank, also ist es ein Containerdiagramm. Geben Sie ihm den Titel „Containerdiagramm für die Essenslieferplattform“. |
|---|---|
| Name, Typ, Beschreibung | Aus „App“ wird „Kunden-App [Container: Kotlin, Swift] iOS- und Android-App zum Bestellen von Essen“. „Backend“ entpuppt sich als das API-Gateway; aus „DB“ wird „Bestelldatenbank [Container: PostgreSQL]“. |
| Externe Systeme | „Stripe“ ist ein Produktname für ein externes System. Zeigen Sie es als „Zahlungsanbieter [Softwaresystem]“ außerhalb der Systemgrenze und nennen Sie den Anbieter in der Beschreibung, wenn das für die Leser wichtig ist. |
| Beziehungen | Ersetzen Sie jede einfache Linie durch einen beschrifteten Pfeil: „Ruft auf [JSON/HTTPS]“, „Liest und schreibt [SQL/TCP]“, „Autorisiert Kartenzahlungen über [HTTPS]“. Das Team stellt fest, dass eine Linie zwei verschiedene Dinge bedeutete (einen Aufruf in die eine Richtung und einen Webhook in die andere), also werden daraus zwei Pfeile. |
| Fehlende Elemente | Das Beschriften der Pfeile zeigt, dass Bestellereignisse den Dispositionsservice über ein Kafka-Topic erreichen, das nicht gezeichnet war. Fügen Sie das Topic als Container hinzu, mit gestrichelten asynchronen Pfeilen. |
| Legende und Farbe | Der grüne Kasten bedeutet, wie sich herausstellt, „gehört unserem Team“. Nehmen Sie das in eine Legende auf, oder ersetzen Sie die Farbe durch eine gestrichelte Grenze, die mit dem Teamnamen beschriftet ist. |
| Ergebnis | Das Diagramm hat einen Titel, eine Legende, drei Elemente und doppelt so viele Pfeile hinzugewonnen und braucht dennoch weniger Erklärung, weil jede Frage, die ein Leser stellen würde, auf der Seite beantwortet ist. |
Der größte Nutzen kam vom Beschriften der Pfeile: Unbeschriftete Linien verbergen die wichtigsten architektonischen Tatsachen (Richtung, Protokoll, synchron oder asynchron).
Das verbesserte Diagramm hat eine Abhängigkeit (das Topic) offengelegt, die das Team selbst vergessen hatte, ein typischer Nebeneffekt der Regeln.
Werkzeuge: Zeichnen oder Modellieren
C4-Diagramme lassen sich mit jedem Zeichenwerkzeug erstellen, und viele Teams beginnen mit einem Whiteboard oder einer allgemeinen Diagrammanwendung. Die C4-Website unterscheidet zwei Familien von Werkzeugen. Zeichenwerkzeuge zeichnen Kästen und Linien; sie sind flexibel und vertraut, aber die Diagramme sind unabhängige Bilder, sodass das Umbenennen eines Elements bedeutet, jedes Diagramm zu bearbeiten, das es zeigt, und nichts prüft, ob die Diagramme übereinstimmen. Modellierungswerkzeuge halten ein einziges Modell aus Personen, Systemen, Containern, Komponenten und Beziehungen und erzeugen jedes Diagramm als Sicht auf dieses Modell; umbenannt wird einmal, die Diagramme bleiben konsistent, und das Modell lässt sich abfragen und validieren.
Structurizr, von Simon Brown entwickelt, ist das Referenz-Modellierungswerkzeug für C4. Seine textbasierte Structurizr DSL beschreibt das Modell und die Sichten in einer Datei, die neben dem Code in der Versionsverwaltung liegt. Weitere Optionen sind C4-PlantUML (C4-Formen für PlantUML), die C4-Diagrammunterstützung von Mermaid und verschiedene kommerzielle Modellierungswerkzeuge; Abschnitt 4.7, Diagrams as Code, zeigt Beispiele. Die Wahl ist weniger wichtig als die Gewohnheit: Halten Sie die Quelle der Diagramme dort, wo das Team arbeitet, und aktualisieren Sie sie im selben Pull Request wie die Änderung, die sie beschreibt.
Häufige Fragen
Ersetzt C4 die UML?
Nicht ganz. C4 definiert Abstraktionen und Diagrammtypen, keine Notation, und sagt nichts über vieles, was UML präzise ausdrücken kann, etwa Zustandsautomaten oder detaillierte Nachrichtenabfolgen. Viele Teams nutzen C4 für die Struktur und entlehnen UML-Sequenz-, Zustands- und Deployment-Diagramme, wo Präzision gebraucht wird (Abschnitt 4.4).
Wie passen Serverless-Funktionen in C4?
Jede Funktion oder jede Gruppe gemeinsam deployter Funktionen ist ein Container: eine separat deploybare Einheit, die Code ausführt. Gemeinsame Datenspeicher und Queues, die sie nutzen, sind ebenfalls Container.
Unser System ist ein einziger deploybarer Monolith. Ist das Containerdiagramm sinnlos?
Nein. Ein Monolith hat typischerweise trotzdem einen Web- oder Mobile-Client, die Serveranwendung, eine Datenbank und vielleicht einen Dateispeicher und einen zeitgesteuerten Job, jeweils ein Container. Das Komponentendiagramm des Monolithen wird dann zur interessantesten Sicht auf seine internen Module.
Prüfen Sie Ihr Verständnis
Was ist ein Container im C4-Modell? Nennen Sie zwei Beispiele, die nichts mit Docker zu tun haben.
Eine separat lauffähige oder deploybare Einheit, die Code ausführt oder Daten speichert. Beispiele: eine Mobile-App auf einem Smartphone, eine Single-Page-App im Browser, ein Datenbankschema, eine Serverless-Funktion.
Welche beiden C4-Diagramme empfiehlt die C4-Anleitung jedem Team?
Das Systemkontextdiagramm und das Containerdiagramm.
Wo sollten Replikatzahlen, Regionen und Load Balancer dargestellt werden?
In einem Deployment-Diagramm, eines je Umgebung, nicht im Containerdiagramm.
Warum besteht C4 auf gerichteten, beschrifteten Pfeilen?
Unbeschriftete oder beidseitige Linien verbergen, was die Beziehung ist (Aufruf, Datenfluss, Ereignis), in welche Richtung sie geht und welches Protokoll sie nutzt, und das gehört zu den wichtigsten architektonischen Tatsachen im Diagramm.
Quellen und weiterführende Literatur
Haben Sie eine Frage zu diesem Abschnitt? ArchitectBot, der KI-Lernassistent des Kurses, antwortet zuerst aus dem Kurs.
Fragen: „Sollte jeder unserer Microservices in unseren C4-Diagrammen ein Container oder ein eigenes Softwaresystem sein?“