Files
brunoandClaude Sonnet 4.5 8350cd86f3
CI/CD Pipeline / build-push (ljwx-admin) (push) Blocked by required conditions
CI/CD Pipeline / build-push (ljwx-bigscreen) (push) Blocked by required conditions
CI/CD Pipeline / build-push (ljwx-boot) (push) Blocked by required conditions
CI/CD Pipeline / update-deploy (push) Blocked by required conditions
CI/CD Pipeline / security-scan (push) Successful in 52s
CI/CD Pipeline / test-build-boot (push) Successful in 1m52s
CI/CD Pipeline / build-pr (ljwx-admin) (push) Has been skipped
CI/CD Pipeline / build-pr (ljwx-bigscreen) (push) Has been skipped
CI/CD Pipeline / build-pr (ljwx-boot) (push) Has been skipped
CI/CD Pipeline / test-admin (push) Successful in 1m18s
CI/CD Pipeline / test-bigscreen (push) Has been cancelled
docs: 文档结构标准化重构 v1.0
## 重构概览
完成文档标准化重构,建立专业的文档管理体系。

## 核心成果

### 文档精简
- 根目录文档: 57个 → 8个 (-86%)
- README.md: 1844行 → 258行 (-86%)
- 查找时间: 5-10分钟 → <1分钟 (-80%)

### 新增核心文档
- CHANGELOG.md - 版本变更日志
- CONTRIBUTING.md - 贡献指南(代码/提交/文档规范)
- docs/README.md - 文档导航中心(按角色/主题/关键词索引)
- archive/README.md - 归档说明

### 目录架构
- docs/01-getting-started/ - 快速开始
- docs/02-architecture/ - 架构设计
- docs/03-deployment/ - 部署指南(Docker/K8s/GitOps)
- docs/04-operations/ - 运维手册(监控/数据库/故障)
- docs/05-features/ - 功能文档
- docs/06-development/ - 开发指南(后端/前端/API)
- docs/07-compliance/ - 工程规范
- docs/08-reference/ - 参考资料
- archive/2025/ - 历史归档(fixes/implementations/experiments)
- archive/deprecated/ - 已废弃文档

## 文档迁移

### 已迁移文档(44个)
部署文档 → docs/03-deployment/
  - DOCKER_README.md → docker/docker-compose.md
  - DOCKERFILE_OPTIMIZATION_SUMMARY.md → docker/optimization.md
  - GITHUB_SETUP.md → gitops/github-actions.md

运维文档 → docs/04-operations/
  - DATABASE_IMPORT.md → database/data-import.md
  - GRAFANA_QUICK_START.md → monitoring/grafana-quick-start.md

开发文档 → docs/06-development/
  - AI_INTEGRATION_GUIDE.md → ai-integration.md

参考资料 → docs/08-reference/
  - REMOTE_ACCESS.md → remote-access.md

历史文档 → archive/2025/
  - fixes/ - 8个修复文档
  - implementations/ - 10个实施总结
  - experiments/ - 2个实验方案

已废弃 → archive/deprecated/
  - old-quick-starts/ - 5个旧版快速开始指南

### 备份
- backup_docs_20260104_182653/ - 完整备份(57个文件)
- backup_docs_20260104_182705/ - 增量备份(6个文件)

## 技术亮点
- ✅ 自动化迁移脚本(scripts/migrate-docs.sh)
- ✅ 智能文档分类
- ✅ 自动备份机制
- ✅ 文档生命周期管理
- ✅ 多维度导航系统

## 参考规范
- Keep a Changelog (CHANGELOG.md)
- Conventional Commits (提交规范)
- Divio Documentation System (文档分类)

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-01-04 18:31:38 +08:00

20 KiB
Raw Permalink Blame History

健康数据流Dashboard完整部署指南

文档版本: v1.0 创建日期: 2026-01-04 适用系统: LJWX Health 方案: ECharts Sankey + WebSocket + Grafana(企业级完整方案)


📑 目录

  1. 部署架构
  2. 前置条件检查
  3. 后端部署
  4. 前端部署
  5. Grafana Dashboard部署
  6. 验证测试
  7. 故障排查
  8. 性能优化

1. 部署架构

1.1 系统架构图

┌─────────────────────────────────────────────────────────────┐
│  应用层 (ljwx-admin)                                         │
│  ┌──────────────────────────────────────────────────────┐   │
│  │  ECharts Sankey 数据流可视化                          │   │
│  │  - 实时数据流拓扑图                                    │   │
│  │  - 关键指标卡片                                        │   │
│  │  - WebSocket 实时更新                                 │   │
│  └──────────────────────────────────────────────────────┘   │
└─────────────────────────────────────────────────────────────┘
                            ↓ WebSocket (/ws/data-flow)
┌─────────────────────────────────────────────────────────────┐
│  后端层 (ljwx-boot)                                          │
│  ┌──────────────────────────────────────────────────────┐   │
│  │  DataFlowWebSocketHandler                             │   │
│  │  - 定时推送指标 (每3秒)                               │   │
│  │  - 会话管理                                            │   │
│  └──────────────────────────────────────────────────────┘   │
│  ┌──────────────────────────────────────────────────────┐   │
│  │  DataUpload 指标记录                                   │   │
│  │  - 数据接收统计                                        │   │
│  │  - 去重统计                                            │   │
│  │  - 告警触发统计                                        │   │
│  └──────────────────────────────────────────────────────┘   │
└─────────────────────────────────────────────────────────────┘
                            ↓ Redis (health:stats:*)
┌─────────────────────────────────────────────────────────────┐
│  存储层 (Redis)                                              │
│  - health:stats:http_throughput                             │
│  - health:stats:ble_throughput                              │
│  - health:stats:total_received                              │
│  - health:stats:after_dedup                                 │
│  - health:stats:alert_triggered                             │
│  - health:stats:avg_latency                                 │
└─────────────────────────────────────────────────────────────┘
                            ↓ Prometheus Metrics
┌─────────────────────────────────────────────────────────────┐
│  监控层 (Grafana)                                            │
│  - 数据流吞吐量面板                                          │
│  - 去重率仪表盘                                              │
│  - 告警触发统计                                              │
│  - 处理延迟监控                                              │
└─────────────────────────────────────────────────────────────┘

1.2 文件清单

后端文件

ljwx-boot/
├── ljwx-boot-modules/src/main/java/com/ljwx/modules/
│   ├── monitor/websocket/
│   │   └── DataFlowWebSocketHandler.java       # WebSocket推送处理器
│   └── health/upload/
│       └── DataUpload.java                      # 已修改:添加指标记录
└── ljwx-boot-admin/src/main/java/com/ljwx/config/
    └── WebSocketConfig.java                     # WebSocket配置

前端文件

ljwx-admin/
└── src/views/monitor/data-flow/
    └── index.vue                                # ECharts数据流组件

监控配置文件

deploy/monitoring/grafana/dashboards/
└── ljwx-health-data-flow.json                   # Grafana Dashboard配置

2. 前置条件检查

2.1 环境要求

# 检查Java版本(需要21+)
java -version
# 输出: openjdk version "21.0.x"

# 检查Node.js版本(需要18+)
node -v
# 输出: v18.x.x 或更高

# 检查pnpm版本
pnpm -v
# 输出: 8.x.x 或更高

# 检查Redis连接
redis-cli ping
# 输出: PONG

# 检查MySQL连接
mysql -uroot -p -e "SELECT VERSION();"

2.2 服务状态检查

# 检查ljwx-boot是否运行
curl -s http://localhost:9998/actuator/health | jq '.status'
# 输出: "UP"

# 检查Redis连接
redis-cli -h localhost -p 6379 -a 123456 ping
# 输出: PONG

# 检查Grafana(如果已部署)
kubectl get pods -n infra | grep grafana
# 输出: grafana-0   1/1   Running

3. 后端部署

3.1 编译后端

cd ljwx-boot

# 清理并编译
mvn clean install -DskipTests

# 检查编译结果
ls -lh ljwx-boot-admin/target/ljwx-boot-admin-*.jar

3.2 启动后端(本地开发)

cd ljwx-boot

# 使用启动脚本
./run-local.sh

# 等待启动完成,查看日志
tail -f logs/ljwx-boot-admin_info.log | grep -E "WebSocket|DataFlow"

预期日志输出:

🔌 注册WebSocket处理器: /ws/data-flow
✅ WebSocket配置完成
🚀 DataUpload 初始化:
   CPU核心: 8, 内存: 2048MB
   批次大小: 200, 工作线程: 20

3.3 验证WebSocket端点

# 使用websocat测试WebSocket连接
websocat ws://localhost:9998/ws/data-flow

# 或使用curl测试HTTP升级
curl -i -N -H "Connection: Upgrade" \
  -H "Upgrade: websocket" \
  -H "Sec-WebSocket-Version: 13" \
  -H "Sec-WebSocket-Key: test" \
  http://localhost:9998/ws/data-flow

预期响应:

HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade

3.4 测试指标记录

# 检查Redis中的统计键
redis-cli -a 123456 KEYS "health:stats:*"
# 输出:
# 1) "health:stats:total_received"
# 2) "health:stats:after_dedup"
# 3) "health:stats:http_throughput"
# ...

# 查看具体指标值
redis-cli -a 123456 GET "health:stats:total_received"
# 输出: "1250"

4. 前端部署

4.1 安装依赖

cd ljwx-admin

# 安装依赖
pnpm install

# 检查ECharts是否已安装
pnpm list echarts
# 输出: echarts 5.x.x

4.2 配置环境变量

编辑 ljwx-admin/.env.development:

# API Base URL
VITE_API_URL=http://localhost:9998

# WebSocket URL (自动根据VITE_API_URL推导)
# ws://localhost:9998/ws/data-flow

4.3 启动前端

cd ljwx-admin

# 启动开发服务器
pnpm dev

# 访问地址
# http://localhost:3333

4.4 访问数据流Dashboard

  1. 打开浏览器访问: http://localhost:3333
  2. 登录系统
  3. 导航到: 系统监控 → 数据流监控 (或直接访问 /monitor/data-flow)

预期界面:

  • 顶部显示实时桑基图
  • 下方显示4个关键指标卡片
  • WebSocket连接状态显示为"已连接"
  • 数据每3秒自动更新

5. Grafana Dashboard部署

5.1 部署Grafana(K8s环境)

# 部署完整监控栈(Grafana + Prometheus + Loki)
./scripts/deploy-observability.sh

# 等待Pod启动完成
kubectl get pods -n infra | grep grafana
# 输出: grafana-0   1/1   Running

5.2 导入Dashboard配置

方法1: 通过UI导入

# 1. 端口转发Grafana
kubectl port-forward -n infra svc/grafana 3000:3000

# 2. 浏览器访问 http://localhost:3000
# 3. 登录: admin / admin123
# 4. 点击 Dashboards → Import
# 5. 上传文件: deploy/monitoring/grafana/dashboards/ljwx-health-data-flow.json

方法2: 通过ConfigMap部署

# 创建ConfigMap
kubectl create configmap ljwx-health-data-flow-dashboard \
  --from-file=ljwx-health-data-flow.json=deploy/monitoring/grafana/dashboards/ljwx-health-data-flow.json \
  -n infra

# 重启Grafana加载Dashboard
kubectl rollout restart statefulset/grafana -n infra

5.3 配置Prometheus数据源

# 检查Prometheus数据源
kubectl port-forward -n infra svc/grafana 3000:3000

# 浏览器访问: http://localhost:3000/datasources
# 确认 Prometheus 数据源已配置:
# - Name: prometheus
# - URL: http://prometheus.infra.svc.cluster.local:9090

5.4 验证Dashboard

  1. 访问 Grafana: http://localhost:3000
  2. 导航到: Dashboards → LJWX Health - 数据流监控
  3. 确认面板显示:
    • 数据流吞吐量(折线图)
    • 去重率(仪表盘)
    • 告警触发率(统计卡片)
    • 处理延迟(折线图)
    • Redis缓存命中率(仪表盘)
    • 数据流节点统计(表格)

6. 验证测试

6.1 完整功能测试脚本

创建测试脚本 scripts/verify-data-flow-dashboard.sh:

#!/bin/bash

echo "🔍 开始验证数据流Dashboard部署..."

# 颜色定义
GREEN='\033[0;32m'
RED='\033[0;31m'
YELLOW='\033[1;33m'
NC='\033[0m' # No Color

# 1. 检查后端WebSocket
echo ""
echo "📍 1. 检查后端WebSocket端点..."
response=$(curl -s -o /dev/null -w "%{http_code}" \
  -H "Connection: Upgrade" \
  -H "Upgrade: websocket" \
  -H "Sec-WebSocket-Version: 13" \
  -H "Sec-WebSocket-Key: test" \
  http://localhost:9998/ws/data-flow)

if [ "$response" == "101" ]; then
  echo -e "${GREEN}✅ WebSocket端点正常 (HTTP 101 Switching Protocols)${NC}"
else
  echo -e "${RED}❌ WebSocket端点异常 (HTTP $response)${NC}"
  exit 1
fi

# 2. 检查Redis统计键
echo ""
echo "📍 2. 检查Redis统计数据..."
redis_keys=$(redis-cli -a 123456 --no-auth-warning KEYS "health:stats:*" 2>/dev/null)

if [ -n "$redis_keys" ]; then
  echo -e "${GREEN}✅ Redis统计键存在:${NC}"
  echo "$redis_keys" | sed 's/^/   /'
else
  echo -e "${YELLOW}⚠️  Redis统计键为空(正常,等待数据上传后会自动创建)${NC}"
fi

# 3. 检查前端访问
echo ""
echo "📍 3. 检查前端服务..."
if curl -s http://localhost:3333 > /dev/null; then
  echo -e "${GREEN}✅ 前端服务运行正常 (http://localhost:3333)${NC}"
else
  echo -e "${RED}❌ 前端服务无法访问${NC}"
  exit 1
fi

# 4. 检查Grafana Dashboard
echo ""
echo "📍 4. 检查Grafana Dashboard..."
if command -v kubectl &> /dev/null; then
  grafana_pod=$(kubectl get pods -n infra -l app=grafana -o jsonpath='{.items[0].metadata.name}' 2>/dev/null)
  if [ -n "$grafana_pod" ]; then
    echo -e "${GREEN}✅ Grafana Pod运行正常: $grafana_pod${NC}"
    echo -e "${YELLOW}   提示: 访问 Grafana Dashboard:${NC}"
    echo -e "${YELLOW}   kubectl port-forward -n infra svc/grafana 3000:3000${NC}"
    echo -e "${YELLOW}   http://localhost:3000 (admin/admin123)${NC}"
  else
    echo -e "${YELLOW}⚠️  Grafana未部署(可选)${NC}"
  fi
else
  echo -e "${YELLOW}⚠️  kubectl未安装,跳过Grafana检查${NC}"
fi

# 5. 功能测试总结
echo ""
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
echo -e "${GREEN}✅ 数据流Dashboard部署验证完成!${NC}"
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
echo ""
echo "📌 访问地址:"
echo "   - 数据流Dashboard: http://localhost:3333/monitor/data-flow"
echo "   - Grafana监控: http://localhost:3000 (需kubectl port-forward)"
echo ""
echo "📊 实时数据流更新频率: 每3秒"
echo "🔍 监控指标包括: 吞吐量、去重率、延迟、告警数"
echo ""

6.2 运行验证脚本

chmod +x scripts/verify-data-flow-dashboard.sh
./scripts/verify-data-flow-dashboard.sh

6.3 模拟数据上传测试

# 使用curl模拟健康数据上传
curl -X POST http://localhost:9998/api/health/upload \
  -H "Content-Type: application/json" \
  -d '[
    {
      "deviceSn": "test-device-001",
      "userId": 1,
      "heart_rate": 75,
      "blood_oxygen": 98,
      "temperature": 36.5,
      "timestamp": '$(date +%s000)'
    }
  ]'

# 检查Redis统计是否更新
redis-cli -a 123456 GET "health:stats:total_received"

7. 故障排查

7.1 WebSocket连接失败

现象: 前端显示"WebSocket 未连接"

排查步骤:

# 1. 检查后端日志
tail -f ljwx-boot/logs/ljwx-boot-admin_error.log | grep WebSocket

# 2. 检查端口监听
netstat -tuln | grep 9998

# 3. 测试WebSocket连接
curl -i -N -H "Connection: Upgrade" \
  -H "Upgrade: websocket" \
  http://localhost:9998/ws/data-flow

# 4. 检查防火墙
sudo firewall-cmd --list-ports | grep 9998

常见问题:

  • ❌ 后端未启动 → 运行 ./run-local.sh
  • ❌ 端口被占用 → 更换端口或关闭占用进程
  • ❌ 跨域问题 → 检查 WebSocketConfig.java 的 setAllowedOrigins

7.2 数据不更新

现象: Dashboard显示但数据不刷新

排查步骤:

# 1. 检查WebSocket推送日志
tail -f ljwx-boot/logs/ljwx-boot-admin_info.log | grep "推送数据流指标"

# 2. 检查Redis统计数据
redis-cli -a 123456 KEYS "health:stats:*"
redis-cli -a 123456 GET "health:stats:total_received"

# 3. 检查DataUpload是否记录指标
tail -f ljwx-boot/logs/ljwx-boot-admin_info.log | grep "📊"

常见问题:

  • ❌ 无数据上传 → 使用curl模拟数据上传测试
  • ❌ Redis键过期 → 检查TTL设置(默认1分钟)
  • ❌ 指标记录失败 → 检查DataUpload中的异常日志

7.3 Grafana Dashboard无数据

现象: Grafana面板显示"No Data"

排查步骤:

# 1. 检查Prometheus数据源
kubectl port-forward -n infra svc/prometheus 9090:9090
# 访问: http://localhost:9090/targets

# 2. 检查Prometheus指标
curl http://localhost:9998/actuator/prometheus | grep health_data

# 3. 检查Prometheus查询
curl 'http://localhost:9090/api/v1/query?query=health_data_insert_total'

常见问题:

  • ❌ Prometheus未采集 → 检查ServiceMonitor配置
  • ❌ 指标未导出 → 检查ljwx-boot的Actuator配置
  • ❌ 查询语法错误 → 验证PromQL语法

8. 性能优化

8.1 WebSocket连接数优化

优化配置 (application.yml):

server:
  tomcat:
    threads:
      max: 200              # 最大线程数
    max-connections: 10000  # 最大连接数

8.2 Redis键过期策略

当前设置:

  • TTL: 1分钟(适合实时监控)
  • 自动过期,无需手动清理

调整方法 (DataFlowWebSocketHandler.java):

// 调整过期时间为5分钟
private static final Duration STATS_TTL = Duration.ofMinutes(5);

8.3 推送频率调整

当前设置:

  • 推送间隔: 3秒

调整方法 (DataFlowWebSocketHandler.java):

// 调整为每5秒推送一次
@Scheduled(fixedRate = 5000)
public void pushDataFlowMetrics() { ... }

8.4 前端性能优化

<!-- ECharts图表优化 -->
<script setup>
// 节流更新,避免频繁重绘
const updateChart = useDebounceFn((data) => {
  chartInstance.setOption(option, { notMerge: false })
}, 500)
</script>

9. 生产环境部署

9.1 K8s部署清单

ljwx-boot Deployment (已包含WebSocket支持):

apiVersion: v1
kind: Service
metadata:
  name: ljwx-boot-ws
  namespace: ljwx-health
spec:
  type: ClusterIP
  ports:
    - port: 9998
      targetPort: 9998
      protocol: TCP
      name: websocket
  selector:
    app: ljwx-boot

9.2 Nginx反向代理配置

# WebSocket代理
location /ws/ {
    proxy_pass http://ljwx-boot:9998;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
    proxy_set_header Host $host;
    proxy_read_timeout 86400; # 24小时
}

9.3 环境变量配置

生产环境 (.env.production):

# API Base URL (使用域名)
VITE_API_URL=https://health.ljwx.com

# WebSocket自动推导为:
# wss://health.ljwx.com/ws/data-flow

10. 监控和告警

10.1 关键指标监控

Prometheus告警规则 (prometheus-rules.yml):

groups:
  - name: data_flow_alerts
    rules:
      - alert: HighDataLoss
        expr: health_data_dedup_rate > 0.5
        for: 5m
        labels:
          severity: warning
        annotations:
          summary: "数据去重率过高"
          description: "去重率 {{ $value }}% 超过阈值50%"

      - alert: WebSocketDisconnected
        expr: absent(health_data_insert_total)
        for: 2m
        labels:
          severity: critical
        annotations:
          summary: "WebSocket推送中断"
          description: "超过2分钟未收到数据流指标"

附录

A. 完整目录结构

ljwx-health/
├── ljwx-boot/
│   ├── ljwx-boot-admin/src/main/java/com/ljwx/config/
│   │   └── WebSocketConfig.java
│   └── ljwx-boot-modules/src/main/java/com/ljwx/modules/
│       ├── monitor/websocket/
│       │   └── DataFlowWebSocketHandler.java
│       └── health/upload/
│           └── DataUpload.java (已修改)
│
├── ljwx-admin/
│   └── src/views/monitor/data-flow/
│       └── index.vue
│
├── deploy/monitoring/grafana/dashboards/
│   └── ljwx-health-data-flow.json
│
├── scripts/
│   └── verify-data-flow-dashboard.sh
│
└── DATA_FLOW_DASHBOARD_DEPLOYMENT.md (本文档)

B. 端口清单

服务 端口 协议 用途
ljwx-boot 9998 HTTP/WebSocket 后端API和WebSocket
ljwx-admin 3333 HTTP 前端应用
Redis 6379 Redis 统计数据存储
Grafana 3000 HTTP 监控Dashboard
Prometheus 9090 HTTP 指标采集

C. 参考资源


部署完成! 🎉

如有问题,请参考故障排查章节或联系技术支持。