用过RocketMQ的都知道,官网只提供了一个集群的starter,如果业务域进行消息隔离,使用了不同的集群,就只能copy、paste这种样板式代码,好烦!!!

最近闲来有精神,就写一个支持多集群的声明式的RocketMQ spring-boot-starter组件,来实现代码的代码的共享。

https://central.sonatype.com/artifact/io.github.helloworldtang/rocketmq-multi-instance-spring-boot-starter
在微服务架构中,RocketMQ 作为高性能的消息中间件被广泛使用。官方提供的 rocketmq-spring-boot-starter 虽然开箱即用,但在面对复杂场景时仍显不足。例如,当一个应用需要同时连接多个 RocketMQ 集群,或同一集群的不同 NameServer 时,官方 Starter 的配置往往变得冗长且难以维护。
为此,我设计并实现了一个支持多实例配置的 Spring Boot Starter,不仅能够优雅管理多个 RocketMQ 连接,还将其发布至 Maven 中央仓库,供开发者直接引入使用。
<dependency>
<groupId>io.github.helloworldtang</groupId>
<artifactId>rocketmq-multi-instance-spring-boot-starter</artifactId>
<version>0.1.0</version>
</dependency>本文将完整分享从架构设计、核心代码实现,到最终发布上线的全过程。
1. 痛点与设计目标
@RocketMQMessageListener 的简洁注解风格,同时支持指定消费实例。2. 核心实现解析
动态注册 Producer
借助 Spring 的 ImportBeanDefinitionRegistrar,我们可以在启动阶段动态读取配置,为每个实例注册对应的 DefaultMQProducer Bean。
// 遍历配置,动态注册 Producer Bean
instances.forEach((name, config) -> {
String beanName = name + "Producer";
if (!registry.containsBeanDefinition(beanName)) {
BeanDefinitionBuilder builder =
BeanDefinitionBuilder.genericBeanDefinition(DefaultMQProducer.class);
builder.addConstructorArgValue(name + "-producer-group");
builder.addPropertyValue("namesrvAddr", config.getNameServer());
// 设置其他参数...
registry.registerBeanDefinition(beanName, builder.getBeanDefinition());
}
});同时,为了在任意位置便捷获取 Producer,设计了一个容器类 RocketMQProducerContainer,提供静态获取方法:public static DefaultMQProducer get(String instanceId) {
// 从内部容器返回对应实例
}声明式 Consumer
自定义注解 @RocketMQListener,增加 instanceId 属性以指定消息来源:@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Component
public @interface RocketMQListener {
String instanceId(); // 指定 RocketMQ 实例
String topic();
String consumerGroupId();
// 其他配置...
}通过实现 SmartInitializingSingleton 接口,在 Bean 初始化完成后扫描该注解,并启动对应的 RocketMQ 消费者。实现代码只是第一步,将其共享给社区才真正创造价值。Sonatype 提供了新的 Central Portal,显著简化了发布流程。
1. 前期准备
# 生成密钥对
gpg --gen-key
# 上传公钥至服务器(关键步骤,否则验证会失败)
gpg --keyserver keys.openpgp.org --send-keys <你的KeyID>2. 配置 pom.xml中央仓库对项目元数据有严格要求,需准确配置以下信息:
3. 使用新版发布插件
在 pom.xml 的 build 环节引入 central-publishing-maven-plugin,实现自动上传与发布:
<plugin>
<groupId>org.sonatype.central</groupId>
<artifactId>central-publishing-maven-plugin</artifactId>
<version>0.5.0</version>
<extensions>true</extensions>
<configuration>
<publishingServerId>central</publishingServerId>
<autoPublish>true</autoPublish> <!-- 自动发布,无需手动操作 -->
</configuration>
</plugin>4. 配置 settings.xml在 Maven 的 settings.xml 中添加 Sonatype 的 Token 认证信息:

<server>
<id>central</id>
<username>你的Token用户名</username>
<password>你的Token密码</password>
</server>完成配置后,执行 mvn deploymvn -s /path/to/settings.xml \
-Dmaven.repo.local=~/.m2/repository \
-Prelease -DskipTests \
-pl rocketmq-multi-instance-spring-boot-starter -am deploy稍等片刻,你的组件便会出现在 Maven 中央仓库中。
只需三步,即可在项目中引入并使用该 Starter。
Step 1:引入依赖
<dependency>
<groupId>io.github.helloworldtang</groupId>
<artifactId>rocketmq-multi-instance-spring-boot-starter</artifactId>
<version>0.1.0</version>
</dependency>Step 2:配置多实例
在 application.yml 中定义多个 RocketMQ 集群:rocketmq:
instances:
bj-cluster: # 北京集群,唯一标识,可以用来获取DefaultMQProducer
name-server: 192.168.1.10:9876
sh-cluster: # 上海集群,唯一标识,可以用来获取DefaultMQProducer
name-server: 192.168.2.20:9876Step 3:发送与消费消息发送消息(通过静态方法):
DefaultMQProducer producer = RocketMQProducerContainer.get("bj-cluster");//bj-cluster为yml配置的集群ID
if (producer != null) {
producer.send(new Message("TopicTest", "TagA", "Hello Beijing".getBytes()));
}消费消息(注解驱动):@Component
@RocketMQListener(
instanceId = "sh-cluster", // 指定消费上海集群
topic = "TopicTest",
consumerGroupId = "sh-consumer-group"
)
public class MyConsumer implements RocketMQMessageListener {
@Override
public void onMessage(MessageExt message) {
System.out.println("收到上海集群的消息: " + new String(message.getBody()));
}
}四、结语通过这个项目,我们不仅解决了 RocketMQ 多实例连接的实际工程问题,也完整实践了一个 Spring Boot Starter 从设计、开发到发布上线的全流程。希望这份实现思路与发布指南,能为你在自定义 Starter 或参与开源贡献时提供参考。
如果你对这个项目感兴趣,或者正好有类似需求,欢迎 Star 与 Fork 支持!
GitHub 项目地址:https://github.com/helloworldtang/rocketmq-multi-instance-spring-boot-starter
https://rocketmq.apache.org/docs/quickStart/01quickstart

Tips:
central.sonatype.com是Maven 中央仓库的官方搜索引擎和管理平台,由 Sonatype 公司维护,是 Maven 生态系统的权威数据源。
mvnrepository.com是第三方 Maven 仓库索引服务,它通过爬取和索引多个 Maven 仓库 (包括中央仓库) 的数据,提供更友好的搜索界面和额外功能。