Я строю инфраструктуру, чтобы зарабатывать на жизнь. Обычно это включает в себя множество взаимодействующих друг с другом микросервисов. Сеть вызовов и обязанностей быстро становится трудной для понимания. Иногда доски и блокноты могут помочь демистифицировать систему, но я считаю документацию в виде кода гораздо лучшим решением (особенно когда многим разработчикам требуется адаптация).

Синтаксис файла DOT - это очень простой формат для описания графоподобного взаимодействия между узлами, который идеально подходит для документации по инфраструктуре. Определив DOT-файл, описывающий вашу систему, вы можете затем обработать его с помощью Graphviz и сгенерировать визуализации SVG или PNG. Затем вы можете включить эти изображения в файл README.md или в конвейер сборки, чтобы любой разработчик мог быстро понять вашу систему.

DOT файл

Вот пример DOT-файла, описывающий систему, которая обрабатывает потоки данных IOT с помощью общедоступного API, частного vpc и конвейера kinesis. Не беспокойтесь о деталях, просто используйте их как ссылку для следующего изображения.

/*
  This is a graphviz dot file
  See https://www.graphviz.org/doc/info/ for help
*/
digraph{
  graph [fontname = "monospace", fontsize="10", color="grey", fontcolor="grey"];
  node [fontname = "monospace",shape="box",style="filled"];
  edge [fontname = "monospace",color="blue", fontcolor="blue",fontsize="10"];
  /* 
    define components in the clusters they belong to
  */
  subgraph clusterProvider{
    label="3rd party"
    "user"
    "app"
    "provider-backend"[label="3rd party\nbackend"]
    "provider-developer" 
  }
  subgraph clusterPublicSubnet {
    label="public subnet"
    "public-api"
    "admin-api"
    "admin-gui"
  }
  subgraph clusterPrivateSubnet {
    label="private subnet"
    "IOT Gateway"
    "resource-service"
    "state-service"
    "DynamoDB" [shape="cylinder"]
    "RDS" [shape="cylinder"]
    "Kinesis"
  }
  subgraph clusterCustomerService {
    label="customer service"
   "customer-service"
  }
  subgraph clusterFleet {
    label="things"
    "thing" [shape="circle", color=""]
  }
  /* 
   define calls between existing components
  */
  "user" -> "app"
  "app" -> "provider-backend"
  "provider-backend" -> "public-api"[label="x-auth-token=API_KEY"]
  "public-api" -> "state-service" [label=" get thing\nlocation"]
  "public-api" -> "resource-service" [label=" get user,"]
  "resource-service" -> "RDS" [dir="both", label="read/write\nnon-transient\nresources"]
  "customer-service" -> "admin-gui"[label="manage users"]
  "customer-service" -> "provider-developer"[label="issue api key"]
  "admin-gui" -> "admin-api"
  "admin-api" -> "resource-service"[label="add users"]
  "IOT Gateway" -> "Kinesis"
  "Kinesis" -> "DynamoDB" [label="upsert \nthing state"]
  "state-service" -> "DynamoDB" [label="read \nthing state"]
  "thing" -> "IOT Gateway" [ label="thing\ntelematics\nstream" ] 
}

Строительство

dot demo.dot -T svg -o demo.svg

Результаты

Вывод

Как видите, изображения Graphviz DOT предоставляют очень четкий и полезный обзор сложной инфраструктуры. Как консультант я часто создаю эти графики для своих клиентов и сохраняю изображения и файлы DOT в репозитории обзора для последующего редактирования.

Надеюсь, этот совет окажется полезным и для вас.