动态

详情 返回 返回

【Spring開發】SpringCloud服務端高級框架第3篇:4.授權規則,5.規則持久化【附代碼文檔】 - 动态 详情

🏆🏆🏆教程全知識點簡介:微服務保護、服務異步通信、消息中間件部署、分佈式事務、搜索引擎、緩存、數據同步以及相關組件的安裝配置等技術要點。在微服務保護方面,介紹了 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的實現類:

Apache Commons IO

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:
       # ...略

Tinylog 文檔

這樣,從gateway路由的所有請求都會帶上origin頭,值為gateway。而從其它地方到達微服務的請求則沒有這個頭。

4.1.4.配置授權規則

接下來,我們添加一個授權規則,放行origin值為gateway的請求。

配置如下:

現在,我們直接跳過網關,訪問order-service服務:

通過網關訪問:

Spring Framework 官方文檔

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,獲取配置變更的推送消息,完成本地配置更新。

OkHttp 文檔

5.2.實現push模式

詳細步驟可以參考課前資料的《sentinel規則持久化》:

Jmeter快速入門

Mkyong Java 教程

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

注意:前面不要出現#,#代表註釋,另外這裏是下劃線,不是中劃線

Spring Boot Test 文檔

2.2.基本用法

在測試計劃上點鼠標右鍵,選擇添加 > 線程(用户) > 線程組:

在新增的線程組中,填寫線程信息:

給線程組點鼠標右鍵,添加http取樣器:

編寫取樣器內容:

添加監聽報告:

添加監聽結果樹:

彙總報告結果:

結果樹:

Sentinel 規則持久化

Error Prone 文檔

一、修改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>

JOOQ 文檔

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文件:

將其中的這部分註釋打開:

修改其中的文本:

7. 重新編

Add a new 评论

Some HTML is okay.