Spring Cloud Stream
概述
- Spring Cloud Stream 是一个构建消息驱动微服务应用的框架。
- Stream 解决了开发人员无感知的使用消息中间件的问题,因为Stream对消息中间件的进一步封装,可以做到代码层面对中间件的无感知,甚至于动态的切换中间件,使得微服务开发的高度解耦,服务可以关注更多自己的业务流程
- Spring Cloud Stream目前支持两种消息中间件RabbitMQ和Kafka
1. stream-组件
2. stream-消息生产者
-
创建消息生产者模块,引入依赖 starter-stream-rabbit
<!-- stream --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-stream-rabbit</artifactId> </dependency>
-
编写配置,定义 binder,和 bingings
spring: cloud: stream: # 定义绑定器,绑定到哪个消息中间件上 binders: ittest_binder: # 自定义的绑定器名称 type: rabbit # 绑定器类型 environment: # 指定mq的环境 spring: rabbitmq: host: localhost port: 5672 username: guest password: guest virtual-host: / bindings: output: # channel名称 binder: ittest_binder #指定使用哪一个binder destination: ittest_exchange # 消息目的地
-
定义消息发送业务类。添加 @EnableBinding(Source.class),注入MessageChannel output ,完成消息发送
package com.ittest.stream.producer;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.stream.annotation.EnableBinding;
import org.springframework.cloud.stream.messaging.Source;
import org.springframework.messaging.MessageChannel;
import org.springframework.messaging.support.MessageBuilder;
import org.springframework.stereotype.Component;
@Component
@EnableBinding(Source.class)
public class MessageProducer {
@Autowired
private MessageChannel output;
public void send(){
String msessage = "hello stream~~~";
//发送消息
output.send(MessageBuilder.withPayload(msessage).build());
System.out.println("消息发送成功~~~");
}
}
-
编写启动类,测试
@RestController public class ProducerController { @Autowired private MessageProducer producer; @RequestMapping("/send") public String sendMsg(){ producer.send(); return "success"; } }
3. stream-消息消费者
-
创建消息消费者模块,引入依赖 starter-stream-rabbit
-
编写配置,定义 binder,和 bingings
output 更改成 input
spring: cloud: stream: # 定义绑定器,绑定到哪个消息中间件上 binders: ittest_binder: # 自定义的绑定器名称 type: rabbit # 绑定器类型 environment: # 指定mq的环境 spring: rabbitmq: host: localhost port: 5672 username: guest password: guest virtual-host: / bindings: input: # channel名称 binder: ittest_binder #指定使用哪一个binder destination: ittest_exchange # 消息目的地
-
定义消息接收业务类。添加 @EnableBinding(Sink.class),使用@StreamListener(Sink.INPUT),完成消息接收。
package com.ittest.stream.consumer;
import org.springframework.cloud.stream.annotation.EnableBinding;
import org.springframework.cloud.stream.annotation.StreamListener;
import org.springframework.cloud.stream.messaging.Sink;
import org.springframework.messaging.Message;
import org.springframework.stereotype.Component;
/**
* 消息接收类
*/
@EnableBinding({Sink.class})
@Component
public class MessageListener {
@StreamListener(Sink.INPUT)
public void receive(Message message){
System.out.println(message);
System.out.println(message.getPayload());
}
}
- 编写启动类,测试