SpringCloud Stream的简单使用

当进行业务开发时,我们会用到消息中间件,例如kafka和rabbitmq,但是不同的消息中间件的实现有许多的不同,所以当两种中间件进行信息传输和迁移时,会造成巨大的麻烦,spring stream 就是为了降低耦合度,解决这种问题应运而生的。屏蔽中间件的底层差异,使编程统一化。

应用程序通过inputs或者outputs与绑定对象(binder)进行交互。而binder与消息中间件进行绑定,屏蔽了中间件的差异。

 

 案例:

构建消息生产者:

添加依赖:

<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-stream-rabbit</artifactId>
</dependency>
写yml(配置binder):
cloud:
stream:
binders: # 在此处配置要绑定的rabbitmq的服务信息;
defaultRabbit: # 表示定义的名称,用于于binding整合
type: rabbit # 消息组件类型
environment: # 设置rabbitmq的相关的环境配置
spring:
rabbitmq:
host: localhost
port: 5672
username: guest
password: guest
bindings: # 服务的整合处理
output: # 这个名字是一个通道的名称
destination: studyExchange # 表示要使用的Exchange名称定义
content-type: application/json # 设置消息类型,本次为json,文本则设置“text/plain”
binder: defaultRabbit # 设置要绑定的消息服务的具体设置
编写发送消息的接口:
public interface MessageProvider {
public String send();
}
实现接口:
@EnableBinding(Source.class)//定义消息推送管道
public class MessageProviderImpl implements MessageProvider {
@Resource
private MessageChannel output;
//消息发送管道
@Override
public String send() {
String serial = UUID.randomUUID().toString();
output.send(MessageBuilder.withPayload(serial).build());
System.out.println(serial);
return null;
}
}
构建消息消费者
引入依赖:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-stream-rabbit</artifactId>
</dependency>
写yml(配置binder):
cloud:
stream:
binders: # 在此处配置要绑定的rabbitmq的服务信息;
defaultRabbit: # 表示定义的名称,用于于binding整合
type: rabbit # 消息组件类型
environment: # 设置rabbitmq的相关的环境配置
spring:
rabbitmq:
host: localhost
port: 5672
username: guest
password: guest
bindings: # 服务的整合处理
input: # 这个名字是一个通道的名称
destination: studyExchange # 表示要使用的Exchange名称定义
content-type: application/json # 设置消息类型,本次为对象json,如果是文本则设置“text/plain”
binder: defaultRabbit # 设置要绑定的消息服务的具体设置
接收消息的类:
@Controller
@EnableBinding(Sink.class)
public class ConsumerController {
@Value("${server.port}")
private String port;
@StreamListener(Sink.INPUT)
public void input(Message<String> message){
System.out.println(message.getPayload());
}
}
当一个生产者向多个消费者发送消息时,多个消费者都会接受到消息,只需要进行分组就可以解决消息重复消费的问题。
例:
bindings: # 服务的整合处理
input: # 这个名字是一个通道的名称
destination: studyExchange # 表示要使用的Exchange名称定义
content-type: application/json # 设置消息类型,本次为对象json,如果是文本则设置“text/plain”
binder: defaultRabbit # 设置要绑定的消息服务的具体设置
group: 2 #将多个消费者分配进一个组中,便可只有一个消费者能获得生产者发送的某条消息






 

posted @ 2020-09-26 11:24  第十八使徒  阅读(404)  评论(0)    收藏  举报