系列文章(更新ing):
「 從0到1學習微服務SpringCloud 」01 一起來學呀! 「 從0到1學習微服務SpringCloud 」02 Eureka服務註冊與發現
「 從0到1學習微服務SpringCloud 」03 Eureka的自我保護機制
「 從0到1學習微服務SpringCloud 」04服務消費者Ribbon+RestTemplate
「 從0到1學習微服務SpringCloud 」05消費者Fegin
「 從0到1學習微服務SpringCloud 」06 統一配置中心Spring Cloud Config
「 從0到1學習微服務SpringCloud 」07 RabbitMq的基本使用
簡介
官方定義 Spring Cloud Stream 是一個構建消息驅動微服務的框架。
簡單來說,它就是用來與消息中間件進行交互的,我們不需要直接對消息中間件進行操作,而是通過Spring Cloud Stream,從而簡化了對中間件的操作,並進行了解耦(想要更換消息中間件時,無需更改代碼)。
應用程序通過 inputs 或者 outputs 來與 Spring Cloud Stream 中binder 交互,而 Spring Cloud Stream 的 binder 負責與中間件交互。
所以,我們只需要搞清楚如何與 Spring Cloud Stream 交互就可以方便使用消息驅動的方式。最大的好處莫過於對中間件的再次封裝,可以做到代碼層面對消息中間件的無感知,甚至於動態的切換中間件。
目前Stream只提供了RabiitMq和Kafka的binder,若要使用其他的消息中間件,需要自己自定義binder。
基本使用
消費者
1.新建一個項目, micro-service1用於接收消息,作爲eureka client,增加mq,stream-mq的maven,修改相關配置等不再累述,與之前一樣
2.定義一個接口,將input綁定名爲"input"的消息通道
public interface Receiver {
//消息通道名稱
String INPUT = "input";
//綁定可訂閱的通道
@Input(INPUT)
SubscribableChannel input();
}
3.定義Stream接收類
@Component
//@EnableBinding註解可以接收一個或多個接口類作爲對象
// 聲明綁定的消息通到,實現與消息代理的連接
@EnableBinding(Receiver.class)
@Log4j2
public class StreamReceiver {
//監聽binding的input
@StreamListener(Receiver.INPUT)
//message爲接收到信息消息
public void input(Message<String> message){
log.info("StreamReceiver: {}", message.getPayload());
}
}
啓動,默認是會創建一個臨時隊列,臨時隊列綁定的exchange爲 “input”
所有發送 exchange 爲“input” 的MQ消息都會被投遞到這個臨時隊列,並通過上述方法接收。
以上代碼就完成了最基本的消費者部分。
生產者
1.新建一個項目, micro-service2用於發送消息,具體步驟步驟累述
2.定義一個接口,,將output綁定名爲"input"的消息通道
public interface Sender {
//消息通道名稱
String OUTPUT = "input";
@Output(OUTPUT)
MessageChannel output();
}
3.定義Stream發送類Controller
@RestController
@EnableBinding(Sender.class)
@Log4j2
public class SendController {
@Autowired
@Qualifier(Sender.OUTPUT)
MessageChannel output;
@GetMapping("send")
public void send(){
String message = "Hello! I am Stream Message!";
log.info("發送Stream消息: {}",message);
output.send(MessageBuilder.withPayload(message).build());
}
}
以上代碼就完成了最基本的消費者部分。
啓動後,調用/send
接口,可看到收發消息成功的日誌
消息分組
當消費者集羣部署時,它們當中應當只有一個能接受到消息。但按照現在的配置,每個消費者都能收到消息,我們來看看。
1.啓動兩個micro-service1,設置不同接口
2.調用/send
接口,兩個應用均能收到消息
顯然這是不合理,這裏就需要用到消息分組
3.在micro-service1應用中添加Stream分組配置
cloud:
stream:
bindings:
#爲input消息通道添加分組
input:
group: testGroup
4.啓動兩個micro-service1,調用/send
接口。現在,發送一條信息,只能在其中一個應用中接收到消息,兩個應用輪訓接收。
Spring Cloud Stream的簡單使用講解就到這裏了,下期再見啦~
如果覺得不錯,分享給你的朋友!
THANDKS
- End -
一個立志成大腿而每天努力奮鬥的年輕人
伴學習伴成長,成長之路你並不孤單!