Sentinel 筆記

Sentinel 筆記

1 介紹

Sentinel 是阿里開源的分布式系統流量防衛組件,專注于 流量控制、熔斷降級、系統保護

官網:https://sentinelguard.io/zh-cn/index.html

wiki:https://github.com/alibaba/Sentinel/wiki

對比同類產品

產品特點
HystrixNetflix 開源,功能全面但已停止維護,基于線程池隔離,資源消耗較大
Resilience4j輕量級,基于函數式編程,但需要結合其他組件實現完整功能
Sentinel輕量級,實時監控和控制,支持動態規則配置,與 Spring Cloud 深度集成

2 架構

在這里插入圖片描述

  • 核心模塊
    • 資源:被保護的代碼邏輯(如接口、方法)。
    • 規則:流量控制、熔斷降級等策略。
    • 控制臺:可視化規則配置與實時監控。

4 環境搭建

4.1 依賴

<!-- Spring Cloud Alibaba Sentinel -->
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>

4.2 啟動控制臺

  1. 下載 Sentinel Dashboard 官方 Release或📎sentinel-dashboard-1.8.8.jar

  2. 啟動命令:

    下載完成后:在文件目錄輸入cmd進入bash命令行

    在命令行窗口輸入:即可啟動項目

 java -jar sentinel-dashboard-1.8.8.jar

3.通過http://localhost:8080即可訪問sentinel的控制臺

在這里插入圖片描述

正常訪問后顯示的界面:
在這里插入圖片描述

4.3 配置連接

application.yml 中配置:

# 訂單以及商品都要配置
spring:cloud:sentinel:transport:dashboard: localhost:8080 # 控制臺地址eager: true # 立即初始化

配置成功后:

在這里插入圖片描述

假設我們要把createOrder注冊為我們要管理的服務。

    @SentinelResource(value = "createOrder")public Order createOrder(Long userId, Long productId) {//Product product = productFeignClient.getProductById(productId);//使用RestTemplate實現負載均衡//Product product = getProductFromRemqteWithLoadBalanceAnnotation(productId);//使用feignClient實現遠程調用Product product = productFeignClient.getProductById(productId);Order order = new Order();order.setId(1L);order.setTotalAmount(product.getPrice().multiply(new BigDecimal(product.getNum())));//order.setTotalAmount(BigDecimal.valueOf(0));order.setUserId(userId);order.setNickName("zhangsan");order.setAddress("尚硅谷");order.setProductList(Arrays.asList(product));return order;}

創建訂單的請求:http://localhost:8000/order/create?userId=1&productId=100

在這里插入圖片描述

接下來就可以對資源進行流控。

QPS:每秒能接收的請求數

5 異常處理

image.png

5.1 自定義 BlockExceptionHandler

目的:處理業務異常,出現異常可以給前端傳遞一些消息。

實現 BlockExceptionHandler 接口,處理流控/熔斷異常:

// order模塊下
@Component
public class MyBlockExceptionHandler implements BlockExceptionHandler {private ObjectMapper objectMapper = new ObjectMapper();@Overridepublic void handle(HttpServletRequest request, HttpServletResponse response,String resourceName, BlockException e) throws Exception {response.setStatus(429); //too many requestsresponse.setContentType("application/json;charset=utf-8");PrintWriter writer = response.getWriter();R error = R.error(500, resourceName + " 被Sentinel限制了,原因:" + e.getClass());String json = objectMapper.writeValueAsString(error);writer.write(json);writer.flush();writer.close();}
}

5.2 blockHandler

使用 @SentinelResource 注解指定降級方法:

 @SentinelResource(value = "createOrder",blockHandler = "createOrderFallback")@Overridepublic Order createOrder(Long productId, Long userId) {
//        Product product = getProductFromRemoteWithLoadBalanceAnnotation(productId);//使用Feign完成遠程調用Product product = productFeignClient.getProductById(productId);Order order = new Order();order.setId(1L);// 總金額order.setTotalAmount(product.getPrice().multiply(new BigDecimal(product.getNum())));order.setUserId(userId);order.setNickName("zhangsan");order.setAddress("尚硅谷");//遠程查詢商品列表order.setProductList(Arrays.asList(product));return order;}//出現異常,兜底回調public Order createOrderFallback(Long productId, Long userId, BlockException e){Order order = new Order();order.setId(0L);order.setTotalAmount(new BigDecimal("0"));order.setUserId(userId);order.setNickName("未知用戶");order.setAddress("異常信息:"+e.getClass());return order;}
//沒自定義異常,就會自動向上拋,最后給Spring的全局攔截器捕獲到,由spring去處理異常

5.3 OpenFeign-兜底回調

  1. 實現 Fallback 類:
@FeignClient(value = "service-product",fallback = ProductFeignClientFallback.class) // feign客戶端
public interface ProductFeignClient {//mvc注解的兩套使用邏輯//1、標注在Controller上,是接受這樣的請求//2、標注在FeignClient上,是發送這樣的請求@GetMapping("/product/{id}")Product getProductById(@PathVariable("id") Long id);}

2.在 Feign 接口中指定:

@FeignClient(name = "user-service", fallback = UserServiceFallback.class)
public interface UserService { /* ... */ }

6 規則 - 流量控制

image.png

6.1 閾值類型

  • QPS:每秒請求數。
  • 線程數:并發線程數。

6.2 流控模式

img

  • 直接:針對當前資源。
  • 關聯:關聯資源觸發閾值時限流。
  • 鏈路:基于調用鏈路限流。

6.3 流控效果

image.png

  • 快速失敗:直接拒絕請求。
  • Warm Up:預熱模式,逐步增加閾值。
  • 排隊等待:請求進入隊列等待處理。

7 規則 - 熔斷降級

7.1 斷路器狀態

image.png

  • Closed:正常狀態。
  • Open:熔斷狀態,拒絕所有請求。
  • Half-Open:嘗試放行部分請求探測恢復情況。

7.2 工作原理

image.png

  • 慢調用比例:響應時間超過閾值且比例超限。
  • 異常比例:異常比例超限。
  • 異常數:異常數超限。

7.3 熔斷與兜底

image.png


8 規則 - 熱點參數

image.png

8.1 環境搭建

  1. 添加熱點參數限流規則:
 @GetMapping("/seckill")@SentinelResource(value = "seckill-order",fallback = "seckillFallback")public Order seckill(@RequestParam(value = "userId",required = false) Long userId,@RequestParam(value = "productId",defaultValue = "1000") Long productId){Order order = orderService.createOrder(productId, userId);order.setId(Long.MAX_VALUE);return order;}public Order seckillFallback(Long userId,Long productId, BlockException exception){System.out.println("seckillFallback....");Order order = new Order();order.setId(productId);order.setUserId(userId);order.setAddress("異常信息:"+exception.getClass());return order;}

重點總結

  1. 核心功能
    • 流量控制(QPS/線程數)、熔斷降級(慢調用/異常比例)、熱點參數限流。
  2. 優勢
    • 動態規則配置,實時監控,與 Spring Cloud 無縫集成。
  3. 實操關鍵
    • 控制臺啟動后需配置 spring.cloud.sentinel.transport.dashboard
    • 使用 @SentinelResource 定義資源和降級邏輯。
    • OpenFeign 需結合 Fallback 類實現服務降級。
  4. 注意事項
    • 規則配置后需持久化到 Nacos/Redis,避免重啟丟失。
    • 生產環境建議開啟 Sentinel 的集群流控功能。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/72818.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/72818.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/72818.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

manus本地部署方法研究測試

Manus本地部署方法&#xff0c;Manus邀請碼實在太難搞了&#xff0c;昨晚看到有一個團隊&#xff0c;5個人3個小時&#xff0c;一個完全免費、無需排隊等待的OpenManus就做好了。 由于也是新手&#xff0c;找了好幾輪&#xff0c;實在是沒有找到合適的部署方法&#xff0c;自己…

FreeRTOS第15篇:FreeRTOS鏈表實現細節03_List_t與ListItem_t的奧秘

文/指尖動聽知識庫-星愿 文章為付費內容,商業行為,禁止私自轉載及抄襲,違者必究!!! 文章專欄:深入FreeRTOS內核:從原理到實戰的嵌入式開發指南 1 FreeRTOS列表的核心數據結構 FreeRTOS的列表實現由兩個關鍵結構體組成:List_t(列表)和ListItem_t(列表項)。它們共同…

gzip壓縮

什么是Gzip 前端優化&#xff1a;開啟Gzip壓縮_前端開啟gzip壓縮-CSDN博客 Gzip是一種文件壓縮算法&#xff0c;減少文件大小&#xff0c;節省帶寬從而提減少網絡傳輸時間&#xff0c;網站會更快地加載。 如何判斷是否開啟&#xff1a; 請求頭&#xff1a;服務端會通過客戶…

機器學習在地圖制圖學中的應用

原文鏈接&#xff1a;https://www.tandfonline.com/doi/full/10.1080/15230406.2023.2295948#abstract CSDN/2025/Machine learning in cartography.pdf at main keykeywu2048/CSDN GitHub 核心內容 本文是《制圖學與地理信息科學》特刊的擴展評論&#xff0c;系統探討了機…

智慧消防新篇章:4G液位/壓力傳感器,筑牢安全防線!

火災無情&#xff0c;防患未“燃”&#xff01;在智慧消防時代&#xff0c;如何實現消防水系統的實時監測、預警&#xff0c;保障人民生命財產安全&#xff1f;山東一二三物聯網深耕物聯網領域&#xff0c;自主研發4G液位、4G壓力智能傳感器&#xff0c;為智慧消防水位、水壓無…

set、LinkedHashSet和TreeSet的區別、Map接口常見方法、Collections 工具類使用

DAY7.2 Java核心基礎 想學習Collection、list、ArrayList、Set、HashSet部分的小伙伴可以轉到 7.1集合框架、Collection、list、ArrayList、Set、HashSet和LinkedHashSet、判斷兩個對象是否相等文章查看 set集合 在set集合中&#xff0c;處理LinkedHashSet是有序的&#xf…

windows:curl: (60) schannel: SEC_E_UNTRUSTED_ROOT (0x80090325)

目錄 1. git update-git-for-windows 報錯2. 解決方案2.1. 更新 CA 證書庫2.2. 使用 SSH 連接&#xff08;推薦&#xff09;2.3 禁用 SSL 驗證&#xff08;不推薦&#xff09; 1. git update-git-for-windows 報錯 LenovoLAPTOP-EQKBL89E MINGW64 /d/YHProjects/omni-channel-…

《深度剖析架構蒸餾與邏輯蒸餾:探尋知識遷移的差異化路徑》

在人工智能模型優化的前沿領域&#xff0c;架構蒸餾與邏輯蒸餾作為知識蒸餾的關鍵分支&#xff0c;正引領著模型小型化與高效化的變革浪潮。隨著深度學習模型規模與復雜度的不斷攀升&#xff0c;如何在資源受限的情況下&#xff0c;實現模型性能的最大化&#xff0c;成為了學術…

先序二叉樹的線索化,并找指定結點的先序后繼

#include<stdio.h> #include<stdlib.h> #define elemType char //線索二叉樹結點 typedef struct ThreadNode{ elemType data; struct ThreadNode *lchild,*rchild; int ltag,rtag;//用來判斷一個結點是否有線索 }ThreadNode,*ThreadTree; //全局變量…

螞蟻集團轉正實習大模型算法崗內推

1.負責以大模型為代表的A轉術能力的建設和優化&#xff0c;打造業界領先的A(技術系統&#xff0c;主要職責包括A系統結構設計、RAG 系統開發、大模型凱練數據構建、大模型能力評測、大模型準理效果和效率優化等 2.緊密跟蹤、探索大模型方向前沿技術&#xff0c;依托豐富目體系化…

未授權漏洞大賞

ActiveMQ未授權訪問漏洞 漏洞描述 Apache ActiveMQ是美國阿帕奇&#xff08;Apache&#xff09;軟件基金會所研發的一套開源的消息中間件&#xff0c;它支持Java消息服務、集群、Spring Framework等。 Apache ActiveMQ管理控制臺的默認管理用戶名和密碼分別為admin和admin&am…

Python包結構與 `__init__.py` 詳解

1. 什么是 __init__.py&#xff1f; __init__.py 是Python包的標識文件&#xff0c;它告訴Python解釋器這個目錄應該被視為一個包&#xff08;Package&#xff09;。這個文件可以為空&#xff0c;也可以包含初始化代碼。 1.1 基本作用 包的標識 將普通目錄轉換為Python包允許…

Web前端開發——HTML基礎下

HTML語法 一表格1.基本格式2.美化表格合并居中屬性 二表單1.input2.select3.textarea4.button5.date6.color7.checkbox8.radio9.range10.number 一表格 1.基本格式 HTML表格由<table>標簽定義 其中行由<tr>標簽定義&#xff0c;單元格由<td>定義。我們先來…

小程序事件系統 —— 33 事件傳參 - data-*自定義數據

事件傳參&#xff1a;在觸發事件時&#xff0c;將一些數據作為參數傳遞給事件處理函數的過程&#xff0c;就是事件傳參&#xff1b; 在微信小程序中&#xff0c;我們經常會在組件上添加一些自定義數據&#xff0c;然后在事件處理函數中獲取這些自定義數據&#xff0c;從而完成…

安卓設備root檢測與隱藏手段

安卓設備root檢測與隱藏手段 引言 安卓設備的root權限為用戶提供了深度的系統控制能力&#xff0c;但也可能帶來安全風險。因此&#xff0c;許多應用&#xff08;如銀行軟件、游戲和流媒體平臺&#xff09;會主動檢測設備是否被root&#xff0c;并限制其功能。這種對抗催生了ro…

如何在Ubuntu上直接編譯Apache Doris

以下是在 Ubuntu 22.04 上直接編譯 Apache Doris 的完整流程&#xff0c;綜合多個版本和環境的最佳實踐&#xff1a; 注意&#xff1a;Ubuntu的數據盤VMware默認是20G&#xff0c;編譯不夠用&#xff0c;給到50G以上吧 一、環境準備 1. 安裝系統依賴 # 基礎構建工具鏈 apt i…

vuejs相關鏈接和格式化插件推薦

vue官網&#xff1a; https://cn.vuejs.org/ 配合路由設置&#xff1a; https://router.vuejs.org/zh/guide/ element plus (vue3) | element UI (vue2)&#xff1a; https://element-plus.org/zh-CN/#/zh-CN 構建工具vite&#xff1a; https://cn.vitejs.dev/ 右鍵選擇…

IDEA中Git版本回退終極指南:Reset與Revert雙方案詳解

目錄 前言一、版本回退前置知識二、Reset方案&#xff1a;整體改寫歷史1、IDEA圖形化操作&#xff08;推薦&#xff09;1.1、查看提交歷史1.2、選擇目標版本1.3、選擇回退模式1.3.1、Soft&#xff08;推薦&#xff09;1.3.2、Mixed1.3.3、Hard&#xff08;慎用&#xff09;1.3.…

PHP并發請求優化:使用`curl_multi_select()`實現高效的多請求處理

PHP并發請求優化&#xff1a;使用curl_multi_select()實現高效的多請求處理 背景 最近在項目中遇到一個需求&#xff0c;需要從多個 1 級網站&#xff08;超過 200 個&#xff09;獲取數據&#xff0c;并且是通過 POST 請求瞬間發送到這些網站上。開始時我直接使用了 curl_ex…

【leetcode hot 100 206】反轉鏈表

解法一&#xff1a;&#xff08;頭插法&#xff09;在遍歷鏈表時&#xff0c;將當前節點的 next 指針改為指向前一個節點。 /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode() {}* ListNode(int val)…