用PlantUML可视化分层架构与微服务设计
用PlantUML表达分层架构与微服务设计模式
分层架构和微服务是现代系统设计中两种重要的架构模式,PlantUML提供了丰富的语法元素来清晰表达这些架构的关键特征。本文将重点介绍如何用PlantUML可视化架构中的隔离带、服务集群和前后端分离等核心概念。
一、分层架构的隔离带表示
分层架构通过明确定义的边界将系统划分为多个层次,隔离带(或称防腐层)是防止层间过度耦合的关键设计。
基础分层表示
@startuml
package "表现层(Presentation)" {
[Web前端]
[Mobile App]
}
package "业务逻辑层(Business)" {
[订单服务]
[支付服务]
}
package "数据访问层(Data)" {
[数据库网关]
[缓存服务]
}
[Web前端] --> [订单服务]
[Mobile App] --> [支付服务]
[订单服务] --> [数据库网关]
[支付服务] --> [缓存服务]
@enduml
隔离带实现方式
- 接口隔离:使用明确的接口定义层间通信
@startuml
interface "IOrderService" as orderService
interface "IPaymentService" as paymentService
package "表现层" {
[Web前端] --> orderService
[Mobile App] --> paymentService
}
package "业务层" {
class "OrderServiceImpl" as orderImpl
class "PaymentServiceImpl" as paymentImpl
orderService <|.. orderImpl
paymentService <|.. paymentImpl
}
@enduml
- 防腐层(Anti-Corruption Layer):在层间转换数据模型
@startuml
package "外部系统" {
[Legacy CRM]
}
package "防腐层" {
[CRM适配器]
[DTO转换器]
}
package "应用核心" {
[领域模型]
}
[Legacy CRM] --> [CRM适配器]
[CRM适配器] --> [DTO转换器]
[DTO转换器] --> [领域模型]
@enduml
实践建议:
- 使用
<<interface>>
明确标记层间契约 - 对跨层调用使用不同颜色箭头以示警告
- 在架构评审时特别检查跨层直接依赖
二、微服务组件集群表达
微服务架构中,服务通常以集群方式部署,PlantUML可以通过多种方式表达这种设计。
基础服务集群
@startuml
cloud {
component "API网关" as gateway
database "服务注册中心" as registry
frame "订单服务集群" {
node "订单服务1" as order1
node "订单服务2" as order2
node "订单服务3" as order3
}
frame "支付服务集群" {
node "支付服务1" as pay1
node "支付服务2" as pay2
}
gateway --> registry
order1 --> registry
order2 --> registry
pay1 --> registry
}
database "MySQL集群" as mysql
database "Redis集群" as redis
order1 --> mysql
order2 --> redis
pay1 --> mysql
@enduml
服务网格表示
@startuml
component "Envoy代理" as envoy1
component "Envoy代理" as envoy2
component "Envoy代理" as envoy3
package "服务网格" {
component "控制平面" as control
component "数据平面" as data {
envoy1 - envoy2 - envoy3
}
}
component "订单服务" as order
component "支付服务" as payment
order --> envoy1
payment --> envoy2
envoy3 --> database
@enduml
实践建议:
- 使用
cloud
或frame
表示逻辑集群边界 - 对无状态服务使用相同组件名+数字编号
- 明确标注服务发现机制(注册中心)
- 使用不同形状表示不同类型的存储服务
三、前后端分离架构标记
现代Web应用通常采用前后端分离架构,PlantUML可以清晰表达这种关注点分离。
基础前后端分离
@startuml
rectangle "浏览器" as browser {
component "SPA应用" as spa
component "静态资源" as assets
}
rectangle "API服务" as api {
[用户服务]
[商品服务]
[订单服务]
}
database "MySQL" as db
spa --> [用户服务] : REST/JSON
spa --> [商品服务] : GraphQL
[订单服务] --> db : JDBC
@enduml
前端微服务化(微前端)
@startuml
component "主框架" as main {
component "导航栏" as nav
component "布局管理器" as layout
}
component "应用A" as appA {
[商品列表]
[购物车]
}
component "应用B" as appB {
[用户中心]
[订单管理]
}
nav --> layout : 路由事件
layout --> appA : 挂载组件
layout --> appB : 挂载组件
@enduml
实践建议:
- 使用不同颜色区分前端和后端组件
- 明确标注通信协议(REST/WS/GraphQL)
- 对前端组件使用
rectangle
表示运行环境 - 对API网关到具体服务的路由使用注释说明
四、综合案例:电商平台架构
@startuml
!define AWSPUML https://raw.githubusercontent.com/awslabs/aws-icons-for-plantuml/v14.0/dist
!includeurl AWSPUML/AWSCommon.puml
!includeurl AWSPUML/Compute/EC2.puml
!includeurl AWSPUML/Database/RDS.puml
left to right direction
rectangle "客户端" {
[浏览器] as browser
[移动App] as mobile
}
cloud "CDN" as cdn {
EC2(静态资源, "S3+CloudFront")
}
cloud "API层" {
component "API网关" as gateway
component "认证服务" as auth
}
cloud "业务服务" {
frame "订单集群" {
node "订单服务1" as order1
node "订单服务2" as order2
}
frame "支付集群" {
node "支付服务1" as pay1
}
}
cloud "数据层" {
RDS(主数据库, "MySQL") as maindb
RDS(只读副本, "MySQL") as readdb
component "ElastiCache" as redis
}
browser --> cdn : 获取静态资源
mobile --> gateway : API调用
gateway --> auth : 鉴权
gateway --> order1 : 路由
order1 --> maindb : 写操作
order1 --> readdb : 读操作
pay1 --> redis : 分布式锁
@enduml
五、架构演进表达技巧
- 版本对比:使用
skinparam
区分不同版本
@startuml
skinparam monochrome true
title 架构演进对比
left to right direction
rectangle "V1.0 单体架构" {
[单体应用] --> [共享数据库]
}
rectangle "V2.0 微服务化" {
[用户服务] --> [用户DB]
[订单服务] --> [订单DB]
[支付服务] --> [支付DB]
}
@enduml
- 架构决策记录:关联ADR文档
@startuml
component "服务A" as A
component "服务B" as B
A --> B : 同步调用
note on link #pink: ADR-003: 允许临时同步调用\n计划Q3改为异步
@enduml
最佳实践:
- 对关键架构决策使用注释关联ADR编号
- 使用颜色渐变表示架构演进过程
- 在复杂架构图中添加分层指引标记
- 对临时方案使用特殊颜色/样式标注
通过合理运用PlantUML的这些特性,可以清晰表达架构中的层次边界、服务集群和前后端交互模式,有效支持架构设计沟通和决策过程。
评论已关闭