前篇介绍了如何使用PlantUML代码生成UML图 –《Diagrams as Code – PlantUML, 不再“画”图》,还介绍了关于C4模型 –《可视化软件系统架构 – C4模型》。那么能不能用PlantUML生成C4架构图呢?当然可以,解决方案是C4-PlantUML。 C4-PlantUML 结合了PlantUML和C4 模型的优势,通过使用开源和独立于平台的工具的直观语言,提供了一种描述和传达软件架构的简单方法(尤其是在前期设计阶段)。 接下来,我们来看看使用C4-PlantUML的案例。
系统上下文图
上图是虚构的阿里无人机科技公司的B2B销售系统,经销商可以在销售系统上购买商品,内部销售人员将会审核订单,销售运营人员可以在销售系统上查看销售报表。
c4-plantuml使用Person
定义系统用户:
|
|
使用Person_Ext
定义外部用户经销商:
|
|
使用System
定义系统:
|
|
使用System_Ext
定义外部系统:
|
|
使用Rel
表示关系,例如,内部销售人员使用销售系统:
|
|
本例完整的c4-plantuml代码如下:
|
|
容器图
上图放大了销售系统,显示其中的应用程序、数据存储和消息队列等中间件。系统是前后端分离的微服务架构,由Web前端、API网关、订单服务、结算服务、基础服务几个应用组成,每个后端微服务有各自独立使用的数据库,订单服务和结算服务的集成使用消息队列的方式。
c4-plantuml使用关键字Container
定义应用:
|
|
使用关键字ContainerDb
定义数据库:
|
|
使用关键字ContainerQueue
定义消息队列:
|
|
使用Rel
表示关系,例如读写数据库:
|
|
本例完整的c4-plantuml代码如下:
|
|
组件图
上图放大了订单服务,展示订单服务的内部组件。RestController暴露API端点,提供HTTP访问服务,ApplicationService提供订单应用服务,DomainModel定义了领域模型处理业务逻辑,Repository组件增删改查数据库,ServiceProxy集成其他服务或者外部系统。
c4-plantuml使用关键字Component
定义组件:
|
|
使用Rel
表示关系,例如RestController调用ApplicationService:
|
|
本例完整的c4-plantuml代码如下:
|
|
代码图
上图放大了domain-model组件,用UML类图展示实现类模型。 c4-plantuml的代码图使用plantuml类图语法,可阅读前篇《Diagrams as Code – PlantUML, 不再“画”图》。 本例完整的c4-plantuml代码如下:
|
|
如何渲染出图?
c4-plantuml扩展了plantuml,所以渲染方式同plantuml是一样的,主要以下几种方式:
- 在线网站,如https://plantumleditor.com/webedit/
- 部署在本地、服务器或者云
- Visual Studio Code,安装plantuml插件
- Jetbrains系列产品,也支持安装plantuml插件,如Idea, Rider, WebStorm等等
以上几种都可以即时在屏幕上渲染出图片,也支持导出图片。如果你发现排版上需要调整,可以尝试使用以下布局方式:
- LAYOUT_TOP_DOWN()
- LAYOUT_LEFT_RIGHT()
- LAYOUT_LANDSCAPE()
或者强制调整REL方向:
- REL_L(a, b): b在a左边
- REL_R(a, b): b在a右边
- REL_U(a, b): b在a上边
- REL_D(a, b): b在a下边