自动创建微服务架构图方法介绍及实例

164 阅读7分钟

自动创建微服务架构图

让我们看看如何以一种用户友好的方式自动创建微服务架构图,而无需手动生成DOT文件。

在应用程序开发中,微服务是一种架构风格,较大的应用程序被结构化为较小的、独立的、但相互连接的服务集合。虽然这允许高度可维护和可测试的应用程序(因为每个服务可以独立于较大的应用程序进行维护),但这种方法的问题是微服务之间互动的固有复杂性。开发人员和团队成员可能很难想象这些微服务之间是如何连接的。我们一直在寻找方法来制作说明这些互动的架构图。我们发现GraphViz帮助我们解决了这个问题的一部分,因为它可以用DOT语言获取一个应用程序的微服务结构,并将其转换为PNG格式。然而,我们希望这个过程更加方便用户,更加自动,这样用户就不必手动生成其微服务架构的DOT文件。

浏览器内工具

由于我们找不到这样的工具,我们决定自己创建一个。我们决定,最方便用户的界面是创建一个浏览器内工具,允许用户上传一个包含打包服务的jar文件,并自动呈现图像。这篇文章讨论了我们是如何创建这个工具的,并包括一个关于这个界面的 "幕后 "情况的例子。

对于我们的事件流微服务框架,我们使用了Chronicle Services。在本文的范围内,我不会关注Chronicle的微服务框架的细节;本文中提到的技术也可以应用于其他许多类似的框架。

将微服务架构转换为DOT格式

正如所讨论的,通过这个工具,我们将对基于微服务的应用程序的架构进行描述,并产生服务之间连接的图形表示。在我们的案例中,这种 "描述 "包含在一个叫做services.yaml的YAML文件中。YAML 是一种对人友好的数据序列化语言。因此,我们的工具的第一步是从微服务配置文件(services.yaml)中读取内容,并产生一个相应的DOT文件。这个链接提供了一些关于DOT语言的结构和语法的更多细节。

GraphViz:DOT到PNG转换器

一旦我们有了这个临时的DOT文件,我们就需要能够将其转换为PNG图像。我们选择使用GraphViz(一个开源的图形可视化软件)来完成这个过程。GraphViz工具定义了属性渲染选项,所以我们能够定制我们的图像如何出现在用户面前,例如每个组件的颜色、字体类型和箭头样式。GraphViz可以从这里下载和安装。关于如何创建和定制属性的更多信息,请阅读这里

通常,GraphViz是通过终端运行的,但我们使用Java来直接从网络服务器上实时执行用户通过浏览器上传的新微服务配置文件。我们的工具使用了Java的ProcessBuilder,它调用了GraphViz。对于如何输出PNG(或其他文件类型),有几个选项。在这种情况下,选择 "Tpng:cairo "是因为其图像质量较高。根据你的使用情况,可以在这里看到PNG或文件输出的替代品。图1中可以看到一个简单的渲染图像的例子,下面我将通过一个例子来说明上述步骤。

图1.渲染后的services.yaml文件

例子

让我们看一个例子来说明我们如何制作一个说明简单服务的图像。

1.读取 Chronicle Services 配置文件

第一步是读取services.yaml文件的内容。下面的例子描述了services.yaml文件可能包含的内容。Chronicle服务使用Chronicle队列相互通信。所以该文件定义了队列以及服务。在本例中,我们只有一个名为 "simple "的服务,从队列 "input "中读取输入信息,并在队列 "output "中写入输出信息。

!ChronicleServicesCfg {
   queues: {
      input: {path: input, sourceId: 1, {
         rollCycle: { path: output, sourceId: 2, {
            rollCycle: !RollCycles HOURLY }},
   },
   services: {
      simple: {
         inputs: [input],
         output: output,
         implClass: !type software.chronicle.services.demo.example1.ServiceImpl,
      },
   },
}

2.将服务配置文件编入DOT格式

一旦services.yaml文件被读取,其内容被翻译成DOT并写入文件。为了进行这种翻译,我们编写了自定义代码。下面是一个将被写入这个DOT文件的例子(为了简单起见,有些部分被排除在外)。它以'digraph'开始,声明我们想要一个有向图,在这里面我们描述了它的属性。在'一般'下,我们定义了背景颜色等属性,在这下面我们定义了应该使用这些属性的图形组件(节点、边等)。值得注意的是,服务由图中的节点表示,队列由连接它们的边表示。

digraph G {
    # General
    label="services.yaml\l ";
    labeljust="l";
    labelloc = "b";
    fontsize = "6";
    bgcolor="#181F4C";
    fillcolor="#1E252B";
    fontcolor="white";
    fontname="Helvetica";
    pad="0.5";

    # Service simple
    "queue__input" -> "service__simple" [penwidth=2, color="white", style="dashed", fontcolor="white", fontname="Helvetica", label=<<FONT POINT-SIZE="12"> </FONT>>] ;
    "service__simple" -> "queue__output" [penwidth=2, color="white", style="dashed", fontcolor="white", fontname="Helvetica", label=<<FONT POINT-SIZE="12">  OutputData </FONT>>] ;
}


3.DOT到PNG

现在我们有了描述我们的图应该是什么样子的DOT文件,我们用GraphViz的主要选项 "Tpng:cairo "来转换为图形表示。图1(见上图)是前两个步骤产生的图像。

复杂的服务

上面的例子很简单,但现实世界中的应用实例可能包含几十个微服务和队列。图2描述了一个稍微复杂的应用程序的样本。

图2.Binance-spot-and-futures.yaml

额外的框架。Undertow

因为我们希望有一个浏览器内的工具,而且我们的项目是用Java编写的,所以我们使用了Undertow,这是一个用Java编写的灵活和高性能的网络服务器,很容易被添加到我们的Java应用中作为一个依赖项。

特别是,我们利用了以下Undertow的API。要了解更多关于这些的信息以及如何实现它们,请看这里.

  • Undertow Builder: 这个API可以让你快速配置和启动一个Undertow服务器。
  • 响应头信息: 这个设置内容类型头。
  • 响应发送器: 这个API是发送响应的一种方式。提供的字符串是完整的响应,这就是将被发送到服务器的内容。

服务图示工具总结

我们把这个项目称为services-diagram。要查看该工具的运行情况,请点击这里。如前所述,这个工具可以让用户快速生成一个图像,有效地说明服务在一个特定项目中是如何连接的。创建这种服务之间相互作用的可视化表示,可以让开发人员和其他团队成员掌握项目的整体架构。

这个工具与Chronicle微服务框架一起工作,它需要一个用这个框架构建的jar文件上传到网页上。同样关键的是,该文件至少包含一个有效的服务配置文件(services.yaml );我们所说的 "有效 "services.yaml文件是指它包含一个条目 "ChronicleServicesCfg"。 如果你使用不同的微服务框架,你可以用你自己的服务配置文件替换ChronicleServicesCfg配置文件,并创建你自己的数字图生成器。

如果这两方面都成功了,该工具会生成一个格式化的图像(PNG),显示项目的不同服务之间的关系。

结论

拥有架构图可以增加我们的文档,同时也为我们提供了一个简单快速的工具来查看我们项目的结构。现在我们有了一个简单上传jar文件的方法,搜索yaml文件、创建DOT文件、然后将其转换为PNG的过程都在幕后进行,只需点击一个按钮。请看这里,观看一个演示。