🏆🏆🏆教程全知識點簡介:微服務保護、服務異步通信、消息中間件部署、分佈式事務、搜索引擎、緩存、數據同步以及相關組件的安裝配置等技術要點。在微服務保護方面,介紹了 Sentinel 的基礎知識,包括雪崩問題、超時處理、艙壁模式、斷路器機制,以及不同服務保護技術的對比;講解了流量控制(簇點鏈路、流控模式、熱點參數限流)、隔離與降級(FeignClient 整合 Sentinel、線程隔離)、授權規則(自定義異常結果)及規則持久化(規則管理模式與 pull 模式),並演示了基於 Nacos 的規則持久化改造。服務異步通信部分探討了消息可靠性(生產者消息確認、Return 回調、ConfirmCallback)、死信交換機、TTL 隊列等高級應用。RabbitMQ 部署指南涵蓋了單機部署、DelayExchange 插件安裝、集羣部署、鏡像模式等內容。分佈式事務部分介紹了 CAP 定理、BASE 理論、常見解決方案,Seata 的基礎與部署(TC 服務部署、Nacos 配置、數據庫表創建)、多種事務模式(XA 模式及優缺點、四種模式對比)和高可用架構。分佈式搜索引擎章節講解了 Elasticsearch 的原理(ELK 技術棧、倒排索引)、索引庫與文檔操作、RestAPI 與 RestClient 的使用、排序與高亮、酒店搜索案例(分頁、競價排名、廣告標記、算分函數)、自動補全、數據同步(同步調用、監聽 binlog)、集羣搭建與腦裂問題、分片存儲測試,以及單點 ES、Kibana、IK 分詞器安裝。緩存部分介紹了 Redis 持久化(RDB 與 AOF 對比)、單機安裝 Redis、Redis 集羣、多級緩存(JVM 進程緩存、Caffeine)、請求參數處理、Tomcat 查詢、HTTP 工具與 CJSON 工具類、Redis 緩存查詢。數據同步與網關部分包括 Canal 安裝(開啓 MySQL 主從、設置權限)、OpenResty 安裝(開發庫、目錄結構、環境變量配置)及運行流程。
<!-- start:bj1 -->
📚📚👉👉👉 https://gitee.com/xiaoshuai112/Backend/blob/master/Spring/Spr... 🍅🍅
<!-- end:bj1 -->
✨ 本教程項目亮點
🧠 知識體系完整:覆蓋從基礎原理、核心方法到高階應用的全流程內容
💻 全技術鏈覆蓋:完整前後端技術棧,涵蓋開發必備技能
🚀 從零到實戰:適合 0 基礎入門到提升,循序漸進掌握核心能力
📚 豐富文檔與代碼示例:涵蓋多種場景,可運行、可複用
🛠 工作與學習雙參考:不僅適合系統化學習,更可作為日常開發中的查閲手冊
🧩 模塊化知識結構:按知識點分章節,便於快速定位和複習
📈 長期可用的技術積累:不止一次學習,而是能伴隨工作與項目長期參考
🎯🎯🎯全教程總章節
🚀🚀🚀本篇主要內容
4.授權規則
授權規則可以對請求方來源做判斷和控制。
4.1.授權規則
4.1.1.基本規則
授權規則可以對調用方的來源做控制,有白名單和黑名單兩種方式。
- 白名單:來源(origin)在白名單內的調用者允許訪問
- 黑名單:來源(origin)在黑名單內的調用者不允許訪問
點擊左側菜單的授權,可以看到授權規則:
- 資源名:就是受保護的資源,例如/order/{orderId}
-
流控應用:是來源者的名單,
- 如果是勾選白名單,則名單中的來源被許可訪問。
- 如果是勾選黑名單,則名單中的來源被禁止訪問。
比如:
我們允許請求從gateway到order-service,不允許瀏覽器訪問order-service,那麼白名單中就要填寫網關的來源名稱(origin)。
4.1.2.如何獲取origin
Sentinel是通過RequestOriginParser這個接口的parseOrigin來獲取請求的來源的。
public interface RequestOriginParser {
/**
* 從請求request對象中獲取origin,獲取方式自定義
*/
String parseOrigin(HttpServletRequest request);
}
這個方法的作用就是從request對象中,獲取請求者的origin值並返回。
默認情況下,sentinel不管請求者從哪裏來,返回值永遠是default,也就是説一切請求的來源都被認為是一樣的值default。
因此,我們需要自定義這個接口的實現,讓不同的請求,返回不同的origin。
例如order-service服務中,我們定義一個RequestOriginParser的實現類:
package cn.itcast.order.sentinel;
import com.alibaba.csp.sentinel.adapter.spring.webmvc.callback.RequestOriginParser;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
import javax.servlet.http.HttpServletRequest;
@Component
public class HeaderOriginParser implements RequestOriginParser {
@Override
public String parseOrigin(HttpServletRequest request) {
// 1.獲取請求頭
String origin = request.getHeader("origin");
// 2.非空判斷
if (StringUtils.isEmpty(origin)) {
origin = "blank";
}
return origin;
}
}
我們會嘗試從request-header中獲取origin值。
4.1.3.給網關添加請求頭
既然獲取請求origin的方式是從reques-header中獲取origin值,我們必須讓所有從gateway路由到微服務的請求都帶上origin頭。
這個需要利用之前學習的一個GatewayFilter來實現,AddRequestHeaderGatewayFilter。
修改gateway服務中的application.yml,添加一個defaultFilter:
spring:
cloud:
gateway:
default-filters:
- AddRequestHeader=origin,gateway
routes:
# ...略
這樣,從gateway路由的所有請求都會帶上origin頭,值為gateway。而從其它地方到達微服務的請求則沒有這個頭。
4.1.4.配置授權規則
接下來,我們添加一個授權規則,放行origin值為gateway的請求。
配置如下:
現在,我們直接跳過網關,訪問order-service服務:
通過網關訪問:
4.2.自定義異常結果
默認情況下,發生限流、降級、授權攔截時,都會拋出異常到調用方。異常結果都是flow limmiting(限流)。這樣不夠友好,無法得知是限流還是降級還是授權攔截。
4.2.1.異常類型
而如果要自定義異常時的返回結果,需要實現BlockExceptionHandler接口:
public interface BlockExceptionHandler {
/**
* 處理請求被限流、降級、授權攔截時拋出的異常:BlockException
*/
void handle(HttpServletRequest request, HttpServletResponse response, BlockException e) throws Exception;
}
這個方法有三個參數:
- HttpServletRequest request:request對象
- HttpServletResponse response:response對象
- BlockException e:被sentinel攔截時拋出的異常
這裏的BlockException包含多個不同的子類:
| 異常 | 説明 |
|---|---|
| FlowException | 限流異常 |
5.規則持久化
現在,sentinel的所有規則都是內存存儲,重啓後所有規則都會丟失。在生產環境下,我們必須確保這些規則的持久化,避免丟失。
5.1.規則管理模式
規則是否能持久化,取決於規則管理模式,sentinel支持三種規則管理模式:
- 原始模式:Sentinel的默認模式,將規則保存在內存,重啓服務會丟失。
- pull模式
- push模式
5.1.1.pull模式
pull模式:控制枱將配置的規則推送到Sentinel客户端,而客户端會將配置規則保存在本地文件或數據庫中。以後會定時去本地文件或數據庫中查詢,更新本地規則。
5.1.2.push模式
push模式:控制枱將配置規則推送到遠程配置中心,例如Nacos。Sentinel客户端監聽Nacos,獲取配置變更的推送消息,完成本地配置更新。
5.2.實現push模式
詳細步驟可以參考課前資料的《sentinel規則持久化》:
Jmeter快速入門
1.安裝Jmeter
Jmeter依賴於JDK,所以必須確保當前計算機上已經安裝了JDK,並且配置了環境變量。
1.1.下載
可以Apache Jmeter官網下載,地址:http://jmeter.apache.org/download_jmeter.cgi
當然,我們課前資料也提供了下載好的安裝包:
1.2.解壓
因為下載的是zip包,解壓縮即可使用,目錄結構如下:
其中的bin目錄就是執行的腳本,其中包含啓動腳本:
1.3.運行
雙擊即可運行,但是有兩點注意:
- 啓動速度比較慢,要耐心等待
- 啓動後黑窗口不能關閉,否則Jmeter也跟着關閉了
2.快速入門
2.1.設置中文語言
默認Jmeter的語言是英文,需要設置:
效果:
注意:上面的配置只能保證本次運行是中文,如果要永久中文,需要修改Jmeter的配置文件
打開jmeter文件夾,在bin目錄中找到 jmeter.properties,添加下面配置:
language=zh_CN
注意:前面不要出現#,#代表註釋,另外這裏是下劃線,不是中劃線
2.2.基本用法
在測試計劃上點鼠標右鍵,選擇添加 > 線程(用户) > 線程組:
在新增的線程組中,填寫線程信息:
給線程組點鼠標右鍵,添加http取樣器:
編寫取樣器內容:
添加監聽報告:
添加監聽結果樹:
彙總報告結果:
結果樹:
Sentinel 規則持久化
一、修改order-service服務
修改OrderService,讓其監聽Nacos中的sentinel規則配置。
具體步驟如下:
1.引入依賴
在order-service中引入sentinel監聽nacos的依賴:
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-datasource-nacos</artifactId>
</dependency>
2.配置nacos地址
在order-service中的application.yml文件配置nacos地址及監聽的配置信息:
spring:
cloud:
sentinel:
datasource:
flow:
nacos:
server-addr: localhost:8848 # nacos地址
dataId: orderservice-flow-rules
groupId: SENTINEL_GROUP
rule-type: flow # 還可以是:degrade、authority、param-flow
二、修改sentinel-dashboard源碼
SentinelDashboard默認不支持nacos的持久化,需要修改源碼。
1. 解壓
解壓課前資料中的sentinel源碼包:
然後並用IDEA打開這個項目,結構如下:
2. 修改nacos依賴
在sentinel-dashboard源碼的pom文件中,nacos的依賴默認的scope是test,只能在測試時使用,這裏要去除:
將sentinel-datasource-nacos依賴的scope去掉:
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-datasource-nacos</artifactId>
</dependency>
3. 添加nacos支持
在sentinel-dashboard的test包下,已經編寫了對nacos的支持,我們需要將其拷貝到main下。
4. 修改nacos地址
然後,還需要修改測試代碼中的NacosConfig類:
修改其中的nacos地址,讓其讀取application.properties中的配置:
在sentinel-dashboard的application.properties中添加nacos地址配置:
nacos.addr=localhost:8848
5. 配置nacos數據源
另外,還需要修改com.alibaba.csp.sentinel.dashboard.controller.v2包下的FlowControllerV2類:
讓我們添加的Nacos數據源生效:
6. 修改前端頁面
接下來,還要修改前端頁面,添加一個支持nacos的菜單。
修改src/main/webapp/resources/app/scripts/directives/sidebar/目錄下的sidebar.html文件:
將其中的這部分註釋打開:
修改其中的文本: