OnlyTL

OnlyTL

Spring Boot 集成 MQTT 多 Broker + SSL 的优雅方案

2025-04-11
Spring Boot 集成 MQTT 多 Broker + SSL 的优雅方案

最近在工作中遇到个比较“边缘”的需求

  • 需要同时连接多个 MQTT Broker,其中还有几个还要求走
  • SSL/TLS 证书通信
    一通搜索下来,要么只支持单一broker,要么不支持证书,直接劝退。干脆手搓了一个。

然后这个 mqtt-spring-boot-starter 就诞生了 🎉

造轮子的出发点

我们团队中 IoT 设备比较多。有些设备对接内网 Broker,有些设备必须通过外网 Broker,还得配合双向 SSL 证书。这就导致:

  • 需要同时连接多个 MQTT Broker(公网 + 内网)
  • 有些需要证书加密
  • Broker 配置项各不相同,消息格式也有点区别

功能亮点 ✨

这个 starter 的目标就一个:让 MQTT 在 Spring Boot 中用起来像操作数据库一样丝滑

它支持的功能包括:

✅ 支持多 MQTT Broker 同时连接
✅ SSL/TLS 配置简洁,支持 PEM / JKS 两种格式
✅ 注解方式订阅主题,和 Spring 的事件监听类似
✅ 支持 MQTT 的 +# 通配符
✅ 支持 QoS 级别控制
✅ 自动重连
✅ 消息发送超简洁
✅ 可配置线程池
✅ 自定义全局消息处理器 / 错误处理器

示例代码一览

配置 Broker 信息(支持多个客户端):

mqtt:
  default-client:
    server-uri: ssl://broker1.example.com:8883
    ssl:
      enabled: true
      cert-type: PEM
      ca-file: classpath:cert/ca.pem
      client-cert-file: classpath:cert/client.pem
      client-key-file: classpath:cert/client.key

  clients:
    local:
      server-uri: tcp://localhost:1883
      default-topic: local/test

订阅消息只需用注解标注方法:

@MqttClient(name = "default")
public class MyHandler {

    @MqttSubscribe("device/+/status")
    public void onStatus(String payload, String topic) {
        System.out.println("状态上报:" + topic + " -> " + payload);
    }

    @MqttSubscribe(topic = "local/alert", client = "local", qos = 2)
    public void onLocalAlert(String payload) {
        System.out.println("本地告警:" + payload);
    }
}

发送消息也一样简单:

@Autowired
private MqttTemplate mqttTemplate;

mqttTemplate.send("hello world", "device/abc/command", "default");

全局消息处理也能搞:

@Bean
@Primary
public MqttMessageHandler customHandler() {
    return new MqttMessageHandler() {
        @Override
        public void handleMessage(Message<?> message, String topic, String clientName) {
            log.info("全局处理:{}@{} -> {}", clientName, topic, message.getPayload());
        }
    };
}

开源地址 & 文档

项目源码已经开源:

👉 GitHub 地址(示例项目 + Starter)

文档写得很详细了,配置示例、使用方式、SSL 支持、线程池配置全都有,保证你开箱即用不踩坑。

后记

这个 Starter 也算是一时手痒的产物,但从目前在项目里的使用情况来看,稳定性和扩展性都还不错。如果你也正在踩类似的坑,希望这个项目能帮上你 🙌

如果你对 MQTT 有更多场景的需求,比如动态 topic、消息持久化、负载均衡消费等,也欢迎提 Issue 或 PR,一起完善这个轮子 🛞


欢迎点赞 + Star!一起构建更丝滑的 Spring Boot MQTT 集成体验! 🚀