Le architetture software moderne, specialmente quelle costruite attorno ai microservizi, richiedono documentazione chiara e manutenibile. Mentre i contratti dei servizi e la documentazione delle API sono essenziali, comprendere come i servizi interagiscono e si inseriscono nel sistema più ampio spesso si rivela una sfida. È qui che i diagrammi architetturali diventano preziosi.
Model è un progetto open source che porta la potenza del codice alla documentazione dell’architettura. Implementa l’approccio del modello C4, che fornisce un modo gerarchico per descrivere e comunicare l’architettura software attraverso diversi livelli di astrazione.
Definendo i diagrammi architetturali nel codice, Model ti permette di:
Per iniziare con Model, installa gli strumenti da riga di comando necessari:
# Installa l'editor e il visualizzatore di diagrammi
go install goa.design/model/cmd/mdl@latest
Creiamo un semplice diagramma di sistema che mostra un utente che interagisce con un servizio che usa un database. Il seguente esempio dimostra i concetti chiave del linguaggio di design di Model:
package design
import . "goa.design/model/dsl"
var _ = Design("Per Iniziare", "Questo è un modello del mio sistema software.", func() {
// Definisci il sistema software principale - questo rappresenta l'intera applicazione
var System = SoftwareSystem("Sistema Software", "Il mio sistema software.", func() {
// Definisci un container database all'interno del sistema
Database = Container("Database", "Memorizza informazioni", "MySQL", func() {
Tag("Database") // I tag aiutano con lo stile e il filtraggio
})
// Definisci un container servizio che usa il database
Container("Servizio", "Il mio servizio", "Go e Goa", func() {
Uses(Database, "Legge e scrive dati")
})
})
// Definisci un utente esterno del sistema
Person("Utente", "Un utente del mio sistema software.", func() {
Uses(System, "Usa") // Crea una relazione con il sistema
Tag("person") // Tag per lo stile
})
// Crea una vista per visualizzare l'architettura
Views(func() {
SystemContextView(System, "Sistema", "Diagramma del Contesto del Sistema.", func() {
AddAll() // Includi tutti gli elementi
AutoLayout(RankLeftRight) // Disponi gli elementi automaticamente
})
})
})
Questo esempio introduce diversi concetti chiave:
Design
definisce l’ambito della tua architetturaSoftwareSystem
rappresenta la tua applicazioneContainer
definisce i componenti principali (servizi, database, ecc.)Person
rappresenta utenti o ruoliUses
crea relazioni tra elementiViews
definisce diversi modi per visualizzare la tua architetturaModel implementa l’approccio gerarchico del modello C4 per descrivere l’architettura software. Ogni tipo di vista serve uno scopo specifico e un pubblico, come definito dal Modello C4:
Views(func() {
// System Landscape: Mostra tutti i sistemi e le persone nel panorama aziendale
SystemLandscapeView("panorama", "Panoramica", func() {
AddAll()
AutoLayout(RankTopBottom)
})
// System Context: Concentrati su un sistema e le sue relazioni immediate
SystemContextView(System, "contesto", func() {
AddAll()
AutoLayout(RankLeftRight)
})
// Container: Mostra i blocchi tecnici di alto livello
ContainerView(System, "container", func() {
AddAll()
AutoLayout(RankTopBottom)
})
// Component: Dettagli gli interni di un container specifico
ComponentView("System/Container", "componenti", func() {
AddAll()
AutoLayout(RankLeftRight)
})
})
Esaminiamo ogni tipo di vista in dettaglio:
Questa vista mostra il quadro generale del panorama dei tuoi sistemi software. Aiuta gli stakeholder a capire come il tuo sistema si inserisce nell’ambiente IT aziendale complessivo.
Questo diagramma mostra il tuo sistema software nel suo ambiente, concentrandosi sulle persone che lo usano e gli altri sistemi con cui interagisce. È un eccellente punto di partenza per documentare e comunicare il contesto sia con il pubblico tecnico che non tecnico.
Come descritto nella guida ai Diagrammi Container del Modello C4, una vista container fa uno zoom nel tuo sistema software per mostrare i blocchi tecnici di alto livello. Un “container” in questo contesto rappresenta un’unità eseguibile/distribuibile separatamente che esegue codice o memorizza dati, come:
Questa vista aiuta gli sviluppatori e il personale operativo a capire:
Nota che questo diagramma intenzionalmente omette i dettagli di deployment come clustering, load balancer e replicazione, poiché questi tipicamente variano tra gli ambienti.
Questa vista fa uno zoom in un singolo container per mostrare i suoi componenti e le loro interazioni. È utile per gli sviluppatori che lavorano sulla base di codice per capire come il container è strutturato internamente.
Model fornisce un editor interattivo attraverso il comando mdl
che rende facile
raffinare ed esportare i tuoi diagrammi. Avvia l’editor con:
# Avvia con la directory di output predefinita (./gen)
mdl serve goa.design/examples/model/design
# O specifica una directory di output personalizzata
mdl serve goa.design/examples/model/design -dir diagrammi
Questo lancia un’interfaccia web su http://localhost:8080 dove puoi:
L’editor fornisce diversi modi per manipolare i tuoi diagrammi:
Posizionamento degli Elementi:
Gestione delle Relazioni:
Strumenti di Selezione:
Le seguenti scorciatoie ti aiutano a lavorare efficientemente con l’editor:
Categoria | Scorciatoia | Effetto |
---|---|---|
Aiuto | ?, SHIFT + F1 | Mostra scorciatoie da tastiera |
File | CTRL + S | Salva SVG |
Cronologia | CTRL + Z | Annulla |
Cronologia | CTRL + SHIFT + Z, CTRL + Y | Ripeti |
Zoom | CTRL + =, CTRL + rotella | Zoom avanti |
Zoom | CTRL + -, CTRL + rotella | Zoom indietro |
Zoom | CTRL + 9 | Zoom per adattare |
Zoom | CTRL + 0 | Zoom 100% |
Selezione | CTRL + A | Seleziona tutto |
Selezione | ESC | Deseleziona |
Movimento | Tasti freccia | Sposta selezione |
Movimento | SHIFT + Tasti freccia | Sposta selezione più velocemente |
Model ti permette di personalizzare l’aspetto dei tuoi diagrammi attraverso gli stili:
Views(func() {
// Definisci la vista
SystemContextView(System, "contesto", func() {
AddAll()
AutoLayout(RankTopBottom)
})
// Applica stili personalizzati
Styles(func() {
// Stile per elementi taggati come "system"
ElementStyle("system", func() {
Background("#1168bd") // Sfondo blu
Color("#ffffff") // Testo bianco
})
// Stile per elementi taggati come "person"
ElementStyle("person", func() {
Shape(ShapePerson) // Usa icona persona
Background("#08427b") // Sfondo blu scuro
Color("#ffffff") // Testo bianco
})
})
})
Mentre lo strumento mdl
è perfetto per lo sviluppo locale e l’esportazione SVG, Model si integra
anche con il servizio Structurizr per funzionalità
avanzate di visualizzazione e condivisione.