マイクロサービスを中心に構築された現代のソフトウェアアーキテクチャには、 明確で保守可能なドキュメントが必要です。サービス契約とAPIドキュメントは 不可欠ですが、サービスがどのように相互作用し、より大きなシステムに適合するかを 理解することは、しばしば課題となります。ここでアーキテクチャ図が非常に 重要になります。
Modelは、アーキテクチャドキュメントに コードの力をもたらすオープンソースプロジェクトです。異なる抽象化レベルを通じて ソフトウェアアーキテクチャを記述および伝達するための階層的な方法を提供する C4モデルアプローチを実装しています。
アーキテクチャ図をコードで定義することで、Modelは以下を可能にします:
Modelを始めるには、必要なコマンドラインツールをインストールします:
# 図のエディタとビューアをインストール
go install goa.design/model/cmd/mdl@latest
データベースを使用するサービスとユーザーの相互作用を示す簡単なシステム図を 作成してみましょう。以下の例は、Modelの設計言語の主要な概念を示しています:
package design
import . "goa.design/model/dsl"
var _ = Design("はじめに", "これは私のソフトウェアシステムのモデルです。", func() {
// メインのソフトウェアシステムを定義 - これはアプリケーション全体を表す
var System = SoftwareSystem("ソフトウェアシステム", "私のソフトウェアシステム。", func() {
// システム内のデータベースコンテナを定義
Database = Container("データベース", "情報を保存", "MySQL", func() {
Tag("Database") // スタイリングとフィルタリングに役立つタグ
})
// データベースを使用するサービスコンテナを定義
Container("サービス", "私のサービス", "Go and Goa", func() {
Uses(Database, "データの読み書き")
})
})
// システムの外部ユーザーを定義
Person("ユーザー", "私のソフトウェアシステムのユーザー。", func() {
Uses(System, "使用") // システムとの関係を作成
Tag("person") // スタイリング用のタグ
})
// アーキテクチャを可視化するビューを作成
Views(func() {
SystemContextView(System, "システム", "システムコンテキスト図。", func() {
AddAll() // すべての要素を含める
AutoLayout(RankLeftRight) // 要素を自動的に配置
})
})
})
この例は以下の主要な概念を紹介しています:
Design
関数はアーキテクチャのスコープを定義SoftwareSystem
はアプリケーションを表すContainer
は主要なコンポーネント(サービス、データベースなど)を定義Person
はユーザーまたは役割を表すUses
は要素間の関係を作成Views
はアーキテクチャを可視化する異なる方法を定義Modelは、ソフトウェアアーキテクチャを記述するためのC4モデルの階層的アプローチを 実装しています。各ビュータイプは、C4モデルで定義されて いるように、特定の目的と対象者に役立ちます:
Views(func() {
// システムランドスケープ:企業ランドスケープ内のすべてのシステムと人を表示
SystemLandscapeView("landscape", "概要", func() {
AddAll()
AutoLayout(RankTopBottom)
})
// システムコンテキスト:1つのシステムとその直接の関係に焦点を当てる
SystemContextView(System, "context", func() {
AddAll()
AutoLayout(RankLeftRight)
})
// コンテナ:高レベルの技術的な構成要素を表示
ContainerView(System, "containers", func() {
AddAll()
AutoLayout(RankTopBottom)
})
// コンポーネント:特定のコンテナの内部を詳細に表示
ComponentView("System/Container", "components", func() {
AddAll()
AutoLayout(RankLeftRight)
})
})
各ビュータイプを詳しく見てみましょう:
このビューは、ソフトウェアシステムのランドスケープの全体像を示します。 ステークホルダーがシステムが全体的な企業ITシステムにどのように適合するかを 理解するのに役立ちます。
この図は、環境内のソフトウェアシステムを示し、それを使用する人々と相互作用する 他のシステムに焦点を当てます。技術的および非技術的な対象者との文脈を文書化し 伝達するための優れた出発点です。
C4モデルコンテナ図ガイドで説明されて いるように、コンテナビューはソフトウェアシステム内部にズームインして、高レベルの 技術的な構成要素を示します。この文脈における「コンテナ」は、コードを実行または データを保存する、個別に実行/デプロイ可能なユニットを表します:
このビューは、開発者と運用スタッフが以下を理解するのに役立ちます:
このダイアグラムは、クラスタリング、ロードバランサー、レプリケーションなどの デプロイメントの詳細を意図的に省略していることに注意してください。これらは 通常、環境によって異なります。
このビューは個々のコンテナ内部にズームインして、そのコンポーネントと それらの相互作用を示します。コードベースで作業する開発者が、コンテナが 内部でどのように構造化されているかを理解するのに役立ちます。
Modelはmdl
コマンドを通じてインタラクティブなエディタを提供し、図の
改良とエクスポートを容易にします。エディタを以下のように起動します:
# デフォルトの出力ディレクトリ(./gen)で起動
mdl serve goa.design/examples/model/design
# または、カスタム出力ディレクトリを指定
mdl serve goa.design/examples/model/design -dir diagrams
これにより、http://localhost:8080 でWebインターフェースが起動し、以下が可能になります:
エディタは図を操作するためのいくつかの方法を提供します:
要素の配置:
関係の管理:
選択ツール:
以下のショートカットを使用してエディタを効率的に操作できます:
カテゴリ | ショートカット | 効果 |
---|---|---|
ヘルプ | ?, SHIFT + F1 | キーボードショートカットを表示 |
ファイル | CTRL + S | SVGを保存 |
履歴 | CTRL + Z | 元に戻す |
履歴 | CTRL + SHIFT + Z, CTRL + Y | やり直し |
ズーム | CTRL + =, CTRL + ホイール | ズームイン |
ズーム | CTRL + -, CTRL + ホイール | ズームアウト |
ズーム | CTRL + 9 | 全体を表示 |
ズーム | CTRL + 0 | 100%ズーム |
選択 | CTRL + A | すべて選択 |
選択 | ESC | 選択解除 |
移動 | 矢印キー | 選択を移動 |
移動 | SHIFT + 矢印キー | 選択を速く移動 |
Modelはスタイルを通じて図の外観をカスタマイズすることができます:
Views(func() {
// ビューを定義
SystemContextView(System, "context", func() {
AddAll()
AutoLayout(RankTopBottom)
})
// カスタムスタイルを適用
Styles(func() {
// "system"タグが付いた要素のスタイル
ElementStyle("system", func() {
Background("#1168bd") // 青い背景
Color("#ffffff") // 白いテキスト
})
// "person"タグが付いた要素のスタイル
ElementStyle("person", func() {
Shape(ShapePerson) // 人物アイコンを使用
Background("#08427b") // 濃い青の背景
Color("#ffffff") // 白いテキスト
})
})
})
mdl
ツールはローカル開発とSVGエクスポートに最適ですが、Modelは高度な機能のために
Structurizrサービスとも統合されています。