跳到主要内容

mqtt-proxy

mqtt-proxy 插件是一个 L4 插件,支持将 MQTT 请求代理和负载均衡到 MQTT 服务器。它支持 MQTT 版本 3.1.x 和 5.0。该插件必须在流路由上配置,并且 APISIX 需要启用 L4 流量代理。

示例

默认情况下,APISIX 仅代理 L7 流量。在进行示例操作之前,请确保在 APISIX 中启用了 L4 流量代理。

按如下方式更新配置文件以启用 L4 流量代理:

conf/config.yaml
apisix:
proxy_mode: http&stream # 同时启用 L4 和 L7 代理
stream_proxy: # 配置 L4 代理
tcp:
- 9100 # 设置 TCP 代理监听端口

重新加载 APISIX 使更改生效。APISIX 现在应该开始在 9100 端口监听 L4 流量。

以下示例使用 Mosquitto 项目中的 MQTT 客户端来发布和订阅消息。你可以从此处下载它,或使用你选择的任何其他 MQTT 客户端。

代理到 MQTT 代理服务器

以下示例演示了如何配置流路由,将流量代理到托管的 MQTT 服务器,并验证 APISIX 能否成功代理 MQTT 消息。

创建一个指向 MQTT 服务器的流路由,并配置 mqtt-proxy 插件:

curl "http://127.0.0.1:9180/apisix/admin/stream_routes" -X PUT \
-H "X-API-KEY: ${ADMIN_API_KEY}" \
-d '{
"id": "mqtt-route",
"plugins": {
"mqtt-proxy": {
"protocol_name": "MQTT",
"protocol_level": 4
}
},
"upstream": {
"type": "roundrobin",
"nodes": {
"test.mosquitto.org:1883": 1
}
}
}'

打开两个终端会话。在第一个会话中,订阅测试主题:

mosquitto_sub -h test.mosquitto.org -p 1883 -t "test/apisix"

在另一个会话中,向创建的路由发布一条示例消息:

mosquitto_pub -h 127.0.0.1 -p 9100 -t "test/apisix" -m "Hello APISIX"

你应该会在第一个终端中看到消息 Hello APISIX

负载均衡 MQTT 流量

以下示例演示了如何配置流路由,将 MQTT 流量负载均衡到不同的 MQTT 服务器。

启用插件后,它会注册一个变量 mqtt_client_id,可用于负载均衡。具有不同客户端 ID 的 MQTT 连接将根据一致性哈希算法被转发到不同的上游节点。如果缺少客户端 ID,则将使用客户端 IP 代替。

创建一个指向两个 MQTT 服务器的流路由,并配置 mqtt-proxy 插件:

curl "http://127.0.0.1:9180/apisix/admin/stream_routes" -X PUT \
-H "X-API-KEY: ${ADMIN_API_KEY}" \
-d '{
"id": "mqtt-route",
"plugins": {
"mqtt-proxy": {
"protocol_name": "MQTT",
"protocol_level": 4
}
},
"upstream": {
"type": "roundrobin",
"key": "mqtt_client_id",
"nodes": [
{
"host": "test.mosquitto.org",
"port": 1883,
"weight": 1
},
{
"host": "broker.mqtt.cool",
"port": 1883,
"weight": 1
}
]
}
}'

打开三个终端会话。在第一个会话中,订阅第一个 MQTT 代理上的测试主题:

mosquitto_sub -h test.mosquitto.org -p 1883 -t "test/apisix"

在第二个终端中,订阅第二个 MQTT 代理上的相同主题:

mosquitto_sub -h broker.mqtt.cool -p 1883 -t "test/apisix"

在第三个终端中,多次运行以下命令向路由发送示例消息:

mosquitto_pub -h 127.0.0.1 -p 9100 -t "test/apisix" -m "Hello APISIX"

你应该会在两个终端中都看到消息 Hello APISIX,验证了流量已被负载均衡。