第七部分:部署与运维
7.1 部署单元
| 组件 | 部署形式 | 默认端口/输出 |
|---|---|---|
| 管理后台 | Vue/Vite 构建后由 Nginx 托管 | admin-web/dist |
| 后端 | Spring Boot 单体 Jar | 8080 |
| 用户小程序 | 微信小程序发布 | API 指向 HTTPS 域名 |
| MySQL | 已部署中间件 | 地址待配置文档 |
| Redis | 已部署中间件 | 地址待配置文档 |
| Kafka | 已部署中间件 | bootstrap servers 待配置 |
| EMQX | 已部署 MQTT Broker | MQTT/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 联调清单
- 创建四个 Kafka Topic,并确认分区、副本、保留策略和后端/EMQX ACL。
- 配置 EMQX 上行 Rule:属性 → telemetry.up,事件 → event.up,Key=deviceId。
- 配置 EMQX 下行 Bridge:消费 command.down 并发布设备指令 MQTT Topic。
- 配置 ACK Rule:设备回执 MQTT Topic → command.ack。
- 使用同一 messageId 重放上行消息,MySQL 只能产生一条遥测。
- 下发指令后依次看到
PENDING → SENT → SUCCEEDED/FAILED。 - 暂停后端消费者,确认 Kafka lag 可观测;恢复后顺序消费且不重复产生副作用。
- 暂停 EMQX Bridge,确认指令保持 SENT 并最终进入超时/告警流程。
7.6 监控指标
| 链路 | 指标 |
|---|---|
| Spring Boot | API P95/P99、5xx、线程池、JVM、数据库连接池 |
| Redis | 命中率、内存、连接、过期、拒绝连接、主从延迟 |
| MySQL | 慢查询、锁等待、连接、磁盘、复制延迟 |
| Kafka | Producer 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 和独立数据库所有权。