API 网关专栏 · 第 30

API 网关如何处理 MQTT 请求:架构、安全与实时集成

2025年04月25日
API 网关如何处理 MQTT 请求:架构、安全与实时集成

简介

MQTT 是一种专为受限设备以及低带宽、高延迟网络设计的轻量级消息协议。它已成为物联网 (IoT) 和实时通信系统中的事实标准。然而,其持久的发布/订阅通信模型与 RESTful HTTP 存在根本区别,这为 API 网关集成 MQTT 带来了独特的挑战。

传统上,API 网关专为无状态的 HTTP 流量设计,其中的请求和响应都是短暂且隔离的。处理 MQTT 要求网关适应持久连接、基于主题的路由和异步消息传递。本文将全面探讨现代 API 网关如何管理 MQTT 流量,涵盖集成模型、身份验证、可观测性以及性能考量等技术细节。

在 API 网关中理解 MQTT

MQTT 协议基础

  • 架构:采用基于代理 (broker) 的模型,客户端向主题发布消息,代理将消息路由给订阅者。
  • 传输层:在 TCP 之上运行,并为基于浏览器或受防火墙限制的环境提供可选的 WebSocket 支持。
  • 服务质量 (QoS)
    • QoS 0:最多一次 (即发即弃)
    • QoS 1:至少一次 (带有确认机制)
    • QoS 2:只有一次 (带有握手机制)
  • 消息结构:针对低开销传输进行优化的二进制格式。
  • 连接:客户端保持长期的 TCP 连接,通常带有保活 (keep-alive) 数据包。

MQTT 与 HTTP API 对比

特性MQTTHTTP
通信模型发布/订阅请求/响应
连接持久无状态
路由主题URL
有效负载格式二进制文本 (JSON, XML 等)
延迟较高 (由于建立连接的开销)
推送支持原生支持需要轮询/Webhooks

集成模型:API 网关如何与 MQTT 交互

模型 1 - 网关作为 WebSocket 代理

在该模型中,MQTT 客户端通过 WebSocket 进行通信,API 网关将这些连接代理到后端的 MQTT 代理。这对于基于 Web 的仪表板或移动应用特别有用。

用例:将 MQTT 集成到浏览器无法打开原生 TCP 连接的 Web 仪表板中。

1sequenceDiagram
2    participant Client
3    participant API Gateway
4    participant MQTT Broker
5    Client->>API Gateway: WebSocket (基于 WS 的 MQTT)
6    API Gateway->>MQTT Broker: TCP (MQTT)
7    MQTT Broker-->>API Gateway: 发布/订阅消息
8    API Gateway-->>Client: WebSocket 事件

优势:

  • 复用现有的网关基础设施
  • 通过 WebSocket 支持浏览器

挑战:

  • 对 MQTT 消息内容的可见性有限
  • 网关需要支持 TCP 和 WebSocket 代理

模型 2 - 网关作为 MQTT 代理的前门

在这里,API 网关充当 MQTT 代理前方的智能层。它处理设备身份验证、访问控制、限流,甚至协议转换。

1sequenceDiagram
2    participant IoT Device
3    participant API Gateway
4    participant MQTT Broker
5    participant Backend Auth Service
6    IoT Device->>API Gateway: MQTT CONNECT + Auth Token
7    API Gateway->>Backend Auth Service: 验证 Token
8    Backend Auth Service-->>API Gateway: 200 OK / 403 Forbidden
9    API Gateway->>MQTT Broker: 连接或拒绝

优势:

  • 完全控制身份验证和授权
  • 支持日志记录、分析和限流

挑战:

  • 需要具备协议感知能力和策略执行逻辑
  • 在高并发下可能成为性能瓶颈

安全与访问控制

MQTT 身份验证方法

  • 用户名/密码:简单但在未加密情况下不安全
  • 带有客户端证书的 TLS (mTLS):安全验证设备身份
  • JWT Token:在现代 API 网关集成中常见,支持基于 OAuth2.0 的流程
1CONNECT {
2  "username": "jwt_token",
3  "password": "ignored"
4}

主题级别的授权

API 网关可以基于主题过滤器强制执行访问控制策略:

  • 仅允许特定的已验证设备访问 /device/<device_id>/data
  • 拒绝对无特权的客户端订阅 # 等通配符主题

ACL (访问控制列表) 示例:

1{
2  "allow": ["/device/123/data"],
3  "deny": ["#"]
4}

可观测性与监控

记录 MQTT 事件

  • CONNECT、DISCONNECT、PUBLISH、SUBSCRIBE、UNSUBSCRIBE
  • 可用于审计设备行为或调试消息流向

指标与追踪

关键指标:

  • 活跃的 MQTT 连接数
  • 每个主题发布的消息数
  • 订阅率
  • 连接失败和断开次数

跨代理和网关追踪 MQTT 消息需要关联 ID (correlation IDs) 或客户端标识符。

性能考量

处理大规模 MQTT 流量

  • 负载均衡:利用网关在代理集群之间分配连接
  • 连接管理:设置空闲超时并管理 TCP 保活机制
  • QoS 优化:遥测数据优先选择 QoS 0,命令优先选择 QoS 1 或 2

L4 代理模式或 TCP 流插件

像 Apache APISIX 这样的网关支持流代理插件:

  • 以极低的开销进行代理
  • 流级别的访问控制 (例如,通过 SNI 或 IP)
  • 无需对 MQTT 协议进行完整解析

实际应用场景

智能家居网关

  • 传感器通过 MQTT 发布数据
  • API 网关执行 JWT 验证
  • 数据路由到中央处理平台

车联网

  • 车辆通过 MQTT 流式传输遥测数据
  • 网关强制执行 mTLS 和基于主题的 ACL
  • 支持带有 QoS 2 的空中下载技术 (OTA) 更新

工业物联网平台

  • 高频传感器数据发布到主题
  • 网关处理身份验证和限流
  • 使用 MQTT 到 HTTP 的网桥在仪表板上进行可视化

结合 API 网关使用 MQTT 的最佳实践

  • 使用基于 WebSocket 的 MQTT 以穿透防火墙并提供良好的 Web 兼容性
  • 为所有客户端连接强制实施 TLS + JWT/OAuth
  • 对 MQTT CONNECT 和 SUBSCRIBE 进行限流,以防止 DoS 攻击
  • 谨慎使用主题命名空间和通配符
  • 如果将 MQTT 与 REST 或 Kafka 集成,请实现协议桥接

结论:通过 API 网关实现安全且可扩展的 MQTT

MQTT 提供了一种高效、低延迟的消息传递模型,非常适合分布式实时系统。然而,其独特的协议行为在集成到现代云原生系统时,也带来了架构和运维方面的挑战。

API 网关提供了一个关键的控制平面,以保护、监控和扩展 MQTT 流量。从 WebSocket 代理到流级别的策略执行,诸如 Apache APISIX 这样的现代网关,搭建起了轻量级设备协议与企业级后端系统之间的桥梁。

无论你是在构建智能工厂、车联网,还是实时仪表板,一个配置得当的 API 网关对于大规模管理基于 MQTT 的通信来说,都是必不可少的。

微信咨询

获取方案