用PlantUML表达分层架构与微服务设计模式

分层架构和微服务是现代系统设计中两种重要的架构模式,PlantUML提供了丰富的语法元素来清晰表达这些架构的关键特征。本文将重点介绍如何用PlantUML可视化架构中的隔离带、服务集群和前后端分离等核心概念。

一、分层架构的隔离带表示

分层架构通过明确定义的边界将系统划分为多个层次,隔离带(或称防腐层)是防止层间过度耦合的关键设计。

基础分层表示

@startuml
package "表现层(Presentation)" {
    [Web前端]
    [Mobile App]
}

package "业务逻辑层(Business)" {
    [订单服务]
    [支付服务]
}

package "数据访问层(Data)" {
    [数据库网关]
    [缓存服务]
}

[Web前端] --> [订单服务]
[Mobile App] --> [支付服务]
[订单服务] --> [数据库网关]
[支付服务] --> [缓存服务]
@enduml

隔离带实现方式

  1. 接口隔离:使用明确的接口定义层间通信
@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
  1. 防腐层(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

实践建议

  • 使用cloudframe表示逻辑集群边界
  • 对无状态服务使用相同组件名+数字编号
  • 明确标注服务发现机制(注册中心)
  • 使用不同形状表示不同类型的存储服务

三、前后端分离架构标记

现代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

五、架构演进表达技巧

  1. 版本对比:使用skinparam区分不同版本
@startuml
skinparam monochrome true

title 架构演进对比

left to right direction

rectangle "V1.0 单体架构" {
    [单体应用] --> [共享数据库]
}

rectangle "V2.0 微服务化" {
    [用户服务] --> [用户DB]
    [订单服务] --> [订单DB]
    [支付服务] --> [支付DB]
}
@enduml
  1. 架构决策记录:关联ADR文档
@startuml
component "服务A" as A
component "服务B" as B

A --> B : 同步调用
note on link #pink: ADR-003: 允许临时同步调用\n计划Q3改为异步
@enduml

最佳实践

  1. 对关键架构决策使用注释关联ADR编号
  2. 使用颜色渐变表示架构演进过程
  3. 在复杂架构图中添加分层指引标记
  4. 对临时方案使用特殊颜色/样式标注

通过合理运用PlantUML的这些特性,可以清晰表达架构中的层次边界、服务集群和前后端交互模式,有效支持架构设计沟通和决策过程。

评论已关闭