🏆🏆🏆教程全知識點簡介:微服務保護、服務異步通信、消息中間件部署、分佈式事務、搜索引擎、緩存、數據同步以及相關組件的安裝配置等技術要點。在微服務保護方面,介紹了 Sentinel 的基礎知識,包括雪崩問題、超時處理、艙壁模式、斷路器機制,以及不同服務保護技術的對比;講解了流量控制(簇點鏈路、流控模式、熱點參數限流)、隔離與降級(FeignClient 整合 Sentinel、線程隔離)、授權規則(自定義異常結果)及規則持久化(規則管理模式與 pull 模式),並演示了基於 Nacos 的規則持久化改造。服務異步通信部分探討了消息可靠性(生產者消息確認、Return 回調、ConfirmCallback)、死信交換機、TTL 隊列等高級應用。RabbitMQ 部署指南涵蓋了單機部署、DelayExchange 插件安裝、集羣部署、鏡像模式等內容。分佈式事務部分介紹了 CAP 定理、BASE 理論、常見解決方案,Seata 的基礎與部署(TC 服務部署、Nacos 配置、數據庫表創建)、多種事務模式(XA 模式及優缺點、四種模式對比)和高可用架構。分佈式搜索引擎章節講解了 Elasticsearch 的原理(ELK 技術棧、倒排索引)、索引庫與文檔操作、RestAPI 與 RestClient 的使用、排序與高亮、酒店搜索案例(分頁、競價排名、ad標記、算分函數)、自動補全、數據同步(同步調用、監聽 binlog)、集羣搭建與腦裂問題、分片存儲測試,以及單點 ES、Kibana、IK 分詞器安裝。緩存部分介紹了 Redis 持久化(RDB 與 AOF 對比)、單機安裝 Redis、Redis 集羣、多級緩存(JVM 進程緩存、Caffeine)、請求參數處理、Tomcat 查詢、HTTP 工具與 CJSON 工具類、Redis 緩存查詢。數據同步與網關部分包括 Canal 安裝(開啓 MySQL 主從、設置權限)、OpenResty 安裝(開發庫、目錄結構、環境變量配置)及運行流程。
<!-- start:bj1 -->
📚📚👉👉👉本站這篇博客: https://segmentfault.com/a/1190000047226395 中查看
📚📚👉👉👉本站這篇博客: https://segmentfault.com/a/1190000047225271 中查看
<!-- end:bj1 -->
✨ 本教程項目亮點
🧠 知識體系完整:覆蓋從基礎原理、核心方法到高階應用的全流程內容
💻 全技術鏈覆蓋:完整前後端技術棧,涵蓋開發必備技能
🚀 從零到實戰:適合 0 基礎入門到提升,循序漸進掌握核心能力
📚 豐富文檔與代碼示例:涵蓋多種場景,可運行、可複用
🛠 工作與學習雙參考:不僅適合系統化學習,更可作為日常開發中的查閲手冊
🧩 模塊化知識結構:按知識點分章節,便於快速定位和複習
📈 長期可用的技術積累:不止一次學習,而是能伴隨工作與項目長期參考
🎯🎯🎯全教程總章節
🚀🚀🚀本篇主要內容
服務異步通信-高級篇
消息隊列在使用過程中,面臨着很多實際問題需要思考:
1.消息可靠性
消息從發送,到消費者接收,會經理多個過程:
其中的每一步都可能導致消息丟失,常見的丟失原因包括:
-
發送時丟失:
- 生產者發送的消息未送達exchange
- 消息到達exchange後未到達queue
- MQ宕機,queue將消息丟失
- consumer接收到消息後未消費就宕機
針對這些問題,RabbitMQ分別給出瞭解決方案:
- 生產者確認機制
- mq持久化
- 消費者確認機制
- 失敗重試機制
下面 就通過案例來演示每一個步驟。
首先,導入課前資料提供的demo工程:
項目結構如下:
1.1.生產者消息確認
RabbitMQ提供了publisher confirm機制來避免消息發送到MQ過程中丟失。這種機制必須給每個消息指定一個唯一ID。消息發送到MQ以後,會返回一個結果給發送者,表示消息是否處理成功。
返回結果有兩種方式:
-
publisher-confirm,發送者確認
- 消息成功投遞到交換機,返回ack
- 消息未投遞到交換機,返回nack
-
publisher-return,發送者回執
- 消息投遞到交換機了,但是沒有路由到隊列。返回ACK,及路由失敗原因。
注意:
1.1.1.修改配置
首先,修改publisher服務中的application.yml文件,添加下面的內容:
spring:
rabbitmq:
publisher-confirm-type: correlated
publisher-returns: true
template:
mandatory: true
説明:
-
publish-confirm-type:開啓publisher-confirm,這裏支持兩種類型:simple:同步等待confirm結果,直到超時correlated:異步回調,定義ConfirmCallback,MQ返回結果時會回調這個ConfirmCallback
publish-returns:開啓publish-return功能,同樣是基於callback機制,不過是定義ReturnCallbacktemplate.mandatory:定義消息路由失敗時的策略。true,則調用ReturnCallback;false:則直接丟棄消息
1.1.2.定義Return回調
每個RabbitTemplate只能配置一個ReturnCallback,因此需要在項目加載時配置:
修改publisher服務,添加一個:
package cn.itcast.mq.config;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.context.annotation.Configuration;
@Slf4j
@Configuration
public class CommonConfig implements ApplicationContextAware {
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
// 獲取RabbitTemplate
RabbitTemplate rabbitTemplate = applicationContext.getBean(RabbitTemplate.class);
// 設置ReturnCallback
rabbitTemplate.setReturnCallback((message, replyCode, replyText, exchange, routingKey) -> {
// 投遞失敗,記錄日誌
log.info("消息發送失敗,應答碼{},原因{},交換機{},路由鍵{},消息{}",
replyCode, replyText, exchange, routingKey, message.toString());
// 如果有業務需要,可以重發消息
});
}
}
1.1.3.定義ConfirmCallback
ConfirmCallback可以在發送消息時指定,因為每個業務處理confirm成功或失敗的邏輯不一定相同。
在publisher服務的cn.itcast.mq.spring.SpringAmqpTest類中,定義一個單元測試方法:
public void testSendMessage2SimpleQueue() throws InterruptedException {
// 1.消息體
String message = "hello, spring amqp!";
// 2.全局唯一的消息ID,需要封裝到CorrelationData中
CorrelationData correlationData = new CorrelationData(UUID.randomUUID().toString());
// 3.添加callback
correlationData.getFuture().addCallback(
result -> {
if(result.isAck()){
// 3.1.ack,消息成功
🚀✨ (未完待續)項目系列下一章
📚下一篇 將進入更精彩的環節!
🔔 記得收藏 & 關注,第一時間獲取更新!
🍅 一起見證整個系列逐步成型的全過程。