爲什麼引入Stream?
1:Stream介紹
2 Stream設計思想
標準的MQ架構
爲什麼用SpringCloud——Stream?
Stream爲什麼可以統一底層差異?
設計思想:
2:Stream編碼常用註解
SpringCloud Stream標準流程套路
3:Stream消息驅動之生產者和消費者搭建
生產者
<!-- stream rabbit -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-stream-rabbit</artifactId>
</dependency>
<!-- eureka client-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
application.yml
server:
port: 8801
spring:
application:
name: cloud-stream-provider
cloud:
stream:
# 在此配置要綁定的Rabbit的服務信息
binders:
# 表示定義的名稱,用於binding整合
defaultRabbit:
# 消息組件類型
type: rabbit
environment:
spring:
rabbitmq:
host: localhost
port: 5672
username: guest
password: guest
# 服務的整合員工
bindings:
# 這個名字是一個通道的名稱
output:
# 標識要使用的Exchange名稱定義
destination: studyExchange
# 設置消息類型,本次爲json,文本則設置"text/plain"
content-type: application/json
# 設置要綁定的消息服務的具體設置
binder: defaultRabbit
group: atstudyingA
eureka:
instance:
# 訪問的路徑變ip地址
prefer-ip-address: true
# 在信息列表時顯示主機名稱
instance-id: send-8801.com
# 設置心跳的時間間隔(默認是30秒)
lease-renewal-interval-in-seconds: 2
# 如果現在超過了5秒的間隔(默認是90秒)
lease-expiration-duration-in-seconds: 5
client:
service-url:
defaultZone: http://eureka7001.com:7001/eureka/
SendMessageController .java
@RestController
public class SendMessageController {
@Resource
private IMessageProviderService messageProviderService;
@GetMapping("/sendMessage")
public String sendMessage(){
return messageProviderService.send();
}
}
@EnableBinding(Source.class) // 定義消息的推送管道
@Slf4j
public class MessageProviderImpl implements IMessageProviderService {
@Resource
private MessageChannel output;
@Override
public String send() {
String serial = IdUtil.simpleUUID();
Message<String> message = MessageBuilder.withPayload(serial).build();
boolean result = output.send(message);
// log.info(">>>>> send message {} >>>> {}, ", result, serial);
// log.info(">>>>> send message {} >>>> {}, ", result, message);
return serial;
}
}
StreamRabbitmqMain8801.java
@SpringBootApplication
@EnableEurekaClient
public class StreamRabbitmqMain8801 {
public static void main(String[] args) {
SpringApplication.run(StreamRabbitmqMain8801.class, args);
}
}
消費者
<!-- stream rabbit -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-stream-rabbit</artifactId>
</dependency>
<!-- eureka client-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
server:
port: 8803
spring:
application:
name: cloud-stream-consumer
cloud:
stream:
binders:
defaultRabbit:
type: rabbit
environment:
rabbitmq:
host: localhost
port: 5672
username: guest
password: guest
bindings:
input:
destination: studyExchange
content-type: application/json
binder: defaultRabbit
group: atstudyingA
eureka:
instance:
instance-id: reveive-8803.com
prefer-ip-address: true
lease-expiration-duration-in-seconds: 5
lease-renewal-interval-in-seconds: 2
client:
service-url:
defaultZone: http://eureka7001.com:7001/eureka/
ReceiveMessageListenerController.java
@EnableBinding(Sink.class)
@Slf4j
public class ReceiveMessageListenerController {
@Value("${server.port}")
private String serverPort;
@StreamListener(Sink.INPUT)
private void input(Message<String> message) {
log.info("<<<<< 消費者1號 {} <<<<<< {}", serverPort, message.getPayload());
}
}
StreamMQMain8803.java
@SpringBootApplication
public class StreamMQMain8803 {
public static void main(String[] args) {
SpringApplication.run(StreamMQMain8803.class, args);
}
}
4:解決重複消費問題
解決:只要消費者的配置文件中加入,如下配置,分成同一組
group: atstudyingA