最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Spring?Cloud?Sentinel快速入門步驟

 更新時間:2025年11月25日 10:10:52   作者:ruleslol  
本文介紹了Sentinel,一個用于企業(yè)級微服務(wù)開發(fā)的流量控制、熔斷降級和系統(tǒng)負(fù)載保護(hù)的組件,Sentinel的核心概念包括資源、規(guī)則和SlotChain,其三大核心功能分別是流量控制、熔斷降級和系統(tǒng)保護(hù),感興趣的朋友跟隨小編一起看看吧

在企業(yè)級微服務(wù)開發(fā)中,Sentinel 解決的是系統(tǒng)穩(wěn)定性問題。

一、Sentinel 核心概念與目標(biāo)

Sentinel(分布式系統(tǒng)的流量防衛(wèi)兵)是阿里巴巴開源的一套面向分布式服務(wù)架構(gòu)的流量控制、熔斷降級、系統(tǒng)負(fù)載保護(hù)的組件。

它的核心目的是保護(hù)應(yīng)用,確保服務(wù)在面對高并發(fā)、突發(fā)流量或依賴服務(wù)不可用時,仍能保持高可用性穩(wěn)定性,避免因局部故障導(dǎo)致整個系統(tǒng)雪崩。

1-1. 核心概念

概念描述作用
資源 (Resource)Sentinel 中最核心的概念。可以是任何您希望保護(hù)的代碼塊、服務(wù)、方法、接口等。用唯一名稱標(biāo)識。定義流量防護(hù)的目標(biāo)。
規(guī)則 (Rule)為資源定義的具體保護(hù)措施,如流量閾值、降級策略等。定義如何保護(hù)資源(限流、降級、系統(tǒng)保護(hù))。
Slot ChainSentinel 的核心處理鏈。當(dāng)請求流經(jīng)資源時,會依次經(jīng)過統(tǒng)計(jì)、限流、熔斷等各個 Slot(插槽)進(jìn)行處理。Sentinel 工作的底層機(jī)制。

1-2、流量防護(hù)三大核心功能:

Sentinel 提供了三大保護(hù)功能,都基于對資源的實(shí)時統(tǒng)計(jì)。

1. ?? 流量控制 (Flow Control)

這是 Sentinel 最基本也是最重要的功能,目的是控制對資源的請求速度,確保其不超過系統(tǒng)的處理能力。

  • 指標(biāo): 通常基于 QPS(每秒查詢數(shù))并發(fā)線程數(shù)。
  • 示例規(guī)則: 資源 getProductInfo 的 QPS 閾值為 200,當(dāng)超過 200 QPS 時,后續(xù)請求將被拒絕(默認(rèn)是 FailFast 策略)。

2. ? 熔斷降級 (Degrade)

當(dāng)依賴的資源或服務(wù)不穩(wěn)定(響應(yīng)慢或失敗率高)時,Sentinel 會自動切斷調(diào)用(熔斷),讓請求快速失敗,而不是繼續(xù)堆積,避免拖垮自身服務(wù)。

  • 策略:
    • 慢調(diào)用比例 (RT): 當(dāng)資源的平均響應(yīng)時間(RT)超過某個閾值,并且請求量也達(dá)到一定值時,觸發(fā)熔斷。
    • 異常比例: 當(dāng)資源的異常請求比例達(dá)到閾值時,觸發(fā)熔斷。
    • 異常數(shù): 在一個時間窗口內(nèi),異常請求總數(shù)達(dá)到閾值時,觸發(fā)熔斷。
  • 熔斷器狀態(tài): 正常 -> 打開 (Open) -> 半開 (Half-Open) -> 正常。熔斷打開后,在設(shè)定的恢復(fù)時間窗后進(jìn)入半開狀態(tài)嘗試放行少量請求。

3. ??? 系統(tǒng)保護(hù) (System Protection)

整個系統(tǒng)的維度進(jìn)行負(fù)載保護(hù),而不是針對單個資源。它基于系統(tǒng)的整體負(fù)載指標(biāo)(如 CPU 利用率、系統(tǒng) Load、平均 RT 等)進(jìn)行判斷和限流。

  • 作用: 防止系統(tǒng)壓力過大時,雪崩式地拒絕所有請求,保護(hù)核心業(yè)務(wù),同時保證非核心業(yè)務(wù)的快速失敗。

二、Sentinel 快速入門步驟(基于 Spring Cloud/SpringBoot)

步驟一:部署 Sentinel Dashboard (TC)

Sentinel 的規(guī)則和監(jiān)控信息通常通過控制臺(Dashboard)來配置和查看。

  • 下載: 從 Sentinel GitHub 或 Maven Central 下載最新的sentinel-dashboard.jar。
  • 啟動: 運(yùn)行 Dashboard。默認(rèn)端口是 8080。
  • java -Dserver.port=8080 -Dcsp.sentinel.dashboard.server=localhost:8080 -jar sentinel-dashboard.jar
  • 訪問: 瀏覽器訪問 http://localhost:8080,默認(rèn)賬號/密碼是 sentinel/sentinel。

步驟二:集成到業(yè)務(wù)微服務(wù)

引入依賴: 在需要進(jìn)行流量防護(hù)的微服務(wù)中引入 Sentinel 依賴(推薦使用 Spring Cloud Alibaba 提供的 starter)。

<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>

配置客戶端:application.propertiesapplication.yml 中配置服務(wù)名和 Dashboard 地址。

# application.yml
spring:
  application:
    name: your-service-name
# 配置 Sentinel Dashboard 地址
cloud:
  sentinel:
    transport:
      dashboard: localhost:8080

定義資源 (Resource):

import com.alibaba.csp.sentinel.annotation.SentinelResource;
@Service
public class OrderService {
    // 使用 @SentinelResource 保護(hù)方法
    @SentinelResource(value = "createOrder", 
                      blockHandler = "handleBlock", // 違背限流/降級規(guī)則時調(diào)用的方法
                      fallback = "handleFallback") // 業(yè)務(wù)異常時調(diào)用的方法
    public String createOrder(String userId) {
        // 核心業(yè)務(wù)邏輯
        return "Order created successfully";
    }
    // 限流或降級時的處理邏輯(參數(shù)要匹配原方法)
    public String handleBlock(String userId, BlockException ex) {
        System.out.println("Blocked by Sentinel: " + ex.getMessage());
        return "System busy, please try later.";
    }
    // 業(yè)務(wù)異常時的處理邏輯(Throwable 參數(shù))
    public String handleFallback(String userId, Throwable ex) {
        System.out.println("Service logic error: " + ex.getMessage());
        return "Internal error occurred.";
    }
}
  • 自動定義 (Automatic): Sentinel 會自動將 HTTP 接口、Feign 客戶端調(diào)用、Dubbo 接口等識別為資源。
  • 手動定義 (Manual): 使用 @SentinelResource注解來保護(hù)您代碼中的關(guān)鍵業(yè)務(wù)邏輯。
  • 配置規(guī)則:
    • 啟動您的微服務(wù)并調(diào)用幾次被 @SentinelResource 保護(hù)的方法。(懶加載
    • 登錄 Sentinel Dashboard,在左側(cè)菜單找到您的服務(wù)。
    • 進(jìn)入 簇點(diǎn)鏈路 找到您定義的資源(如 createOrder),然后點(diǎn)擊右側(cè)的 新增限流新增降級 規(guī)則。
  • 例如: 設(shè)置 createOrderQPS 閾值 為 10,流控模式快速失敗 (Fail Fast)。

企業(yè)級最佳實(shí)踐

  • 持久化規(guī)則: Dashboard 配置的規(guī)則默認(rèn)只存在內(nèi)存中,重啟后丟失。企業(yè)級應(yīng)用必須將規(guī)則持久化到配置中心(如 Nacos、Apollo),以確保規(guī)則的動態(tài)性持久性。
  • 區(qū)分降級和限流處理:
    • blockHandler:處理 Sentinel 規(guī)則 導(dǎo)致的異常(限流、降級、系統(tǒng)保護(hù))。
    • fallback:處理 業(yè)務(wù)代碼 執(zhí)行時拋出的異常(如數(shù)據(jù)庫連接失敗、空指針等)。
  • 統(tǒng)一入口: 對外部提供的 API Gateway 接口是最重要的限流資源,應(yīng)優(yōu)先配置保護(hù)。

三、@SentinelResource一般是加在哪里?

@SentinelResource 是Sentinel的限流降級注解。

3-1、加在哪里

1. Service層方法(最常見)

@Service
public class OrderService {
    @SentinelResource(
        value = "createOrder",
        blockHandler = "handleCreateOrderBlock",
        fallback = "createOrderFallback"
    )
    public Order createOrder(Order order) {
        // 業(yè)務(wù)邏輯
        return orderMapper.insert(order);
    }
    // 處理限流(BlockException)
    public Order handleCreateOrderBlock(Order order, BlockException e) {
        log.warn("訂單創(chuàng)建被限流了");
        return null;
    }
    // 處理熔斷降級(業(yè)務(wù)異常)
    public Order createOrderFallback(Order order, Throwable e) {
        log.warn("訂單創(chuàng)建失敗,執(zhí)行降級方案");
        return new Order();  // 返回默認(rèn)值
    }
}

2. Controller層方法

@RestController
@RequestMapping("/api/orders")
public class OrderController {
    @Autowired
    private OrderService orderService;
    @PostMapping
    @SentinelResource(
        value = "createOrderApi",
        blockHandler = "handleBlock"
    )
    public ApiResponse<Order> createOrder(@RequestBody Order order) {
        Order result = orderService.createOrder(order);
        return ApiResponse.success(result);
    }
    public ApiResponse<Order> handleBlock(Order order, BlockException e) {
        return ApiResponse.fail("系統(tǒng)繁忙,請稍后再試");
    }
}

3. Feign客戶端方法

@FeignClient(name = "stock-service", fallback = StockServiceFallback.class)
public interface StockServiceClient {
    @PostMapping("/api/stock/deduct")
    @SentinelResource(
        value = "deductStock",
        fallback = "deductStockFallback"
    )
    Stock deductStock(@RequestParam Long productId, @RequestParam Integer quantity);
    default Stock deductStockFallback(Long productId, Integer quantity) {
        log.warn("庫存服務(wù)調(diào)用失敗,執(zhí)行降級");
        return new Stock();
    }
}

4. 異步方法

@Service
public class AsyncOrderService {
    @Async
    @SentinelResource(
        value = "asyncProcessOrder",
        blockHandler = "handleAsyncBlock"
    )
    public void processOrderAsync(Order order) {
        // 異步處理邏輯
        doSomeHeavyWork(order);
    }
    public void handleAsyncBlock(Order order, BlockException e) {
        log.warn("異步處理被限流");
    }
}

3-2、一般不加的地方

? 不加在Mapper層

// 錯誤示范
@Mapper
public interface OrderMapper {
    @SentinelResource("selectOrder")  // ? 不要加這兒
    Order selectById(Long id);
}
// 原因:
// 1. Mapper直接操作數(shù)據(jù)庫,沒有業(yè)務(wù)邏輯
// 2. 限流應(yīng)該在業(yè)務(wù)層面
// 3. 多個Service可能調(diào)用同一個Mapper

? 不加在private私有方法

@Service
public class OrderService {
    @SentinelResource("privateMethod")  // ? 不要加
    private void privateMethod() {
        // ...
    }
    // 原因:Sentinel是通過代理實(shí)現(xiàn)的,私有方法代理不了
}

? 不加在構(gòu)造方法

@Service
public class OrderService {
    @SentinelResource("constructor")  // ? 不要加
    public OrderService() {
        // ...
    }
}

? 不加在static方法

@Service
public class OrderService {
    @SentinelResource("staticMethod")  // ? 不要加
    public static void staticMethod() {
        // ...
    }
    // 原因:static方法不能被代理
}

3-3、最佳實(shí)踐

推薦做法:Service + Controller雙層

// ===== Controller層 =====
@RestController
@RequestMapping("/api/orders")
public class OrderController {
    @SentinelResource(
        value = "createOrderApi",  // API級別的限流
        blockHandler = "apiBlockHandler"
    )
    @PostMapping
    public ApiResponse<Order> createOrder(@RequestBody Order order) {
        return ApiResponse.success(orderService.createOrder(order));
    }
    public ApiResponse<Order> apiBlockHandler(Order order, BlockException e) {
        return ApiResponse.fail("API請求過于頻繁");
    }
}
// ===== Service層 =====
@Service
public class OrderService {
    @SentinelResource(
        value = "createOrderService",  // 業(yè)務(wù)級別的限流
        blockHandler = "serviceBlockHandler",
        fallback = "createOrderFallback"
    )
    public Order createOrder(Order order) {
        // 實(shí)際業(yè)務(wù)邏輯
        return orderMapper.insert(order);
    }
    public Order serviceBlockHandler(Order order, BlockException e) {
        return null;  // 限流處理
    }
    public Order createOrderFallback(Order order, Throwable e) {
        return new Order();  // 降級處理
    }
}

為什么雙層?

用戶請求
    ↓
Controller層(@SentinelResource)
    ├─ 控制HTTP請求的流量
    ├─ 返回友好的錯誤信息
    └─ 保護(hù)系統(tǒng)入口
    ↓
Service層(@SentinelResource)
    ├─ 控制業(yè)務(wù)操作的流量
    ├─ 保護(hù)核心業(yè)務(wù)邏輯
    └─ 其他Service也可能調(diào)用

3-4、@SentinelResource 注解參數(shù)說明

@SentinelResource(
    value = "createOrder",              // 資源名,必需
    blockHandler = "handleBlock",       // 限流/降級時的處理方法
    blockHandlerClass = BlockHandlers.class,  // 指定外部類
    fallback = "fallbackMethod",        // 業(yè)務(wù)異常時的降級方法
    fallbackClass = FallbackMethods.class,    // 指定外部類
    exceptionsToIgnore = {IOException.class}  // 忽略的異常
)
public Order createOrder(Order order) {
    // ...
}

3-5、常見場景總結(jié)

場景位置用途
保護(hù)HTTP接口Controller限制請求頻率
保護(hù)業(yè)務(wù)方法Service限制業(yè)務(wù)操作
遠(yuǎn)程調(diào)用降級Feign客戶端調(diào)用失敗降級
異步任務(wù)保護(hù)@Async方法限制異步線程
定時任務(wù)保護(hù)@Scheduled方法限制定時任務(wù)

簡單總結(jié):加在Service和Controller的public業(yè)務(wù)方法上,不要加在Mapper、私有方法、static方法。

到此這篇關(guān)于Spring Cloud Sentinel入門講解的文章就介紹到這了,更多相關(guān)Spring Cloud Sentinel入門內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • shiro與spring?security用自定義異常處理401錯誤

    shiro與spring?security用自定義異常處理401錯誤

    這篇文章主要介紹了shiro與spring?security用自定義異常處理401錯誤,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • Spring Cloud zuul自定義統(tǒng)一異常處理實(shí)現(xiàn)方法

    Spring Cloud zuul自定義統(tǒng)一異常處理實(shí)現(xiàn)方法

    這篇文章主要介紹了Spring Cloud zuul自定義統(tǒng)一異常處理實(shí)現(xiàn),需要的朋友可以參考下
    2018-02-02
  • 基于@Value注解和@ConfigurationProperities注解的區(qū)別及說明

    基于@Value注解和@ConfigurationProperities注解的區(qū)別及說明

    本文主要介紹了Spring?Boot中三種配置屬性的注入方式:@Value、Environment對象和@ConfigurationProperties,通過這些方式,可以方便地將配置文件中的屬性值綁定到Spring管理的Bean對象的屬性上,從而實(shí)現(xiàn)配置信息的動態(tài)加載
    2026-03-03
  • idea創(chuàng)建springboot項(xiàng)目,Application.java不能運(yùn)行問題及解決

    idea創(chuàng)建springboot項(xiàng)目,Application.java不能運(yùn)行問題及解決

    這篇文章主要介紹了idea創(chuàng)建springboot項(xiàng)目,Application.java不能運(yùn)行問題及解決方案,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-11-11
  • maven插件maven-assembly-plugin打包歸納文件zip/tar使用

    maven插件maven-assembly-plugin打包歸納文件zip/tar使用

    java項(xiàng)目運(yùn)行的文件需要jar或者war格式,同時還需要使用Java命令,本文主要介紹了maven插件maven-assembly-plugin打包歸納文件zip/tar使用,具有一定的參考價值,感興趣的可以了解一下
    2024-02-02
  • JAVA SPI機(jī)制詳解使用方法

    JAVA SPI機(jī)制詳解使用方法

    Java定義了一套JDBC的接口,但并未提供具體實(shí)現(xiàn)類,而是在不同云廠商提供的數(shù)據(jù)庫實(shí)現(xiàn)包。這篇文章給大家介紹Java的SPI機(jī)制,感興趣的朋友一起看看吧
    2022-07-07
  • 登陸驗(yàn)證碼kaptcha結(jié)合spring boot的用法詳解

    登陸驗(yàn)證碼kaptcha結(jié)合spring boot的用法詳解

    在一個web應(yīng)用中驗(yàn)證碼是一個常見的元素。不管是防止機(jī)器人還是爬蟲都有一定的作用,下面這篇文章主要給大家介紹了登陸驗(yàn)證碼kaptcha結(jié)合spring boot用法的相關(guān)資料,需要的朋友可以參考借鑒,下面來一起看看吧。
    2017-06-06
  • 修改request的parameter的幾種方式總結(jié)

    修改request的parameter的幾種方式總結(jié)

    這篇文章主要介紹了修改request的parameter的幾種方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • 詳解Spring整合mybatis--Spring中的事務(wù)管理(xml形式)

    詳解Spring整合mybatis--Spring中的事務(wù)管理(xml形式)

    這篇文章主要介紹了Spring整合mybatis--Spring中的事務(wù)管理(xml形式),本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-11-11
  • 詳解Java中自定義注解的使用

    詳解Java中自定義注解的使用

    Annontation是Java5開始引入的新特征,中文名稱叫注解,它提供了一種安全的類似注釋的機(jī)制,用來將任何的信息或元數(shù)據(jù)(metadata)與程序元素(類、方法、成員變量等)進(jìn)行關(guān)聯(lián)。本文主要介紹了自定義注解的使用,希望對大家有所幫助
    2023-03-03

最新評論

贵溪市| 黔西县| 咸阳市| 嘉峪关市| 峨眉山市| 大丰市| 襄樊市| 景宁| 阜阳市| 石河子市| 宁河县| 舞阳县| 曲阳县| 玛多县| 同德县| 清丰县| 温泉县| 崇礼县| 辛集市| 随州市| 周口市| 调兵山市| 天津市| 临猗县| 江津市| 延吉市| 会理县| 宜阳县| 曲阜市| 吉林市| 沾化县| 乌恰县| 民丰县| 刚察县| 东海县| 东平县| 沂南县| 炉霍县| 福安市| 内黄县| 铁力市|