cloudStream
stream:解决不同项目之间消息中间件的差异带来的问题,解耦。通过binder来屏蔽底层中间件的差异,通过input和output进行信息的传递。
模型:
项目生产者:
1.pom:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-stream-rabbit</artifactId>
</dependency>
2.yml:
server:
port: 8801
spring:
application:
name: cloud-stream-provider
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 # 设置要绑定的消息服务的具体设置
eureka:
client:
service-url:
defaultZone: http://eureka7001.com:7001/eureka
instance:
lease-renewal-interval-in-seconds: 2 # 设置心跳的间隔时间,默认30
lease-expiration-duration-in-seconds: 5 # 超过5秒间隔,默认90
instance-id: send-8801.com # 主机名
prefer-ip-address: true # 显示ip
3.主启动无变化
4.在service包下创建发送信息的接口:
public interface providerSender {
public String send();
}
5.接口的实现类:
@EnableBinding(Source.class)//定义发送源
public class messageProvider implements providerSender {
@Resource
private MessageChannel output;//消息发送管道
@Override
public String send() {
String randomNumber = UUID.randomUUID().toString();
output.send(MessageBuilder.withPayload(randomNumber).build());
System.out.println("radomNumber*****************"+randomNumber);
return randomNumber;
}
}
6.controller测试:
@GetMapping("/sendMessage")
@ResponseBody
private String sendMessage(){
return providerSender.send();
}
生产者完成了,现在开始配置消费端
1.pom一样
2.yml:注意这个通道与生产者的不一样,要改成input,但是exchange交换机要保持一致。
3.主启动无变化
4.controller:消费者通过Sink定义输入源,input方法中的消息的泛型与生产者发送的消息类型一致,生产者通过withpayload(),创建了消息,在这里通过getpayload取出消息。
5.测试:消费者成功取出消息
问题:一个消费端可以实现消息的消费,但是多个消费端就会出现消息的重复消费。
新建消费端88003,看同一条消息被重复消费了两次,这是为什么呢,因为他们的分组不同。
通过查看rabbitMQ得知,消息分成了两组,在微服务中,消息不在同一个组下会导致重复消费的问题,只有在同一个组下才会进行消息的竞争,避免重复消费。
实现:
修改消费端的yml,加上group属性,使两个消费端的微服务在同一个组里,这样就避免了重复消费的问题,而且使用group还可以进行消息的持久化,
当消费端挂掉重启后,未消费的消息会自动进行消费。
我不是程序员,我只是程序的搬运工