Files
ljwx-health/docs/02-architecture/system-architecture-diagrams.md
brunoandClaude Sonnet 4.5 b53afed57f docs: 添加系统架构图(三大视角)及Draw.io源文件
新增内容:
- 系统架构图文档(system-architecture-diagrams.md,含Mermaid图)
- 3个Draw.io可直接导入文件(分层/数据流/部署架构)
- 详细的绘制指南、元素定义表格、颜色方案
- 架构决策记录(ADR)和推荐阅读顺序

基于8个核心模块分析生成,遵循"三大母版"原则:
1. 平台分层架构图 - 逻辑分层和职责划分
2. 健康数据流架构图 - 数据生命周期和流转
3. 组件部署架构图 - K8s集群部署和资源配置

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-01-25 18:46:27 +08:00

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%

绘制步骤:

  1. 创建6个水平泳道,从上到下排列
  2. 在每个泳道内放置对应的元素
  3. 使用连接工具绘制调用关系
  4. 添加层次标签和职责说明
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%

绘制步骤:

  1. 创建6个垂直泳道,从左到右排列
  2. 在"数据生产"泳道放置智能设备和ljwx-phone
  3. 在"数据接入"泳道放置Health API和数据表
  4. 在"数据处理"泳道放置4个处理模块
  5. 在"数据存储"泳道放置4个数据表
  6. 在"数据分发"泳道放置3个分发模块
  7. 在"数据消费"泳道放置4个消费端
  8. 使用不同颜色和线型的连接线表示不同类型的数据流
  9. 在关键路径上标注延迟时间(如"<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流程
⟷    存储挂载

绘制步骤:

  1. 绘制最外层K3s集群大容器框
  2. 在集群外部绘制外部用户(左上)、外部服务(右侧)、CI/CD组件(底部)
  3. 在集群内创建3个子容器: ljwx-health namespace、infra namespace、持久化存储
  4. 在ljwx-health namespace内放置Ingress和3个应用Pod(水平排列)
  5. 在infra namespace内放置6个中间件组件(MySQL/Redis一行,Prometheus/Loki/Tempo/Grafana一行)
  6. 在持久化存储区域放置3个PV(水平排列)
  7. 绘制用户到Ingress的连接线(HTTPS)
  8. 绘制Ingress到各Pod的路由(标注路径如/api/v2/*)
  9. 绘制Pod到中间件的连接(标注协议如JDBC、Lettuce)
  10. 绘制中间件到PV的挂载关系
  11. 绘制Pod到外部服务的API调用(虚线)
  12. 绘制CI/CD流程: GitHub Actions → Harbor → Pods
  13. 在右上角添加图例说明框

高级样式:

  • 为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原生支持,开箱即用
  • ✅ 厂商中立: 避免被单一厂商锁定

📖 推荐阅读顺序

对于架构师

  1. 先读 平台分层架构图 - 理解系统全局结构
  2. 再读 部署架构图 - 了解实际运行形态
  3. 最后读 数据流架构图 - 深入核心业务逻辑

对于开发工程师

  1. 先读 数据流架构图 - 理解业务数据流转
  2. 再读 平台分层架构图 - 定位自己负责的层次
  3. 最后读 部署架构图 - 了解部署和调试方法

对于运维工程师

  1. 先读 部署架构图 - 掌握运维关键信息
  2. 再读 数据流架构图 - 理解数据链路(排查问题)
  3. 最后读 平台分层架构图 - 了解系统整体设计

🎨 Draw.io 文件 - 一键导入

✨ 已为您准备好3个可直接导入的draw.io文件!

📥 快速导入步骤

  1. 打开 Draw.io (https://app.diagrams.net/)
  2. 点击 File → Open from → Device
  3. 选择以下任一文件:
    • docs/02-architecture/diagrams/layered-architecture.drawio - 平台分层架构图
    • docs/02-architecture/diagrams/data-flow-architecture.drawio - 数据流架构图
    • docs/02-architecture/diagrams/deployment-architecture.drawio - 部署架构图
  4. 立即开始编辑和导出

所有元素、颜色、连接线已完全配置,可直接使用!


🎨 Draw.io 使用说明

方法1: 直接导入draw.io文件 (最推荐⭐)

使用已生成的 .drawio 文件(推荐):

  1. 打开 Draw.io (https://app.diagrams.net/)
  2. File → Open from → Device
  3. 选择 docs/02-architecture/diagrams/ 目录下的任一文件
  4. 文件已完全配置,包含所有元素、样式和连接线

优点:

  • ✅ 零配置,开箱即用
  • ✅ 所有颜色、形状、连接线已设置
  • ✅ 可直接编辑、调整和导出
  • ✅ 支持版本控制(XML格式)

方法2: 导入Mermaid语法

Draw.io 也支持从Mermaid代码导入:

  1. 打开 Draw.io (https://app.diagrams.net/)
  2. 点击菜单 Arrange → Insert → Advanced → Mermaid
  3. 复制本文档中的任意 Mermaid 代码块
  4. 粘贴到对话框中
  5. 点击 Insert 即可自动转换为可编辑图形

优点:

  • ✅ 快速原型,适合草图
  • ✅ 自动布局

局限性:

  • ⚠️ 颜色和样式需要手动调整
  • ⚠️ 复杂布局可能需要优化

方法3: 按照绘制指南手动绘制

如果需要从零开始绘制或需要更精细的控制,请使用本文档中每个图的"Draw.io 绘制指南"部分:

  1. 打开 Draw.io
  2. 根据"元素定义"表格创建各个形状
  3. 按照"泳道配置"创建分组容器
  4. 根据"连接线规则"绘制连接
  5. 参考"绘制步骤"完成整体布局

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:

  1. 推荐目录: docs/02-architecture/diagrams/
  2. 文件命名:
    • layered-architecture.drawio - 平台分层架构图
    • data-flow-architecture.drawio - 数据流架构图
    • deployment-architecture.drawio - 部署架构图
  3. 同步导出PNG: 每次修改 .drawio 后同步导出PNG到同目录
  4. 提交说明: 使用清晰的commit message,如 docs: update deployment architecture diagram - add Redis Sentinel

协作建议

团队协作时:

  • 📌 使用统一的颜色方案 (参考本文档)
  • 📌 保持一致的形状选择 (如数据库都用圆柱体)
  • 📌 统一字体和字号 (推荐: 微软雅黑 12pt)
  • 📌 定期导出PNG/SVG供非技术人员查看
  • 📌 在架构图顶部添加版本号和更新日期

文档版本: V1.1 (添加Draw.io兼容模式) 最后更新: 2026-01-25 维护者: 架构组 下次评审: 2026-04-25 (每季度评审一次)