Введение в Structurizr

Введение в Структуризр

1. Вступление

Эта статья о Structurizr, инструменте, который предоставляетprogrammatic approach to architectural definitions and visualizations based on the C4 Model.

Structurizr не работает с традиционными методами перетаскивания и редактирования архитектурных диаграмм, такими как UML, и позволяет нам описывать наши архитектурные артефакты, используя инструмент, который мы знаем лучше всего: Java.

2. Начиная

Для начала давайте добавим зависимостьstructurizr-core к нашемуpom.xml:


    com.structurizr
    structurizr-core
    1.0.0-RC5

3. системы

Приступим к моделированию образца архитектуры. Предположим, мы создаем платежный терминал с функцией обнаружения мошенничества, который используется продавцами для клиринга платежей.

Во-первых, нам нужно создатьWorkspace иModel:

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

Мы также определяем пользователя и две программные системы в рамках этой модели:

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

В предыдущем разделе мы создали представление простого платежного шлюза.

Следующим шагом является создание удобной для человека диаграммы. Вероятно, самым простым решением для организации, уже использующейPlantUML, было бы указать Structurizr выполнить экспорт PlantUML:

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

Здесь результирующая разметка выводится на экран, но ее так же легко можно отправить в файл. Рендеринг данных таким способом дает диаграмму ниже:

image

5. Просмотр на веб-сайте Structurizr

Существует еще один вариант рендеринга диаграмм. Архитектурный вид можно отправить на веб-сайт Structurizr через клиентский API. Диаграмма будет сгенерирована с использованием их богатого пользовательского интерфейса.

Давайте создадим клиент API:

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

Ключевые и секретные параметры получены из панели инструментов рабочего пространства на их веб-сайте. Рабочее пространство может быть затем упомянуто:

client.putWorkspace(1337, workspace);

Очевидно, что нам нужно зарегистрироваться на сайте и создать рабочее пространство. Базовая учетная запись с одним рабочим пространством является бесплатной. В то же время коммерческие планы также доступны.

6. Контейнеры

Давайте расширим нашу программную систему, добавив несколько контейнеров. В модели C4 контейнерами могут быть веб-приложения, мобильные приложения, настольные приложения, базы данных и файловые системы: практически все, что содержит код и / или данные.

Сначала мы создаем несколько контейнеров для нашего платежного терминала:

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 дает:

image

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 приводит к:

image

8. Компонент Извлечение

Для существующих баз кода, использующих среду Spring, Structurizr предоставляет автоматический способ извлечения аннотированных компонентов Spring и добавления их к архитектурным артефактам.

Чтобы использовать эту функцию, нам нужно добавить еще одну зависимость:


    com.structurizr
    structurizr-spring
    1.0.0-RC5

Затем нам нужно создатьComponentFinder, настроенный с одной или несколькими стратегиями разрешения. Стратегии разрешения влияют на такие вещи, как то, какие компоненты будут добавлены в модель, глубина обхода дерева зависимостей и т. Д.

Мы даже можем подключить собственные стратегии разрешения:

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

Наконец, мы запускаем поиск:

componentFinder.findComponents();

Приведенный выше код сканирует пакетcom.example.structurizr на наличие компонентов с аннотациями Spring и добавляет их в качестве компонентов в JVM контейнера. Излишне говорить, что мы можем свободно внедрять собственные сканеры, ресурсы с аннотациями JAX-RS и даже подшивки Google Guice.

Пример простой диаграммы из примера проекта приведен ниже:

image

9. Заключение

Это краткое руководство охватывает основы проекта Structurizr for Java.

И, как всегда, можно найти пример кодаover on GitHub.