PlantUML组件图教程:定义、接口与契约详解
PlantUML组件图基础:组件定义与接口契约详解
组件图是软件架构设计中表达系统模块化结构的重要工具,本文将深入讲解PlantUML中组件(Component)的基础定义方式,包括组件语法、接口表示以及端口契约机制。
一、组件基础语法
在PlantUML中,组件使用方括号或component
关键字定义:
[订单服务] as orders
component "支付服务" as payments
组件可以添加技术栈标记:
[Web前端] <<Angular>>
[API网关] <<Spring Cloud>>
实践建议:
- 组件命名采用业务能力命名(如"支付服务")而非技术实现命名(如"Java服务")
- 技术栈标记应仅在与架构决策相关时添加
- 大型系统建议使用
package
分组管理相关组件
二、接口表示方法
2.1 显式接口(球窝表示法)
component [订单服务] {
interface "订单查询"
interface "订单创建"
}
[支付服务] ..> [订单服务].订单查询 : 使用
2.2 隐式接口(Lollipop表示法)
component 订单服务 {
[订单查询]
[订单创建]
}
支付服务 --> 订单服务.订单创建
接口设计原则:
- 显式接口适合稳定且需要明确契约的接口
- 隐式接口适合快速原型阶段或内部组件通信
- 接口命名应使用动宾短语(如"处理支付")
三、端口与契约机制
端口(Port)定义组件的交互点,契约(Contract)规定交互规则:
component 订单服务 {
portin 查询端口 <<HTTP>> {
contract "必须使用HTTPS"
contract "响应时间<500ms"
}
portout 事件端口 <<Kafka>> {
contract "消息格式: Avro"
}
}
[库存服务] --> 订单服务.查询端口
订单服务.事件端口 --> [消息总线]
端口最佳实践:
- 按输入(
portin
)/输出(portout
)方向声明端口 - 为关键端口添加协议标记(<
>, < >等) - 重要契约应明确SLA和格式要求
- 避免单个组件暴露过多端口(建议≤5个)
四、综合示例
@startuml eCommerceSystem
package "电商系统" {
component [前端] <<React>> {
portin API网关 <<HTTPS>>
}
component [API网关] {
interface "用户认证"
interface "订单管理"
}
component [订单服务] <<Spring Boot>> {
portin 订单写入 <<gRPC>> {
contract "幂等设计"
}
portout 支付事件 <<Kafka>>
}
}
[前端] --> [API网关].用户认证
[API网关].订单管理 --> [订单服务].订单写入
[订单服务].支付事件 --> [支付系统]
@enduml
五、常见问题解决方案
问题1:如何处理组件过多导致的图面混乱?
- 使用
package
分组(按业务域/功能层) - 分多个图表展示不同视角(如业务视图、技术视图)
- 对次要组件使用
<<external>>
标记
问题2:如何表示接口版本差异?
component [旧服务] {
interface "数据同步" <<v1.0>>
}
component [新服务] {
interface "数据同步" <<v2.1>>
}
[适配器] -> [旧服务].数据同步 <<v1.0>>
[适配器] -> [新服务].数据同步 <<v2.1>>
掌握这些基础定义方法后,可以继续学习组件间的连接方式(如装配连接器、委托连接器)来构建完整的系统架构图。记住:好的组件图应该同时传达技术实现和业务语义两个层面的信息。
评论已关闭