设备网关合并部署
默认情况下,设备网关(yudao-module-iot-gateway)是独立进程,需要单独启动,通过 Redis 等消息总线与 yudao-server 通信,详见 《设备接入(概述)》 文档。
本文介绍的是可选的合并部署方式:把网关作为普通 jar 引入 yudao-module-iot-biz,由 yudao-server 一个进程同时运行业务和网关。适合开发调试、设备量不大的单机场景。
前置说明:
- 先按照 《功能开启》 文档,开启 IoT 模块、导入 SQL、搭建时序数据库,确认 IoT 功能正常。
- 原有的数据库、Redis 等业务配置保持不变。
# 1. 第一步,引入网关依赖
① 修改 yudao-module-iot-biz 目录的 pom.xml 文件,取消 yudao-module-iot-gateway 依赖示例的注释。如下所示:
<!-- 可选:与 biz 合并部署时引入 gateway,并将网关配置合并至 yudao-server 的 application.yaml,消息总线配置为 local。参见 https://t.zsxq.com/FtbO6 -->
<dependency>
<groupId>cn.iocoder.boot</groupId>
<artifactId>yudao-module-iot-gateway</artifactId>
<version>${revision}</version>
</dependency>
② 点击 IDEA 右上角的【Reload All Maven Projects】,刷新 Maven 依赖。
友情提示:
- 网关打包时,主 jar 是普通 jar,可以被
yudao-module-iot-biz依赖。 - 如果仍需独立运行网关,请使用
yudao-module-iot-gateway-exec.jar可执行包。
# 2. 第二步,合并网关配置
从网关自身的 application.yaml 中,复制 yudao.iot.gateway.token、yudao.iot.gateway.protocols 两部分,合并到 yudao-server 已有的 application.yaml 中;同时把 yudao.iot.message-bus.type 改为 local。
下面以只开启 MQTT 协议为例,最小配置如下:
yudao:
iot:
message-bus:
type: local # 消息总线的类型:合并部署时,改为 local
storage:
type: tdengine # 原有配置,保持不变
# 网关配置
gateway:
# 设备 Token 配置
token:
secret: yudaoIotGatewayTokenSecret123456789 # Token 密钥,至少32位
expiration: 7d
# 协议实例列表
protocols:
- id: mqtt-json
enabled: true # 是否启用
protocol: mqtt # 协议类型
port: 1883 # 监听端口
serialize: json # 序列化方式
mqtt:
max-message-size: 8192 # 最大消息大小(字节)
connect-timeout-seconds: 60 # 连接超时时间(秒)
友情提示:
- 合并到已有的
yudao.iot节点下,不要再新增一个yudao:或iot:根键,原有的storage等配置保留。 - 不要复制网关的
spring.application.name、server、Redis、Kafka、RocketMQ 等应用级配置,yudao-server仍使用自己的配置。 - 不需要复制
yudao.iot.gateway.rpc。合并部署时,网关直接调用本进程内的设备 API,不走 HTTP 远程调用。 - 其它协议(HTTP、TCP、EMQX 等),按需从网关的
application.yaml中复制对应的protocols项,并设置enabled: true。
# 3. 第三步,启动项目
只需要运行 yudao-server 的 YudaoServerApplication 启动类,不需要再启动 IotGatewayServerApplication。
- 管理后台的 HTTP 端口保持不变(默认 48080)。
- MQTT 的 1883 端口,是网关额外监听的协议端口。
启动后,在日志中确认以下两点:
① 创建了 Local 消息总线,日志包含 [iotLocalMessageBus][创建 IoT Local 消息总线]。
② MQTT 协议启动成功,日志包含 [start][IoT MQTT 协议 mqtt-json 启动成功,端口:1883,...]。
# 4. 第四步,验证收发
按照 《设备接入(MQTT 协议)》 文档的「手工测试」步骤进行验证:
① 在管理后台创建产品、设备(或使用内置的演示设备)。
② 使用 MQTTX 等客户端,以设备三元组连接 127.0.0.1:1883,确认管理后台的设备状态变为「在线」。
③ 上报属性,在管理后台的设备详情中查看属性数据、设备消息。
④ 在管理后台发送属性设置、服务调用,确认设备订阅的 /sys/{productKey}/{deviceName}/# 主题收到下行消息。
注意:
设备连接的是协议端口(MQTT 为 1883),不是 yudao-server 的 HTTP 端口 48080,不要连错。
# 5. 原理说明
① local 消息总线基于 Spring Event,在同一个 JVM 内同步投递消息。合并部署省掉的只是 IoT 消息总线依赖的 Redis / RocketMQ / Kafka 等消息中间件,业务的缓存、设备状态等仍然使用原有的 Redis。
② 如果网关和 yudao-server 分属不同进程(例如仍有独立部署的网关),两端都必须配置相同的 redis 等跨进程消息总线,不能两边都使用 local。
③ 网关和 biz 中同名的 Service 已经使用不同的 Bean 名称,无需开启 allow-bean-definition-overriding 等 Bean 覆盖配置,也不需要新增 profile 或 spring.config.import。