15.1 概念
Spring Cloud Steam是消息驱动框架,基于 Spring Boot,支持 RabbitMQ、Kafaka,可以做消息的发布、订阅、分区等
Spring Cloud Stream 可以用来构建消息驱动的微服务,微服务之间的调用,比如用 RestTemplate、OpenFeign 都是基于 Http 调用,除了这种方式,也可以使用消息驱动,通过给中间件(如 RabbitMQ)发消息,RabbitMQ 收到消息后,根据 RabbitMQ 的内容消息做响应。
Spring Cloud Stream 比较适合处理耦合度比较低的情况,比如发邮件,发短信这种,不需要立即响应,也不关心是否成功
Spring Cloud Stream 对中间件做了封装,使用起来更加方便,提供了微服务和消息中间件的粘合剂,这种粘合剂叫做 Binder,它负责与消息中间件沟通,而开发者通过 Inputs 和 Outputs 消息通道与 Binder 进行交互。只需关心 Spring Cloud Stream 与微服务之间的通信方式、怎么发送、怎么订阅即可,剩下的交给 Spring Cloud Stream,不用关心其他内容。
15.2 HelloWorld
- 1.创建一个 Spring Boot 项目的 module ,添加 Spring Web、Spring for RabbitMQ、Cloud Stream 依赖
- 2.启动 docker 中的 RabbitMQ
访问 RabbitMQ 管理页面,账号密码都是 guest ,看到如下页面说明 RabbitMQ 启动完成:
- 3.在 application.properties 中配置 RabbitMQ 信息
spring.rabbitmq.host=192.168.99.100
spring.rabbitmq.port=32773
spring.rabbitmq.username=guest
spring.rabbitmq.password=guest
配置含义简单明了,直接看名字就知道配置的是什么,其中 32771 是 docker 中服务端口(5672)对应外网的端口,如图:
- 4.创建消息接收器。
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.cloud.stream.annotation.EnableBinding;
import org.springframework.cloud.stream.annotation.StreamListener;
import org.springframework.cloud.stream.messaging.Sink;
@EnableBinding(Sink.class)
public class MsgReceiver {
private static final Logger logger = LoggerFactory.getLogger(MsgReceiver.class);
@StreamListener(Sink.INPUT)
public void receive(Object payload){
logger.info("received:" + payload);
}
}
@EnableBinding(Sink.class)
是启动粘合剂,把 Sink
这个类绑定到 MsgReceiver
中,Sink 是默认给的通道配置。
在 RabbitMQ 中这样显示:
- 5.启动项目:
在 RabbitMQ 的管理页面的 Queues中能看见刚刚创建的队列
点击队列名,在 publish message 中输入消息,然后发布
观察控制台,可以看到刚刚队列中发布的那条**大海啊,都是水!**的消息,说明 Spring Cloud Stream 连接 RabbitMQ 使用成功
这就是 Spring Cloud Sream 中使用 RabbitMQ 的 HelloWorld 展示
总结
首先默认提供了一个通道,用 Sink 接口封装的,通过 @EnableBinding 和 @StreamListener 两个注解来绑定 Sink 通道 和 监听消息通道的队列中的消息。