084-消息模块-深入 Spring Cloud Stream 配置——Kafka、RabbitMQ、NATS 横向对比
本文章代码: gitee , gitcode , github
1. 配置结构共性
三个 profile 配置文件都包含了 spring.cloud.function.definition: sms,这是函数式定义,告诉框架将名为 sms 的 Consumer Bean 作为消息处理器。绑定配置中:
sms-out-0和sms-in-0是系统自动生成的通道名称,规则为{functionName}-{in/out}-{index}。destination是物理目的地(Kafka Topic / RabbitMQ Exchange / NATS Subject)。content-type统一为 JSON,Spring Cloud Stream 会自动序列化/反序列化SmsMessage。- 输入通道的
group用于消费者组,保证同一组内只有一个实例消费消息。
2. Kafka 专属配置
spring.kafka:
bootstrap-servers: localhost:9092
Kafka Binder 依赖 spring-kafka,在 classpath 中自动配置。生产者可以额外配置 producer 属性,消费者可配置 consumer 属性(如 auto-offset-reset),但本例未显式设置。Kafka 的 group 对应消费者组 ID,多个实例共享组可实现分区消费。
3. RabbitMQ 专属配置
spring.rabbitmq:
host: localhost
port: 5672
username: guest
password: guest
Rabbit Binder 将 destination 映射为 Exchange,group 映射为 Queue 名称(实际为 destination.group)。绑定属性可设置 consumer.durable、producer.routing-key 等扩展。默认使用 Direct Exchange,但可自定义。
4. NATS 专属配置
nats.spring:
server: nats://localhost:4222
username: root
password: root
NATS Binder 是 Spring Cloud Stream 的社区扩展(需要引入 spring-cloud-stream-binder-nats)。注意前缀为 nats.spring,而非 spring.nats。NATS 的 destination 即 Subject,group 对应 Queue Group,实现负载均衡。NATS 的持久化与 JetStream 相关,本例默认不启用。
5. 动态切换与依赖管理
要实现多 Profile 切换,需在 pom.xml 中同时引入三个 Binder 的 starter,如:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-stream-binder-kafka</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-stream-binder-rabbit</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-stream-binder-nats</artifactId>
</dependency>
激活某个 Profile 时,对应的 Binder 会自动初始化,其他 Binder 不会加载(但 classpath 中存在,可以通过 spring.cloud.stream.default-binder 强制指定,或者按需排除)。
6. 生产环境建议
- 为不同环境(dev/test/prod)配置独立的 Profile,并将中间件连接信息外置(如使用环境变量或配置中心)。
- 适当设置
consumer.max-attempts、producer.retries等重试策略。 - 监控消息积压和消费延迟,可结合 Micrometer 指标。
7. 对比总结
| 特性 | Kafka | RabbitMQ | NATS |
|---|---|---|---|
| 模型 | Topic + Partition | Exchange + Queue | Subject + Queue Group |
| 顺序保证 | 分区内有序 | 队列内有序(部分) | 无顺序(可借助 JetStream) |
| 持久化 | 默认持久化 | 可选持久化 | 内存/持久化(JetStream) |
| 吞吐量 | 高 | 中等 | 极高 |
| 适用场景 | 日志、事件溯源 | 传统任务、RPC | 微服务通信、低延迟 |
选择哪种中间件应依据业务需求,而 Spring Cloud Stream 让这种选择变得“无痛”。
转载自 CSDN-专业IT技术社区
原文链接:https://blog.csdn.net/2403_86882821/article/details/169330476




