SpringCloudStream集成Rabbitmq

262 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第16天,点击查看活动详情

SpringCloudStream框架由于编程方式非常简单,所以在很多大型企业中,SpringCloudStream框架的使用频率会比SpringBoot框架更高。

SpringCloudStream 是一个构建高扩展和事件驱动的微服务系统的框架,用于连接共有消息系统。整体上是把各种的MQ产品抽象成了一套非常简单的统一的编程框架,以实现事件驱动的编程模型。

社区官方实现了RabbitMQApache KafkaKafkaStreamAmazon Kinesis这几种产品,而其他还有很多产品比如RocketMQ,都是由产品方自行提供扩展实现。所以可以看到,对于RabbitMQ,使用SpringCloudStream框架算是一种比较成熟的集成方案。

但是需要主要注意的是,SpringCloudStream框架集成的版本通常是比RabbitMQ落后几个版本的,使用时需要注意。

SpringCloudStream框架封装出了三个最基础的概念来对各种消息中间件提供统一的抽象:

  • Destination Binders:负责集成外部消息系统的组件。
  • Destination Binding:由Binders创建的,负责沟通外部消息系统、消息发送者和消息消费者的桥梁。
  • Message:消息发送者与消息消费者沟通的简单数据结构。

可以看到,这个模型非常简单,使用时也会非常方便。但是简单,意味着中的各种概念模型,与RabbitMQ的基础概念之间是有比较大的差距的,例如ExchangeQueue这些原生概念,集成到框架时,都需要注意如何配置,如何转换。

引入依赖

SpringCloudStream框架集成的版本通常是比RabbitMQ产品本身落后几个版本的,使用时需要注意。他的核心依赖也就一个

<dependency>
<groupId>org.springframework.cloud</groupId>
<!--<artifactId>spring-cloud-starter-stream-rabbit</artifactId>-->
    <artifactId>spring-cloud-stream-binder-rabbit</artifactId>
</dependency>

这两个Maven依赖没有什么特别大的区别,实际上,他们的github代码库是在一起的。

配置application.yml

spring:
  rabbitmq:
    host: 192.168.124.81
    port: 5672
    username: admin
    password: 123456
    virtual-host: /mirror
  cloud:
    stream:
      bindings:
        output:
          destination: streamExchange
        input:
          destination: streamExchange
          group: stream
          content-type: text/plain

声明Source生产者发送消息

@Component
@EnableBinding(Source.class)
public class MessageSender {
    @Autowired
    private Source source;

    public void sendMessage(Object message) {
        MessageBuilder<Object> builder = MessageBuilder.withPayload(message);
        source.output().send(builder.build());
    }
}

声明Sink消费者消费消息

@Slf4j
@Component
@EnableBinding(Sink.class)
public class MessageReceiver {

    @EventListener
    @StreamListener(Sink.INPUT)
    public void process(Object message) {
        System.out.println("received message : " + message);
        log.info("received message : {}", message);
    }
}