關於SpringCloud Bus RemoteApplicationEvent 使用注意事項
阿新 • • 發佈:2022-02-17
最近使用SpringCloud Bus 用於服務直接訊息通訊,遇到一些問題,記錄下來給一樣碰到問題的你一個解決方案
開發環境 :
- springboot 2.3.9.RELEASE
- spring-cloud-alibaba-starters 2.2.5.RELEASE
- rabbitmq
問題一:訊息publishEvent出去,監聽服務收不到訊息
-
監聽服務的類沒有注入到spring容器中,未加RemoteApplicationEventScan註解掃描自定義的Event物件,配置加入以下即可
-
訊息傳送的時候originService傳入的服務id和springcloud bus的不一致
在spring-cloud-bus包中的BusAutoConfiguration配置資訊可以看到,傳送訊息時會匹配serviceId,配置一致才傳送,而預設情況下bus會自動生成一個serviceId,如果我們傳送的時候用的是自己隨便定義的id,則無法傳送訊息。
建議在配置檔案中配置busId,然後從BusProperties類中獲取。這樣就保證了二者一致
獲取配置的bus id
-
訊息傳送者和接收者的rabbitmq訊息序列化配置不一致
預設情況下,rabbitmq有自己的訊息序列化規則,由於我在訊息傳送服務配置過rabbitmq的序列化為json格式,但是接收服務沒有使用的預設的格式,導致訊息發出去之後,接收服務無法正確反序列化,導致訊息消費失敗。所以要麼就都不配置,要麼所有服務都配置
問題二:訊息傳送成功,監聽服務也收到訊息,但是Event的source欄位為空。
這個問題困擾了我很久,明明source欄位傳了值,但是別的服務就是拿不到,而且傳送服務自己建立監聽服務,是能拿到的。經過查詢離職發現,RemoteApplicationEvent的煩序列化的時候忽略了source,也就是說就算你傳值了,也不會處理,可能是怕使用者傳的資料大?
解決辦法,自定義Event的時候可以自定義引數進行傳值。
結果如下,是可以拿到引數的