作为一个程序员,如果让你绘制以后正在开发的我的项目的架构图,你会怎么绘制?
背景
先来同步一个理念。架构图的作用是什么?
我答复一下:
提供了一个简略的办法给到开发团队(从开发工程师,测试工程师,架构师,测试,我的项目经验,产品经理,交互设计师,用户)可能更简略的形容和沟通软件架构,让团队每个人脑子里的架构可视化,更容易了解,造成对立;
演绎一下:画个图让团队更好好的了解软件架构,并对立认知;
上面,我简略思考一下作为程序员应该如何绘制以后正在开发我的项目的架构图。
问题 | 答复 |
---|---|
where are we? 现状 | 我是程序员,不晓得怎么绘制我的项目的架构图 |
where are we go? 目标 | 可绘制不便平级,下级之间沟通交流的架构图 |
how can we go there? 实现门路 | C4PlantUML |
实现门路
C4 模型
一种架构设计的方法论,疏忽不在同一个形象问题的细节,从而能够更好的表白和可视化。
能够类比地图,地图分 4 个级别,国家,省,市,街道;
而 C4 模型也分 4 个层级,Context 零碎上下文,Container 容器,Component 组件,Code 代码;
加上 3 种补充视图,即零碎全景图,动态图,部署图,即可残缺的形容一个我的项目的软件架构;
布局
分 4 个
布局阐明 | 语法 |
---|---|
从上到下 | LAYOUT_TOP_DOWN |
从左到右 | LAYOUT_RIGHT_LEFT |
自在布局 | LAYOUT_WITH_LEGEND |
素描布局 | LAYOUT_AS_SKETCH |
可自定义更多的布局,源码是基于 plantUML 语法;
Context 上下文
元素如下:
元素名称 | 函数 |
---|---|
角色 | Person |
内部角色 | Person_Ext |
关注的软件系统 | System |
内部软件系统 | System_Ext |
零碎数据库 | SystemDb |
零碎内部数据库 | SystemDb_Ext |
零碎虚框 | System_Boundry |
企业虚框 | Enterprise_Boundry |
能够应用 plantUML 绘制零碎全景图,零碎物理部署图;
上面是一个例子:
@startuml "enterprise"
!include ../C4_Context.puml
LAYOUT_TOP_DOWN
LAYOUT_WITH_LEGEND()
Person(customer, "客户", "一种限度工具的客户")
Enterprise_Boundary(c0, "限度工具") {Person(csa, "客户服务代理", "解决客户询问")
System(ecommerce, "电子商务系统", "容许客户通过 widgets.com 站点在线购买工具")
System(fulfilment, "履行零碎", "负责解决和传递客户订单")
}
System(taxamo, "Taxamo", "计算本地税务并表演 Braintree 领取前台")
System(braintree, "Braintree 领取", "解决信用卡领取购买工具")
System(post, "泽西邮报", "计算全世界的包裹邮费")
Rel_R(customer, csa, "征询", "电话")
Rel_R(customer, ecommerce, "下工具订单")
Rel(csa, ecommerce, "查问订单信息")
Rel_R(ecommerce, fulfilment, "发送订单信息")
Rel_D(fulfilment, post, "获取物流费用")
Rel_D(ecommerce, taxamo, "代理信用卡解决")
Rel_L(taxamo, braintree, "应用信用卡")
Lay_D(customer, braintree)
@enduml
Container 容器
元素如下:
元素名称 | 函数 |
---|---|
容器 | Container |
容器数据库 | ContainerDb |
容器虚框 | Container_Boundry |
@startuml
!include ../C4_Container.puml
LAYOUT_TOP_DOWN
LAYOUT_WITH_LEGEND()
title 网银零碎容器图
Person(customer, 客户, "银行客户有本人的私人银行账号")
System_Boundary(c1, "网银") {Container(web_app, "Web 利用", "Java, Spring MVC", "传递动态内容和网银 SPA")
Container(spa, "单页利用", "JavaScript, Angular", "通过浏览器对用户提供所有的网银性能")
Container(mobile_app, "手机利用", "C#, Xamarin", "通过手机设施提供无限的网银性能")
ContainerDb(database, "数据库", "SQL 数据库", "存储用户的注册信息,随机认证明码,拜访日志等")
Container(backend_api, "API 利用", "Java, Docker 容器", "通过 API 提供网银性能")
}
System_Ext(email_system, "邮件系统", "网络软件替换零碎")
System_Ext(banking_system, "Mainframe 银行零碎", "存储所有的外围客户,账号,事务银行信息")
Rel(customer, web_app, "应用", "HTTPS")
Rel(customer, spa, "应用", "HTTPS")
Rel(customer, mobile_app, "应用")
Rel_Neighbor(web_app, spa, "传输")
Rel(spa, backend_api, "应用", "异步, JSON/HTTPS")
Rel(mobile_app, backend_api, "应用", "异步, JSON/HTTPS")
Rel_Back_Neighbor(database, backend_api, "读写", "同步, JDBC")
Rel_Back(customer, email_system, "发送邮件到")
Rel_Back(email_system, backend_api, "发送邮件", SMTP")
Rel_Neighbor(backend_api, banking_system, "应用", "同步 / 异步, XML/HTTPS")
@enduml
Component 组件
元素如下:
元素名称 | 函数 |
---|---|
组件 | Component |
组件数据库 | ComponentDb |
@startuml
!include ../C4_Component.puml
LAYOUT_WITH_LEGEND()
title 网银零碎组件图 - API 利用
Container(spa, "单页利用", "javascript 和 angular", "通过浏览器提供所有的网银零碎性能给到用户.")
Container(ma, "手机利用", "Xamarin", "通过手机设施提供无限的网银零碎性能给用户.")
ContainerDb(db, "数据库", "关系数据库 Schema", "存储用户的注册信息, 随机认证令牌, 拜访日志等.")
System_Ext(mbs, "Mainframe 银行零碎", "存储用户,账号,交易等所有的外围银行信息.")
Container_Boundary(api, "API 利用") {Component(sign, "登录控制器", "MVC Rest 控制器", "容许用户登录到网银零碎")
Component(accounts, "账户汇总控制器", "MVC Rest 控制器", "提供用户汇总的银行账号")
Component(security, "平安组件", "Spring Bean", "提供登录,批改明码等相干性能")
Component(mbsfacade, "Mainframe 银行零碎 Facade", "Spring Bean", "一个 mainframe 银行零碎 facade.")
Rel(sign, security, "应用")
Rel(accounts, mbsfacade, "应用")
Rel(security, db, "读写", "JDBC")
Rel(mbsfacade, mbs, "应用", "XML/HTTPS")
}
Rel(spa, sign, "应用", "JSON/HTTPS")
Rel(spa, accounts, "应用", "JSON/HTTPS")
Rel(ma, sign, "应用", "JSON/HTTPS")
Rel(ma, accounts, "应用", "JSON/HTTPS")
@enduml
Code 代码
即通用的,元素如下:
元素名称 | 函数 |
---|---|
虚框 | Boundry |
从上到下关系 | Rel |
反向关系 | Rel_Back |
从上到下关系 | Rel_U |
从下到上关系 | Rel_D |
从左到右关系 | Rel_L |
从右到左关系 | Rel_R |
代码级别可应用 PlantUML 绘制时序图,流程图,类图形容具体接口或者性能的实现细节;
这块是 PlantUML 的基础知识了,不具体开展,自行查阅材料即可。
@startuml
actor 用户 as user
participant 浏览器 as browser
participant 前端 as front
participant 登录服务 as loginServer
database 数据库 as db
user -> browser: 关上登录页面
browser->front: 加载资源, 输出账号密码
front->loginServer:ajax 申请
loginServer->db: 依照账号查问,校验明码
return: 返回后果
@enduml
C4PlantUML
它是两个货色的合体,提供了一种简略的办法来形容和沟通软件架构。
plantuml 被发明用来容许你绘制 UML 图,应用简略和人类容易浏览的文本形容,因为它没有阻止你绘制反常的图,它只是一个绘图工具而不是一个建模工具;
他是应用最多的文本绘图工具,被 wiki, 论坛,文本编辑器和 IDE 强烈反对,能够应用不同的编程语言或者文档来生成;
C4 模型对软件架构来说是一个形象第一的绘图形式。基于形象,能够反映出软件架构师和开发者是如何思考和构建软件的。
大量的形象和绘图类型是的 C4 模型很容易学习和应用;
C4 代表着 context,containers,components,code; 这一系列程度层级的图,你能够应用它来从不同的尺度向不同的听众形容你的软件架构。
C4 模型和 plantUML 分工如下:
技术点 | 用处 |
---|---|
plantUML | 写简略的代码即可绘图 |
c4 模型 | 一种对系统架构的形象的方法论 |
C4PlantUML | 定义一种 C4 模型的绘图格调,应用 PlantUML 进行文本绘图 |
应用形式:
下载 C4PlantUML 抉择你相熟的 IDE 集成即可应用;
IDE | 应用形式 |
---|---|
vscode | 装置 PlantUML 和 PlantUML Preview 插件 , Jdk , graphviz |
vscode 引入
.vscode/C4.code-snippets. |
| idea | 下载 plantUML 插件,装置好 graphviz
关上 C4PlantUML 文件即可 |
命名规定:
- context 上下文图
- container 容器图
- component 组件图
- sequence 时序图
- usecase 用例图
- class 类图
- activity 流动图
- state 状态图
- object 对象图
- deployment 部署图
- timing 定时图
绘图步骤:
1. 创立模型图名,依照下面的命名规定,xxx_项目名称.puml;
2. 引入相对路径下的 path/C4_Component.puml
3. 应用内置的函数,绘图;
小结
如果看完之后你只能记住一句话:C4PlantUML 提供了一个绘图形式让你轻松的形容和表白软件架构;
想要我的学习材料吗?请留下你的评论。
原创不易,关注诚可贵,转发价更高!转载请注明出处,让咱们互通有无,共同进步,欢送沟通交流。