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还可以进行消息的持久化,

当消费端挂掉重启后,未消费的消息会自动进行消费。

 

posted @ 2020-06-02 14:41  ~笑春风~  阅读(248)  评论(0编辑  收藏  举报