第七部分:部署与运维

7.1 部署单元

组件部署形式默认端口/输出
管理后台Vue/Vite 构建后由 Nginx 托管admin-web/dist
后端Spring Boot 单体 Jar8080
用户小程序微信小程序发布API 指向 HTTPS 域名
MySQL已部署中间件地址待配置文档
Redis已部署中间件地址待配置文档
Kafka已部署中间件bootstrap servers 待配置
EMQX已部署 MQTT BrokerMQTT/Dashboard 地址待配置

后端不连接 MQTT。生产网络只允许 Spring Boot 访问 MySQL、Redis、Kafka;设备访问 EMQX;EMQX Bridge 访问 Kafka。

7.2 环境变量

完整模板位于 iot-platform-mvp/backend/.env.example。收到中间件地址文档后,为开发、测试、预生产、生产分别配置,不把密码和证书提交到仓库。

MySQL

  • MYSQL_URL:JDBC URL,包含数据库名、字符集、时区和 TLS 参数。
  • MYSQL_USERNAME / MYSQL_PASSWORD:最小权限业务账号。
  • MYSQL_POOL_MAX / MYSQL_POOL_MIN:HikariCP 连接池。

Redis

  • REDIS_HOST / REDIS_PORT / REDIS_PASSWORD / REDIS_DATABASE。
  • IOT_SESSION_TTL:登录 Token TTL,默认 24 小时。
  • 若实际为 Sentinel/Cluster,在地址文档中提供节点、主节点名和 TLS/SASL 信息,再调整 Spring 配置结构。

Kafka

  • KAFKA_BOOTSTRAP_SERVERS / KAFKA_CONSUMER_GROUP。
  • KAFKA_TOPIC_TELEMETRY_UP / EVENT_UP / COMMAND_DOWN / COMMAND_ACK。
  • SASL 机制、账号、密码、TLS truststore、Topic 分区/副本和 ACL 在收到地址文档后补齐。

EMQX

EMQX_DASHBOARD_URL 仅作为运维元数据。Spring Boot 不需要 MQTT Host、ClientId 或 MQTT 用户密码。EMQX 连接器负责 Kafka 双向桥接。

7.3 构建与测试

后端

项目自带 Maven Wrapper,不要求系统安装 Maven:

cd .\iot-platform-mvp\backend
.\mvnw.cmd test
.\mvnw.cmd clean package

测试 profile 使用 H2、内存登录会话和 Noop Kafka Publisher,不连接外部中间件。Jar 输出到 target/iot-platform-2.0.0.jar。

管理后台

cd .\iot-platform-mvp\admin-web
npm ci
npm run build

Vite 生产产物输出到 dist。Nginx 对 SPA 未命中路径回退 index.html,并将 /api/ 反向代理至 Spring Boot。

7.4 启动

java -jar .\target\iot-platform-2.0.0.jar

健康检查:

Invoke-RestMethod http://127.0.0.1:8080/api/health
Invoke-RestMethod http://127.0.0.1:8080/actuator/health

生产使用独立低权限系统账户和进程管理器,配置优雅停机、启动超时、异常重启退避和日志采集。

7.5 EMQX/Kafka 联调清单

  1. 创建四个 Kafka Topic,并确认分区、副本、保留策略和后端/EMQX ACL。
  2. 配置 EMQX 上行 Rule:属性 → telemetry.up,事件 → event.up,Key=deviceId。
  3. 配置 EMQX 下行 Bridge:消费 command.down 并发布设备指令 MQTT Topic。
  4. 配置 ACK Rule:设备回执 MQTT Topic → command.ack。
  5. 使用同一 messageId 重放上行消息,MySQL 只能产生一条遥测。
  6. 下发指令后依次看到 PENDING → SENT → SUCCEEDED/FAILED。
  7. 暂停后端消费者,确认 Kafka lag 可观测;恢复后顺序消费且不重复产生副作用。
  8. 暂停 EMQX Bridge,确认指令保持 SENT 并最终进入超时/告警流程。

7.6 监控指标

链路指标
Spring BootAPI P95/P99、5xx、线程池、JVM、数据库连接池
Redis命中率、内存、连接、过期、拒绝连接、主从延迟
MySQL慢查询、锁等待、连接、磁盘、复制延迟
KafkaProducer error、Consumer lag、重平衡、ISR、磁盘
EMQX连接数、认证失败、上下行消息、丢弃、Bridge success/error
业务在线率、遥测延迟、指令成功/超时率、告警积压

7.7 备份恢复

  • MySQL 使用全量备份 + binlog,目标 RPO≤15 分钟、RTO≤60 分钟。
  • Redis 登录会话和缓存允许重建;配置持久化/副本以降低大规模用户重新登录。
  • Kafka 保留期必须覆盖最长故障恢复窗口,禁止把 Kafka 当永久业务备份。
  • EMQX 配置、规则、连接器和 ACL 导出版本化保存,凭据单独托管。
  • 每季度恢复到隔离环境,验证用户、设备、绑定、指令和随机遥测,不只检查备份文件存在。

7.8 微服务部署演进

当前只发布一个 Spring Boot Jar。后续拆分时优先将 Kafka 上行消费者/遥测处理独立扩容,再拆指令服务。拆分前完成事件版本、Outbox、分布式追踪、配置中心、服务 SLO 和独立数据库所有权。