1前書き

この記事は、Structurizr、つまりhttps://www.structurizr.com/help/c4[C4 Model]に基づくアーキテクチャ上の定義および視覚化へのプログラムによるアプローチを提供するツールについての記事です。

Structurizrは、UMLなどの建築図エディタの伝統的なドラッグアンドドロップのアプローチを打ち破り、私たちが最もよく知っているツール、つまりJavaを使用して建築の成果物を記述することを可能にします。

2.はじめに

必要なアーティファクトはMaven Centralにはまだミラーリングされていないので、まず始めに

pom.xml

にJCenterリポジトリを追加しましょう。

<repositories>
    <repository>
        <snapshots>
            <enabled>false</enabled>
        </snapshots>
        <id>central</id>
        <name>bintray</name>
    <url>http://jcenter.bintray.com</url>
    </repository>
</repositories>

その後、依存関係を追加することができます。

<dependency>
    <groupId>com.structurizr</groupId>
    <artifactId>structurizr-core</artifactId>
    <version>1.0.0-RC3</version>
</dependency>


3システム

サンプルアーキテクチャのモデリングを始めましょう。支払いを清算するために加盟店が使用する不正検出可能な支払い端末を構築しているとします。

まず、

Workspace



Model

を作成する必要があります。

Workspace workspace = new Workspace("Payment Gateway", "Payment Gateway");
Model model = workspace.getModel();

また、そのモデル内にユーザーと2つのソフトウェアシステムを定義します。

Person user = model.addPerson("Merchant", "Merchant");
SoftwareSystem paymentTerminal = model.addSoftwareSystem(
  "Payment Terminal", "Payment Terminal");
user.uses(paymentTerminal, "Makes payment");
SoftwareSystem fraudDetector = model.addSoftwareSystem(
  "Fraud Detector", "Fraud Detector");
paymentTerminal.uses(fraudDetector, "Obtains fraud score");

システムが定義されたので、ビューを作成できます。

ViewSet viewSet = workspace.getViews();

SystemContextView contextView = viewSet.createSystemContextView(
  paymentTerminal, "context", "Payment Gateway Diagram");
contextView.addAllSoftwareSystems();
contextView.addAllPeople();

ここでは、すべてのソフトウェアシステムと人を含むビューを作成しました。

今度はビューをレンダリングする必要があります。


4 PlantUML

で見る

前のセクションでは、単純な支払いゲートウェイのビューを作成しました。

次のステップは、人に優しい図を作成することです。おそらくhttp://plantuml.com/[PlalantUML]をすでに使用している組織にとって最も簡単な解決策は、StructurizrにPlantUMLエクスポートを実行するように指示することです。

StringWriter stringWriter = new StringWriter();
PlantUMLWriter plantUMLWriter = new PlantUMLWriter();
plantUMLWriter.write(workspace, stringWriter);
System.out.println(stringWriter.toString());

ここでは結果のマークアップがスクリーンに印刷されますが、ファイルに送信するのも同じくらい簡単です。このようにデータをレンダリングすると、以下の図が生成されます。

リンク:/uploads/try.png%20326w[]


5 Structurizr Webサイトで見る

ダイアグラムをレンダリングするための別のオプションがあります。アーキテクチャビューは、クライアントAPIを介してStructurizr Webサイトに送信できます。その後、ダイアグラムはその豊富なUIを使用して生成されます。

APIクライアントを作成しましょう。

StructurizrClient client = new StructurizrClient("key", "secret");

鍵と秘密のパラメータは、Webサイトのワークスペースダッシュボードから取得されます。ワークスペースは、次のようにして参照できます。

client.putWorkspace(1337, workspace);

明らかに、Webサイトに登録してワークスペースを作成する必要があります。単一のワークスペースを持つ基本アカウントは無料です。同時に、商業計画も可能です。


6. コンテナ

コンテナを追加してソフトウェアシステムを拡張しましょう。 C4モデルでは、コンテナはWebアプリケーション、モバイルアプリケーション、デスクトップアプリケーション、データベース、ファイルシステムなど、コードやデータを保持するものならほとんど何でも構いません。

まず、支払い端末用のコンテナをいくつか作成します。

Container f5 = paymentTerminal.addContainer(
  "Payment Load Balancer", "Payment Load Balancer", "F5");
Container jvm1 = paymentTerminal.addContainer(
  "JVM-1", "JVM-1", "Java Virtual Machine");
Container jvm2 = paymentTerminal.addContainer(
  "JVM-2", "JVM-2", "Java Virtual Machine");
Container jvm3 = paymentTerminal.addContainer(
  "JVM-3", "JVM-3", "Java Virtual Machine");
Container oracle = paymentTerminal.addContainer(
  "oracleDB", "Oracle Database", "RDBMS");

次に、新しく作成した要素間の関係を定義します。

f5.uses(jvm1, "route");
f5.uses(jvm2, "route");
f5.uses(jvm3, "route");

jvm1.uses(oracle, "storage");
jvm2.uses(oracle, "storage");
jvm3.uses(oracle, "storage");

最後に、レンダラーに渡すことができるコンテナビューを作成します。

ContainerView view = workspace.getViews()
  .createContainerView(paymentTerminal, "F5", "Container View");
view.addAllContainers();

PlantUMLを介して結果の図をレンダリングすると、次のようになります。

リンク:/uploads/Containers.png%20451w[]


7. コンポーネント

C4モデルの次のレベルの詳細は、コンポーネントビューによって提供されます。作成することは、以前行ったことと似ています。

まず、コンテナ内にいくつかのコンポーネントを作成します。

Component jaxrs = jvm1.addComponent("jaxrs-jersey",
  "restful webservice implementation", "rest");
Component gemfire = jvm1.addComponent("gemfire",
  "Clustered Cache Gemfire", "cache");
Component hibernate = jvm1.addComponent("hibernate",
  "Data Access Layer", "jpa");

次に、いくつかの関係を追加しましょう。

jaxrs.uses(gemfire, "");
gemfire.uses(hibernate, "");

最後に、ビューを作成しましょう。

ComponentView componentView = workspace.getViews()
  .createComponentView(jvm1, JVM__COMPOSITION, "JVM Components");

componentView.addAllComponents();

PlantUMLを介して結果の図をレンダリングすると、次のようになります。

リンク:/uploads/Components.png%20376w[]


8コンポーネント抽出

Springフレームワークを使用している既存のコードベースのために、StructurizrはSpringアノテーション付きコンポーネントを自動的に抽出してそれらをアーキテクチャー成果物に追加する方法を提供します。

この機能を利用するには、さらに別の依存関係を追加する必要があります。

<dependency>
    <groupId>com.structurizr</groupId>
    <artifactId>structurizr-spring</artifactId>
    <version>1.0.0-RC3</version>
</dependency>

次に、1つ以上の解決方法で設定された

ComponentFinder

を作成する必要があります。解決方法は、どのコンポーネントがモデルに追加されるか、依存ツリーの深さのトラバースなどの要素に影響します

  • 私達は注文の決断の作戦をまたプラグインできる:**

ComponentFinder componentFinder = new ComponentFinder(
  jvm, "com.baeldung.structurizr",
  new SpringComponentFinderStrategy(
    new ReferencedTypesSupportingTypesStrategy()
  ),
  new SourceCodeComponentFinderStrategy(new File("/path/to/base"), 150));

最後に、ファインダーを起動します。

componentFinder.findComponents();

上記のコードは、Springアノテーション付きBeanの

com.baeldung.structurizr

パッケージをスキャンし、それらをコンポーネントとしてコンテナJVMに追加します。

言うまでもなく、Googleでは独自のスキャナー、JAX-RSアノテーション付きリソース、さらにはGoogle Guiceバインダーも実装することができます。

サンプルプロジェクトの簡単な図の例を以下に再現します。

リンク:/uploads/spring.png%20430w[]


9結論

このクイックチュートリアルでは、Structurizr for Javaプロジェクトの基本について説明します。

そして、いつものように、サンプルコードはhttps://github.com/eugenp/tutorials/tree/master/structurizr[GitHubに追加]を見つけることができます。