概念
Spring Cloud Stream是構(gòu)建消息驅(qū)動(dòng)的微服務(wù)應(yīng)用程序的框架。Spring Cloud Stream基于Spring Boot建立獨(dú)立的生產(chǎn)級(jí)Spring應(yīng)用程序溃论,并使用Spring Integration提供與消息代理的連接沐飘。它提供了來自幾家供應(yīng)商的中間件的意見配置足淆,介紹了持久發(fā)布訂閱語義,消費(fèi)者組和分區(qū)的概念。
用途
為消息中間件提供統(tǒng)一管理通道除呵,便于靈活更替再菊,接入
參考資料
http://www.reibang.com/p/bf992c23c381
https://blog.csdn.net/lzwglory/article/details/78295343
基礎(chǔ)知識(shí)
資料:https://blog.csdn.net/weixin_38399962/article/details/82192340
Middleware未RocketMQ RabbitMQ等中間件
編碼流程
開啟Middleware(Kafka)
創(chuàng)建通道并與Binder綁定(@EnableBinding)
編寫操作通道的代碼
在配置文件上配置目的地,組颜曾,Middleware的地址纠拔,端口等等
問題
坑1.stream生成的exchang默認(rèn)是topic模式。就是按照前綴匹配泛豪,發(fā)送消息給對(duì)應(yīng)的隊(duì)列
坑2.默認(rèn)消息異常之后诡曙,都會(huì)往死消息隊(duì)列里面寫臀叙,然而異常是放到一個(gè)header里面去的。默認(rèn)消息隊(duì)列支持的最大frame_max 是128kb,超過這個(gè)大小价卤,服務(wù)器就主動(dòng)給你關(guān)閉連接劝萤,然后把你的消息會(huì)不斷的重試
坑3.看到國內(nèi)好多博客,使用@Input和@output都是用MessageChannel慎璧,這是不對(duì)的稳其。@Output對(duì)MessageChannel,@Input對(duì)應(yīng)SubscribableChannel 炸卑。切記!
坑4.我使用的stream版本是1.2.1既鞠,springboot版本時(shí)1.5.6。沒有辦法使用routingkey屬性盖文,即在spring.cloud.stream.rabbit這個(gè)屬性無法顯示嘱蛋。應(yīng)該是我的stream版本偏低吧。遇到這種情況五续,大家果斷換新版本洒敏,或者使用自帶的ampq來實(shí)現(xiàn)吧
坑5.instanceName設(shè)置問題
instanceName為區(qū)分集群機(jī)器使用,假設(shè)不設(shè)置采用默認(rèn)疙驾,集群時(shí)效會(huì)發(fā)到同一臺(tái)機(jī)器
具體解釋:
默認(rèn)情況下不需要設(shè)置instanceName凶伙,rocketmq會(huì)使用ip@pid(pid代表jvm名字)作為唯一標(biāo)示
如果同一個(gè)jvm中,不同的producer需要往不同的rocketmq集群發(fā)送消息它碎,需要設(shè)置不同的instanceName
原因如下:如果不設(shè)置instanceName函荣,那么會(huì)使用ip@pid作為producer唯一標(biāo)識(shí),那么會(huì)導(dǎo)致多個(gè)producer內(nèi)部只有一個(gè)MQClientInstance(與mq交互)實(shí)例扳肛,從而導(dǎo)致只往一個(gè)集群發(fā)消息傻挂。