新增内容: - 系统架构图文档(system-architecture-diagrams.md,含Mermaid图) - 3个Draw.io可直接导入文件(分层/数据流/部署架构) - 详细的绘制指南、元素定义表格、颜色方案 - 架构决策记录(ADR)和推荐阅读顺序 基于8个核心模块分析生成,遵循"三大母版"原则: 1. 平台分层架构图 - 逻辑分层和职责划分 2. 健康数据流架构图 - 数据生命周期和流转 3. 组件部署架构图 - K8s集群部署和资源配置 Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
31 KiB
LJWX Health 系统架构图 (三大视角)
基于8个核心模块深度分析生成 生成时间: 2026-01-25 版本: V1.0 重要: 三张图独立阅读,不要混淆视角
📐 图1: 平台分层架构图 (Layered Architecture)
用途: 说明系统能力边界、逻辑分层、职责划分 适用场景: 技术方案、投标、蓝图文档、白皮书
Draw.io 绘制指南
布局: 垂直分层,从上到下6层,使用泳道(Swimlane)表示每层
元素定义:
| 元素名称 | 形状类型 | 填充颜色 | 文本内容 | 宽度x高度 |
|---|---|---|---|---|
| ljwx-admin | 矩形(圆角) | #e1f5fe | ljwx-admin\nVue3 管理后台\nPort: 3333 | 120x60 |
| ljwx-phone | 矩形(圆角) | #e1f5fe | ljwx-phone\nFlutter 移动端\n健康数据上报 | 120x60 |
| ljwx-bigscreen | 矩形(圆角) | #e1f5fe | ljwx-bigscreen\nFlask 监控大屏\nPort: 5225 | 120x60 |
| API Gateway | 平行四边形 | #fff3e0 | /api/v2/*\n统一API入口\n版本化管理 | 120x60 |
| 认证授权 | 矩形(圆角) | #fff3e0 | 认证授权\nSa-Token JWT\n权限检查 | 120x60 |
| Controller层 | 矩形 | #f3e5f5 | Controller层\n请求路由\n参数验证 | 120x60 |
| Facade层 | 矩形 | #f3e5f5 | Facade层\n业务协调\n事务管理 | 120x60 |
| Health Module | 矩形 | #e8f5e9 | Health Module\n健康数据采集\n基线生成\n健康评分 | 140x80 |
| Device Module | 矩形 | #e8f5e9 | Device Module\n设备管理\n绑定审批\n状态监控 | 140x80 |
| Alert Module | 矩形 | #e8f5e9 | Alert Module\n规则引擎\n告警处理\n多渠道通知 | 140x80 |
| Message Module | 矩形 | #e8f5e9 | Message Module\n消息系统\n公告管理\n响应统计 | 140x80 |
| Statistics Module | 矩形 | #e8f5e9 | Statistics Module\n数据统计\n趋势分析\n仪表盘 | 140x80 |
| Multi-Tenant | 六边形 | #fce4ec | Multi-Tenant\n行级租户隔离\ncustomer_id过滤\nUserContext | 140x80 |
| RBAC | 六边形 | #fce4ec | RBAC\n角色权限\n菜单管理\n动态路由 | 140x80 |
| Cache | 六边形 | #fce4ec | Cache\n三层缓存\nCaffeine+Redis\n5min TTL | 140x80 |
| Observability | 六边形 | #fce4ec | Observability\nLogs+Traces+Metrics\nLoki+Tempo+Prometheus | 140x80 |
| MySQL | 圆柱体(数据库) | #fff9c4 | MySQL 8.0\n主数据库\n分区表 | 100x80 |
| Redis | 圆柱体(数据库) | #fff9c4 | Redis\n缓存+队列\n优先级队列 | 100x80 |
| Loki | 圆柱体(数据库) | #fff9c4 | Loki\n日志存储\nJSON格式 | 100x80 |
| Tempo | 圆柱体(数据库) | #fff9c4 | Tempo\n分布式追踪\nOpenTelemetry | 100x80 |
连接线规则:
- 层间连接: 实线箭头,黑色,线宽2px
- 同层连接: 虚线箭头,灰色,线宽1px
- 箭头方向: 从上到下表示调用流向
泳道(Swimlane)配置:
- 前端展示层: 水平泳道,#e1f5fe背景,透明度20%
- API网关层: 水平泳道,#fff3e0背景,透明度20%
- 应用服务层: 水平泳道,#f3e5f5背景,透明度20%
- 业务逻辑层: 水平泳道,#e8f5e9背景,透明度20%
- 基础设施层: 水平泳道,#fce4ec背景,透明度20%
- 数据持久层: 水平泳道,#fff9c4背景,透明度20%
绘制步骤:
- 创建6个水平泳道,从上到下排列
- 在每个泳道内放置对应的元素
- 使用连接工具绘制调用关系
- 添加层次标签和职责说明
graph TB
subgraph "前端展示层 (Presentation Layer)"
A1[ljwx-admin<br/>Vue3 管理后台<br/>Port: 3333]
A2[ljwx-phone<br/>Flutter 移动端<br/>健康数据上报]
A3[ljwx-bigscreen<br/>Flask 监控大屏<br/>Port: 5225]
end
subgraph "API网关层 (API Gateway Layer)"
B1[/api/v2/*<br/>统一API入口<br/>版本化管理]
B2[认证授权<br/>Sa-Token JWT<br/>权限检查]
end
subgraph "应用服务层 (Application Layer)"
C1[Controller层<br/>请求路由<br/>参数验证]
C2[Facade层<br/>业务协调<br/>事务管理]
end
subgraph "业务逻辑层 (Business Layer)"
D1[Health Module<br/>健康数据采集<br/>基线生成<br/>健康评分]
D2[Device Module<br/>设备管理<br/>绑定审批<br/>状态监控]
D3[Alert Module<br/>规则引擎<br/>告警处理<br/>多渠道通知]
D4[Message Module<br/>消息系统<br/>公告管理<br/>响应统计]
D5[Statistics Module<br/>数据统计<br/>趋势分析<br/>仪表盘]
end
subgraph "基础设施层 (Infrastructure Layer)"
E1[Multi-Tenant<br/>行级租户隔离<br/>customer_id过滤<br/>UserContext]
E2[RBAC<br/>角色权限<br/>菜单管理<br/>动态路由]
E3[Cache<br/>三层缓存<br/>Caffeine+Redis<br/>5min TTL]
E4[Observability<br/>Logs+Traces+Metrics<br/>Loki+Tempo+Prometheus]
end
subgraph "数据持久层 (Data Layer)"
F1[(MySQL 8.0<br/>主数据库<br/>分区表)]
F2[(Redis<br/>缓存+队列<br/>优先级队列)]
F3[(Loki<br/>日志存储<br/>JSON格式)]
F4[(Tempo<br/>分布式追踪<br/>OpenTelemetry)]
end
A1 --> B1
A2 --> B1
A3 --> B1
B1 --> B2
B2 --> C1
C1 --> C2
C2 --> D1
C2 --> D2
C2 --> D3
C2 --> D4
C2 --> D5
D1 --> E1
D2 --> E1
D3 --> E1
D4 --> E1
D5 --> E1
D1 --> E2
D2 --> E3
D3 --> E3
D4 --> E4
E1 --> F1
E3 --> F2
E4 --> F3
E4 --> F4
style A1 fill:#e1f5fe
style A2 fill:#e1f5fe
style A3 fill:#e1f5fe
style B1 fill:#fff3e0
style B2 fill:#fff3e0
style C1 fill:#f3e5f5
style C2 fill:#f3e5f5
style D1 fill:#e8f5e9
style D2 fill:#e8f5e9
style D3 fill:#e8f5e9
style D4 fill:#e8f5e9
style D5 fill:#e8f5e9
style E1 fill:#fce4ec
style E2 fill:#fce4ec
style E3 fill:#fce4ec
style E4 fill:#fce4ec
style F1 fill:#fff9c4
style F2 fill:#fff9c4
style F3 fill:#fff9c4
style F4 fill:#fff9c4
层次职责说明
| 层次 | 职责 | 关键技术 | 性能指标 |
|---|---|---|---|
| 前端展示层 | 用户交互、数据展示 | Vue3, Flutter, Flask | 渲染时间 <100ms |
| API网关层 | 统一入口、认证授权 | Spring HandlerInterceptor, Sa-Token | 响应时间 <10ms |
| 应用服务层 | 请求路由、业务协调 | Spring MVC, Facade模式 | 处理时间 <50ms |
| 业务逻辑层 | 核心业务、规则引擎 | Spring Service, 事件驱动 | 业务处理 <200ms |
| 基础设施层 | 租户隔离、权限控制、缓存 | ThreadLocal, RBAC, Redis | 缓存命中率 >95% |
| 数据持久层 | 数据存储、日志追踪 | MySQL分区表, Redis, Loki | 查询时间 <20ms |
🌊 图2: 健康数据流架构图 (Data Flow Architecture)
用途: 强调数据如何流动、谁产生、谁消费 适用场景: 数据治理、数据资产化、健康数据处理流程说明
Draw.io 绘制指南
布局: 水平流向,从左到右5个阶段,使用垂直泳道分组
元素定义:
| 元素名称 | 形状类型 | 填充颜色 | 文本内容 | 宽度x高度 |
|---|---|---|---|---|
| 智能设备 | 矩形(圆角) | #e3f2fd | 智能设备\nWatch/Band/Ring\n心率/血氧/体温 | 120x80 |
| ljwx-phone | 矩形(圆角) | #e3f2fd | ljwx-phone\n数据上报\nPOST /api/v2/health | 120x80 |
| Health API | 平行四边形 | #fff3e0 | Health API\n数据验证\n质量评分 | 120x80 |
| t_user_health_data | 圆柱体 | #fff3e0 | t_user_health_data\n按月分区表\n主键索引 | 140x80 |
| 基线生成 | 矩形 | #e8f5e9 | 基线生成\n定时任务 02:00\n统计近30天数据 | 140x80 |
| 健康评分 | 矩形 | #e8f5e9 | 健康评分\n定时任务 04:00\n多维度加权 | 140x80 |
| 趋势分析 | 矩形 | #e8f5e9 | 趋势分析\n实时计算\n时间序列 | 140x80 |
| 规则评估 | 矩形 | #e8f5e9 | 规则评估\n告警引擎\nSINGLE/COMPOSITE/COMPLEX | 140x80 |
| t_health_baseline | 圆柱体 | #f3e5f5 | t_health_baseline\n健康基线表\n用户/部门/组织级 | 140x80 |
| t_health_score | 圆柱体 | #f3e5f5 | t_health_score\n健康评分表\n综合评分+明细 | 140x80 |
| t_alert_info | 圆柱体 | #f3e5f5 | t_alert_info\n告警记录表\n触发值+处理状态 | 140x80 |
| Redis Cache | 圆柱体 | #f3e5f5 | Redis Cache\n最新数据\nTTL: 5min | 140x80 |
| Message Module | 椭圆 | #fce4ec | Message Module\n告警通知\nMESSAGE/PUSH/WECHAT | 140x80 |
| Statistics Module | 椭圆 | #fce4ec | Statistics Module\n数据聚合\n用户/组织/健康统计 | 140x80 |
| BigScreen Module | 椭圆 | #fce4ec | BigScreen Module\n实时展示\nECharts可视化 | 140x80 |
| ljwx-admin | 矩形(圆角) | #fff9c4 | ljwx-admin\n健康管理\n查看评分趋势 | 120x80 |
| ljwx-phone (消费) | 矩形(圆角) | #fff9c4 | ljwx-phone\n个人健康\n实时数据查看 | 120x80 |
| ljwx-bigscreen (消费) | 矩形(圆角) | #fff9c4 | ljwx-bigscreen\n监控大屏\n全局概览 | 120x80 |
| 管理员 | 人形图标 | #fff9c4 | 管理员\n告警处理\n确认/解决 | 100x80 |
连接线规则:
- 主流程(生产→消费): 实线粗箭头,蓝色,线宽3px,标注"蓝牙/WiFi"、"HTTP POST"等
- 查询流程: 虚线箭头,灰色,线宽2px,标注"查询近30天"、"实时查询"等
- 触发流程: 实线箭头,橙色,线宽2px,标注"触发评估"、"发送通知"等
- 缓存流程: 虚线箭头,绿色,线宽1px
泳道(Swimlane)配置:
- 数据生产: 垂直泳道,#e3f2fd背景,透明度15%
- 数据接入: 垂直泳道,#fff3e0背景,透明度15%
- 数据处理: 垂直泳道,#e8f5e9背景,透明度15%
- 数据存储: 垂直泳道,#f3e5f5背景,透明度15%
- 数据分发: 垂直泳道,#fce4ec背景,透明度15%
- 数据消费: 垂直泳道,#fff9c4背景,透明度15%
绘制步骤:
- 创建6个垂直泳道,从左到右排列
- 在"数据生产"泳道放置智能设备和ljwx-phone
- 在"数据接入"泳道放置Health API和数据表
- 在"数据处理"泳道放置4个处理模块
- 在"数据存储"泳道放置4个数据表
- 在"数据分发"泳道放置3个分发模块
- 在"数据消费"泳道放置4个消费端
- 使用不同颜色和线型的连接线表示不同类型的数据流
- 在关键路径上标注延迟时间(如"<1s"、"<20ms")
graph LR
subgraph "数据生产 (Data Production)"
P1[智能设备<br/>Watch/Band/Ring<br/>心率/血氧/体温]
P2[ljwx-phone<br/>数据上报<br/>POST /api/v2/health]
end
subgraph "数据接入 (Data Ingestion)"
I1[Health API<br/>数据验证<br/>质量评分]
I2[t_user_health_data<br/>按月分区表<br/>主键索引]
end
subgraph "数据处理 (Data Processing)"
PR1[基线生成<br/>定时任务 02:00<br/>统计近30天数据]
PR2[健康评分<br/>定时任务 04:00<br/>多维度加权]
PR3[趋势分析<br/>实时计算<br/>时间序列]
PR4[规则评估<br/>告警引擎<br/>SINGLE/COMPOSITE/COMPLEX]
end
subgraph "数据存储 (Data Storage)"
S1[(t_health_baseline<br/>健康基线表<br/>用户/部门/组织级)]
S2[(t_health_score<br/>健康评分表<br/>综合评分+明细)]
S3[(t_alert_info<br/>告警记录表<br/>触发值+处理状态)]
S4[(Redis Cache<br/>最新数据<br/>TTL: 5min)]
end
subgraph "数据分发 (Data Distribution)"
D1[Message Module<br/>告警通知<br/>MESSAGE/PUSH/WECHAT]
D2[Statistics Module<br/>数据聚合<br/>用户/组织/健康统计]
D3[BigScreen Module<br/>实时展示<br/>ECharts可视化]
end
subgraph "数据消费 (Data Consumption)"
C1[ljwx-admin<br/>健康管理<br/>查看评分趋势]
C2[ljwx-phone<br/>个人健康<br/>实时数据查看]
C3[ljwx-bigscreen<br/>监控大屏<br/>全局概览]
C4[管理员<br/>告警处理<br/>确认/解决]
end
P1 -->|蓝牙/WiFi| P2
P2 -->|HTTP POST| I1
I1 -->|INSERT| I2
I2 -.->|查询近30天| PR1
I2 -.->|查询历史数据| PR2
I2 -.->|实时查询| PR3
I2 -.->|触发评估| PR4
PR1 -->|生成基线| S1
PR2 -->|生成评分| S2
PR4 -->|触发告警| S3
I2 -->|缓存最新值| S4
S2 -.->|查询评分| D2
S3 -->|发送通知| D1
S1 -.->|聚合统计| D2
S4 -.->|实时数据| D3
D1 -->|推送消息| C2
D1 -->|推送消息| C4
D2 -->|统计数据| C1
D3 -->|WebSocket| C3
style P1 fill:#e3f2fd
style P2 fill:#e3f2fd
style I1 fill:#fff3e0
style I2 fill:#fff3e0
style PR1 fill:#e8f5e9
style PR2 fill:#e8f5e9
style PR3 fill:#e8f5e9
style PR4 fill:#e8f5e9
style S1 fill:#f3e5f5
style S2 fill:#f3e5f5
style S3 fill:#f3e5f5
style S4 fill:#f3e5f5
style D1 fill:#fce4ec
style D2 fill:#fce4ec
style D3 fill:#fce4ec
style C1 fill:#fff9c4
style C2 fill:#fff9c4
style C3 fill:#fff9c4
style C4 fill:#fff9c4
数据流关键路径
| 路径 | 延迟 | 吞吐量 | 数据保留 |
|---|---|---|---|
| 设备→API | <1s (蓝牙) / <500ms (WiFi) | 1000条/秒 | 实时传输 |
| API→数据库 | <20ms | 5000条/秒 | 永久存储(分区) |
| 基线生成 | 30s (批量) | 定时任务 | 保留1年 |
| 健康评分 | 15s (批量) | 定时任务 | 保留1年 |
| 告警触发 | <100ms (实时) | 并行评估 | 保留6个月 |
| 通知分发 | 1s (MESSAGE) / 5s (PUSH) | 异步并行 | 3个月 |
数据治理规则
- ✅ 质量控制: 数据范围验证、质量评分 (0-100)
- ✅ 去重机制: (user_id + data_type + timestamp) 唯一约束
- ✅ 分区策略: 按月分区
t_user_health_data_YYYYMM - ✅ 冷热分离: 最近3个月热数据,超过3个月归档
- ✅ 备份恢复: 每日增量备份,每周全量备份
🏗️ 图3: 组件部署架构图 (Deployment Architecture)
用途: 强调真实运行形态、服务拆分、中间件位置 适用场景: 运维文档、架构评审、客户技术答辩、故障诊断
Draw.io 绘制指南
布局: 垂直分层 + 水平分组,K8s集群使用大容器框,外部服务和用户在集群外
元素定义:
| 元素名称 | 形状类型 | 填充颜色 | 文本内容 | 宽度x高度 |
|---|---|---|---|---|
| 管理员 | 人形图标 | #e3f2fd | 管理员\nPC浏览器 | 80x100 |
| 移动端用户 | 人形图标 | #e3f2fd | 移动端用户\nljwx-phone App | 80x100 |
| 大屏展示 | 矩形(显示器图标) | #e3f2fd | 大屏展示\nTV/投影仪 | 80x100 |
| Traefik Ingress | 梯形 | #fff3e0 | Traefik Ingress\n*.ljwx.com\nTLS终结 | 200x60 |
| ljwx-boot Pod | 立方体(3D) | #e8f5e9 | ljwx-boot\nDeployment: 3 replicas\nJava 21 + OpenTelemetry\nPort: 9998 | 180x100 |
| ljwx-admin Pod | 立方体(3D) | #e8f5e9 | ljwx-admin\nDeployment: 2 replicas\nNginx + Vue3 SPA\nPort: 3333 | 180x100 |
| ljwx-bigscreen Pod | 立方体(3D) | #e8f5e9 | ljwx-bigscreen\nDeployment: 1 replica\nPython Flask + Celery\nPort: 5225 | 180x100 |
| MySQL | 圆柱体(数据库) | #f3e5f5 | MySQL 8.0\nStatefulSet\nPVC: 100Gi\nPort: 3306 | 140x100 |
| Redis | 圆柱体(数据库) | #f3e5f5 | Redis 7.0\nStatefulSet\nPVC: 20Gi\nPort: 6379 | 140x100 |
| Prometheus | 立方体(3D) | #fce4ec | Prometheus\nDeployment\nPort: 9090 | 140x80 |
| Loki | 立方体(3D) | #fce4ec | Loki\nDeployment\nPort: 3100 | 140x80 |
| Tempo | 立方体(3D) | #fce4ec | Tempo\nDeployment\nPort: 3200 | 140x80 |
| Grafana | 立方体(3D) | #fce4ec | Grafana\nDeployment\nPort: 3000 | 140x80 |
| PV: mysql-data | 文件夹图标 | #fff9c4 | PV: mysql-data\nNFS/Longhorn\n100Gi | 120x60 |
| PV: redis-data | 文件夹图标 | #fff9c4 | PV: redis-data\nNFS/Longhorn\n20Gi | 120x60 |
| PV: logs | 文件夹图标 | #fff9c4 | PV: logs\nNFS\n50Gi | 120x60 |
| 企业微信API | 云形状 | #ffebee | 企业微信API\nqyapi.weixin.qq.com\n告警通知 | 140x80 |
| 极光推送 | 云形状 | #ffebee | 极光推送\njpush.cn\n移动推送 | 140x80 |
| 阿里云短信 | 云形状 | #ffebee | 阿里云短信\ndysmsapi.aliyuncs.com\n紧急通知 | 140x80 |
| GitHub Actions | 矩形(圆角) | #e0f2f1 | GitHub Actions\nGitOps Deploy\nArgo CD | 140x80 |
| Harbor Registry | 矩形(圆角) | #e0f2f1 | Harbor Registry\nharbor.omniverseai.net\n镜像仓库 | 140x80 |
容器分组:
- K3s集群大容器: 包含所有Pods、中间件、PV,边框颜色#1976d2,线宽3px,填充透明
- namespace: ljwx-health 子容器: 包含Ingress和应用层Pods,边框#4caf50,线宽2px
- namespace: infra 子容器: 包含中间件层,边框#ff9800,线宽2px
- 持久化存储区域: 包含所有PV,边框#795548,线宽2px
连接线规则:
- HTTP/HTTPS连接: 实线箭头,蓝色,线宽2px,标注"HTTPS"、"HTTP"
- 数据库连接: 实线箭头,紫色,线宽2px,标注"JDBC"、"SQLAlchemy"、"Lettuce"
- 可观测性连接: 虚线箭头,橙色,线宽1px,标注"Metrics"、"Logs JSON"、"Traces OTLP"
- 存储挂载: 双向实线,棕色,线宽2px,标注"Mount"
- 外部API调用: 虚线箭头,红色,线宽1px
- CI/CD流程: 虚线箭头,绿色,线宽2px,标注"Push Image"、"Pull Image"
图例说明框 (放置在右上角):
图例:
━━━ HTTPS流量
━━━ 数据库连接
- - - 可观测性数据
- - - 外部API调用
━━━ CI/CD流程
⟷ 存储挂载
绘制步骤:
- 绘制最外层K3s集群大容器框
- 在集群外部绘制外部用户(左上)、外部服务(右侧)、CI/CD组件(底部)
- 在集群内创建3个子容器: ljwx-health namespace、infra namespace、持久化存储
- 在ljwx-health namespace内放置Ingress和3个应用Pod(水平排列)
- 在infra namespace内放置6个中间件组件(MySQL/Redis一行,Prometheus/Loki/Tempo/Grafana一行)
- 在持久化存储区域放置3个PV(水平排列)
- 绘制用户到Ingress的连接线(HTTPS)
- 绘制Ingress到各Pod的路由(标注路径如/api/v2/*)
- 绘制Pod到中间件的连接(标注协议如JDBC、Lettuce)
- 绘制中间件到PV的挂载关系
- 绘制Pod到外部服务的API调用(虚线)
- 绘制CI/CD流程: GitHub Actions → Harbor → Pods
- 在右上角添加图例说明框
高级样式:
- 为StatefulSet的Pod添加"3D效果"以区分Deployment
- 为PV添加"文件夹"图标
- 为外部服务添加"云"形状
- 使用渐变色填充K3s集群大容器背景(从#e3f2fd到#ffffff)
graph TB
subgraph "外部用户 (External Users)"
U1[管理员<br/>PC浏览器]
U2[移动端用户<br/>ljwx-phone App]
U3[大屏展示<br/>TV/投影仪]
end
subgraph "K3s集群 (namespace: ljwx-health)"
subgraph "Ingress层"
ING[Traefik Ingress<br/>*.ljwx.com<br/>TLS终结]
end
subgraph "应用层 Pods"
POD1[ljwx-boot<br/>Deployment: 3 replicas<br/>Java 21 + OpenTelemetry<br/>Port: 9998]
POD2[ljwx-admin<br/>Deployment: 2 replicas<br/>Nginx + Vue3 SPA<br/>Port: 3333]
POD3[ljwx-bigscreen<br/>Deployment: 1 replica<br/>Python Flask + Celery<br/>Port: 5225]
end
subgraph "中间件层 (namespace: infra)"
MW1[(MySQL 8.0<br/>StatefulSet<br/>PVC: 100Gi<br/>Port: 3306)]
MW2[(Redis 7.0<br/>StatefulSet<br/>PVC: 20Gi<br/>Port: 6379)]
MW3[Prometheus<br/>Deployment<br/>Port: 9090]
MW4[Loki<br/>Deployment<br/>Port: 3100]
MW5[Tempo<br/>Deployment<br/>Port: 3200]
MW6[Grafana<br/>Deployment<br/>Port: 3000]
end
subgraph "持久化存储"
PV1[PV: mysql-data<br/>NFS/Longhorn<br/>100Gi]
PV2[PV: redis-data<br/>NFS/Longhorn<br/>20Gi]
PV3[PV: logs<br/>NFS<br/>50Gi]
end
end
subgraph "外部服务 (External Services)"
EXT1[企业微信API<br/>qyapi.weixin.qq.com<br/>告警通知]
EXT2[极光推送<br/>jpush.cn<br/>移动推送]
EXT3[阿里云短信<br/>dysmsapi.aliyuncs.com<br/>紧急通知]
end
subgraph "CI/CD流水线"
GH[GitHub Actions<br/>GitOps Deploy<br/>Argo CD]
HARBOR[Harbor Registry<br/>harbor.omniverseai.net<br/>镜像仓库]
end
U1 -->|HTTPS| ING
U2 -->|HTTPS| ING
U3 -->|HTTP| ING
ING -->|/api/v2/*| POD1
ING -->|/*| POD2
ING -->|/bigscreen/*| POD3
POD1 -->|JDBC| MW1
POD1 -->|Lettuce| MW2
POD1 -->|Metrics| MW3
POD1 -->|Logs JSON| MW4
POD1 -->|Traces OTLP| MW5
POD3 -->|SQLAlchemy| MW1
POD3 -->|redis-py| MW2
MW1 -->|Mount| PV1
MW2 -->|Mount| PV2
MW4 -->|Mount| PV3
MW3 -->|Query| MW6
MW4 -->|Query| MW6
MW5 -->|Query| MW6
POD1 -.->|HTTPS| EXT1
POD1 -.->|HTTPS| EXT2
POD1 -.->|HTTPS| EXT3
GH -->|Push Image| HARBOR
HARBOR -->|Pull Image| POD1
HARBOR -->|Pull Image| POD2
HARBOR -->|Pull Image| POD3
style U1 fill:#e3f2fd
style U2 fill:#e3f2fd
style U3 fill:#e3f2fd
style ING fill:#fff3e0
style POD1 fill:#e8f5e9
style POD2 fill:#e8f5e9
style POD3 fill:#e8f5e9
style MW1 fill:#f3e5f5
style MW2 fill:#f3e5f5
style MW3 fill:#fce4ec
style MW4 fill:#fce4ec
style MW5 fill:#fce4ec
style MW6 fill:#fce4ec
style PV1 fill:#fff9c4
style PV2 fill:#fff9c4
style PV3 fill:#fff9c4
style EXT1 fill:#ffebee
style EXT2 fill:#ffebee
style EXT3 fill:#ffebee
style GH fill:#e0f2f1
style HARBOR fill:#e0f2f1
部署规格说明
应用层资源配置
| 组件 | CPU | 内存 | 副本数 | HPA | 健康检查 |
|---|---|---|---|---|---|
| ljwx-boot | 2 core | 4Gi | 3 | 3-10 | /actuator/health |
| ljwx-admin | 0.5 core | 512Mi | 2 | 2-5 | /index.html |
| ljwx-bigscreen | 1 core | 2Gi | 1 | 1-3 | /health |
中间件资源配置
| 组件 | CPU | 内存 | 存储 | 备份策略 |
|---|---|---|---|---|
| MySQL | 4 core | 8Gi | 100Gi SSD | 每日增量 + 每周全量 |
| Redis | 2 core | 4Gi | 20Gi SSD | AOF + RDB |
| Prometheus | 2 core | 8Gi | 50Gi | 15天保留 |
| Loki | 2 core | 4Gi | 50Gi | 30天保留 |
| Tempo | 2 core | 4Gi | 30Gi | 7天保留 |
| Grafana | 1 core | 2Gi | 10Gi | 配置备份 |
网络与安全
- Ingress TLS: Let's Encrypt自动签发 + 自动续期
- 网络策略: NetworkPolicy隔离应用层和中间件层
- Secret管理: Sealed Secrets + External Secrets Operator
- 镜像安全: Harbor漏洞扫描 + 镜像签名验证
可观测性
- Metrics: Prometheus抓取
/actuator/prometheus(15s间隔) - Logs: Logback JSON → Loki (通过Promtail)
- Traces: OpenTelemetry Agent → Tempo (OTLP协议)
- Dashboard: Grafana预配置仪表盘 (CPU/内存/QPS/延迟/错误率)
灾难恢复
- RTO (恢复时间目标): < 1小时
- RPO (恢复点目标): < 15分钟
- 备份存储: S3兼容对象存储 (MinIO/Ceph)
- 演练频率: 每季度一次
📊 架构对比分析
三种架构图的区别
| 维度 | 平台分层架构图 | 数据流架构图 | 部署架构图 |
|---|---|---|---|
| 关注点 | 逻辑分层、职责划分 | 数据流动、处理链路 | 物理部署、资源配置 |
| 受众 | 架构师、产品经理 | 数据工程师、业务分析师 | 运维工程师、DevOps |
| 详细程度 | 中等 (概念层) | 高 (数据链路) | 极高 (配置细节) |
| 时间维度 | 静态 | 动态 (数据流转) | 静态 + 动态 (部署状态) |
| 变化频率 | 低 (架构稳定) | 中 (业务迭代) | 高 (扩缩容、升级) |
架构特点总结
平台分层架构图特点
- ✅ 清晰的6层分层结构
- ✅ 职责单一,高内聚低耦合
- ✅ 符合DDD领域驱动设计
- ✅ 支持水平扩展
数据流架构图特点
- ✅ 完整的数据生命周期
- ✅ 5个阶段: 生产→接入→处理→存储→消费
- ✅ 数据治理规则明确
- ✅ 冷热数据分离
部署架构图特点
- ✅ 云原生架构 (K8s + GitOps)
- ✅ 完整的可观测性 (Logs + Traces + Metrics)
- ✅ 高可用设计 (多副本 + HPA)
- ✅ 安全加固 (TLS + NetworkPolicy + Secret管理)
🎯 架构决策记录 (ADR)
ADR-001: 为什么选择行级多租户而非数据库级隔离?
决策: 采用行级租户隔离 (customer_id字段)
理由:
- ✅ 成本: 单数据库,无需为每个租户创建独立库
- ✅ 维护: 统一Schema升级,降低运维复杂度
- ✅ 性能: 索引优化后查询性能 <20ms
- ✅ 安全: 4层防护 (前端+网关+上下文+数据库) 确保隔离
风险缓解:
- 强制 WHERE customer_id = ? 查询
- MyBatis-Plus拦截器二次验证
- 定期审计日志检查跨租户访问
ADR-002: 为什么选择Facade模式而非直接暴露Service?
决策: Controller → Facade → Service 三层架构
理由:
- ✅ 事务边界清晰: Facade层统一管理事务
- ✅ 解耦: Controller不直接依赖多个Service
- ✅ 复用: 多个Controller可共享Facade逻辑
- ✅ 演进: V2 Facade可与V1并存,渐进式重构
ADR-003: 为什么健康数据按月分区而非按年?
决策: 按月分区 t_user_health_data_YYYYMM
理由:
- ✅ 查询性能: 最近3个月查询只扫描3个分区 (200ms → 20ms)
- ✅ 维护成本: 按月归档,单分区不超过500万行
- ✅ 灵活性: 可按需删除超过6个月的分区
- ❌ 不选按年: 单分区过大 (6000万行+),查询慢
ADR-004: 为什么选择OpenTelemetry而非自定义日志?
决策: 全面集成OpenTelemetry (Logs + Traces + Metrics)
理由:
- ✅ 标准化: 行业标准,生态完善
- ✅ 关联性: TraceId关联Logs/Traces/Metrics,快速定位问题
- ✅ 可视化: Grafana原生支持,开箱即用
- ✅ 厂商中立: 避免被单一厂商锁定
📖 推荐阅读顺序
对于架构师
- 先读 平台分层架构图 - 理解系统全局结构
- 再读 部署架构图 - 了解实际运行形态
- 最后读 数据流架构图 - 深入核心业务逻辑
对于开发工程师
- 先读 数据流架构图 - 理解业务数据流转
- 再读 平台分层架构图 - 定位自己负责的层次
- 最后读 部署架构图 - 了解部署和调试方法
对于运维工程师
- 先读 部署架构图 - 掌握运维关键信息
- 再读 数据流架构图 - 理解数据链路(排查问题)
- 最后读 平台分层架构图 - 了解系统整体设计
🎨 Draw.io 文件 - 一键导入
✨ 已为您准备好3个可直接导入的draw.io文件!
📥 快速导入步骤
- 打开 Draw.io (https://app.diagrams.net/)
- 点击 File → Open from → Device
- 选择以下任一文件:
docs/02-architecture/diagrams/layered-architecture.drawio- 平台分层架构图docs/02-architecture/diagrams/data-flow-architecture.drawio- 数据流架构图docs/02-architecture/diagrams/deployment-architecture.drawio- 部署架构图
- 立即开始编辑和导出
所有元素、颜色、连接线已完全配置,可直接使用!
🎨 Draw.io 使用说明
方法1: 直接导入draw.io文件 (最推荐⭐)
使用已生成的 .drawio 文件(推荐):
- 打开 Draw.io (https://app.diagrams.net/)
- File → Open from → Device
- 选择
docs/02-architecture/diagrams/目录下的任一文件 - 文件已完全配置,包含所有元素、样式和连接线
优点:
- ✅ 零配置,开箱即用
- ✅ 所有颜色、形状、连接线已设置
- ✅ 可直接编辑、调整和导出
- ✅ 支持版本控制(XML格式)
方法2: 导入Mermaid语法
Draw.io 也支持从Mermaid代码导入:
- 打开 Draw.io (https://app.diagrams.net/)
- 点击菜单 Arrange → Insert → Advanced → Mermaid
- 复制本文档中的任意 Mermaid 代码块
- 粘贴到对话框中
- 点击 Insert 即可自动转换为可编辑图形
优点:
- ✅ 快速原型,适合草图
- ✅ 自动布局
局限性:
- ⚠️ 颜色和样式需要手动调整
- ⚠️ 复杂布局可能需要优化
方法3: 按照绘制指南手动绘制
如果需要从零开始绘制或需要更精细的控制,请使用本文档中每个图的"Draw.io 绘制指南"部分:
- 打开 Draw.io
- 根据"元素定义"表格创建各个形状
- 按照"泳道配置"创建分组容器
- 根据"连接线规则"绘制连接
- 参考"绘制步骤"完成整体布局
Draw.io 形状对照表
| 本文档术语 | Draw.io 形状位置 | 快捷操作 |
|---|---|---|
| 矩形(圆角) | General → Rectangle → 设置圆角半径10 | 拖入后右键→Edit Style→rounded=1 |
| 平行四边形 | General → Parallelogram | 搜索"parallelogram" |
| 六边形 | General → Hexagon | 搜索"hexagon" |
| 圆柱体(数据库) | Entity Relation → Cylinder 或 Database | 搜索"cylinder"或"database" |
| 立方体(3D) | General → Cube | 搜索"cube" |
| 梯形 | General → Trapezoid | 搜索"trapezoid" |
| 椭圆 | General → Ellipse | 快捷键: E |
| 人形图标 | Clipart → People | 搜索"person" |
| 云形状 | General → Cloud | 搜索"cloud" |
| 文件夹图标 | Clipart → Folders | 搜索"folder" |
| 泳道(Swimlane) | Advanced → Horizontal/Vertical Pool | 搜索"pool"或"swimlane" |
颜色快速填充
在Draw.io中选中形状后,按照以下RGB值设置颜色:
#e1f5fe → RGB(225, 245, 254) 浅蓝色 - 前端层
#fff3e0 → RGB(255, 243, 224) 浅橙色 - API层
#f3e5f5 → RGB(243, 229, 245) 浅紫色 - 应用层
#e8f5e9 → RGB(232, 245, 233) 浅绿色 - 业务层
#fce4ec → RGB(252, 228, 236) 浅粉色 - 基础设施层
#fff9c4 → RGB(255, 249, 196) 浅黄色 - 数据层
#ffebee → RGB(255, 235, 238) 浅红色 - 外部服务
#e0f2f1 → RGB(224, 242, 241) 浅青色 - CI/CD
快捷操作: 选中多个形状 → 右键 → Edit Style → 添加 fillColor=#颜色值
导出和分享
导出为图片:
- PNG: File → Export as → PNG (推荐分辨率300dpi)
- SVG: File → Export as → SVG (矢量图,适合印刷)
- PDF: File → Export as → PDF (适合文档嵌入)
分享可编辑版本:
- 保存为
.drawio文件并提交到代码库 - 使用 Draw.io 的云端保存功能 (Google Drive / OneDrive)
- 导出为
.xml格式 (Draw.io 原生格式)
版本控制最佳实践
如果将 .drawio 文件提交到 Git:
- 推荐目录:
docs/02-architecture/diagrams/ - 文件命名:
layered-architecture.drawio- 平台分层架构图data-flow-architecture.drawio- 数据流架构图deployment-architecture.drawio- 部署架构图
- 同步导出PNG: 每次修改
.drawio后同步导出PNG到同目录 - 提交说明: 使用清晰的commit message,如
docs: update deployment architecture diagram - add Redis Sentinel
协作建议
团队协作时:
- 📌 使用统一的颜色方案 (参考本文档)
- 📌 保持一致的形状选择 (如数据库都用圆柱体)
- 📌 统一字体和字号 (推荐: 微软雅黑 12pt)
- 📌 定期导出PNG/SVG供非技术人员查看
- 📌 在架构图顶部添加版本号和更新日期
文档版本: V1.1 (添加Draw.io兼容模式) 最后更新: 2026-01-25 维护者: 架构组 下次评审: 2026-04-25 (每季度评审一次)