Sentinel限流熔斷機制實戰

1、核心概念

1.1、流量控制

流量控制是為了 防止系統被過多的請求壓垮,確保資源合理分配并保持服務的可用性,比如對請求數量的限制。

流量控制的 3 個主要優勢:

  1. 防止過載:當瞬間涌入的請求量超出系統處理能力時,會導致資源枯竭,如 CPU和內存耗盡。流量控制通過限制系統能處理的請求數,確保不會發生過載。
  2. 避免雪崩效應:高負載下某個服務崩潰可能引發其他依賴服務的崩潰,形成連鎖反應。流量控制可以有效預防這種連鎖故障,避免系統雪崩。
  3. 優化用戶體驗:即便部分請求被拒絕或延遲處理,流量控制也能確保大部分用戶的請求能夠正常響應,避免全局響應時間過長的情況。

常見的實現流量控制方法有 2 種:

  1. 限流:通過固定窗口、令牌桶或漏桶等算法限制單位時間內的請求數量。
  2. 排隊:當請求量超出處理能力時,部分請求進入等待隊列,防止立即超載。

1.2、熔斷機制

熔斷機制的目的是 避免當下游服務發生異常時,整個系統繼續耗費資源重復發起失敗請求,從而防止連鎖故障。

工作機制:

  1. 監控服務健康狀態:系統會實時監控服務的調用情況,例如請求成功率、響應時間等,判斷服務的健康狀況。
  2. 進入熔斷狀態:當某個服務的錯誤率達到設定閾值(如響應時間過長或出錯率過高)時,系統會激活熔斷器,暫時停止對該服務的調用,避免消耗不必要的資源和讓錯誤進一步擴散。
  3. 快速失敗:在熔斷狀態下,系統不會再等待超時,而是直接返回失敗響應,減少系統資源占用,并避免因長時間等待導致用戶體驗的惡化。(也可以降級處理)
  4. 熔斷恢復機制:熔斷并非永久狀態。在一段時間后,熔斷器會進入半開狀態,允許少量請求測試服務的健康情況。如果恢復正常,熔斷器將關閉,恢復正常服務調用;如果仍有問題,則繼續保持熔斷。

在這里插入圖片描述

1.3、降級策略

降級的目的是在某個服務的響應能力下降、或該服務不可用時,提供簡化版的功能或返回默認值作為 兜底,保持系統的部分功能可用,確保用戶體驗的連續性,避免系統頻繁報錯。

降級可以是手?動配置,也可以根據系統負?載自動觸發。系統可能由于?多種原因(如高負載、外部?依賴不可用等)觸發降級,?返回簡化的響應或默認值。

降級機制的好處:

  1. 優雅地處理故障:在降級狀態下,系統不會直接返回錯誤信息,而是提供一個替代方案。例如,某個數據查詢服務不可用時,系統可以返回緩存數據,確保用戶看到的是有效信息,而非錯誤頁面。
  2. 降低服務壓力:降級有助于減輕系統對非核心服務的依賴,確保核心功能的穩定運行。例如,當推薦系統或廣告服務出現故障時,降級可以減少對這些服務的調用,保護系統的整體穩定性。

1.4、熔斷和降級的區別

具體來說:

  1. 熔斷是當服務健康狀況惡化時,通過 切斷調用 避免系統資源浪費或服務間故障擴散。
  2. 降級是在系統壓力過大或某個服務不可用時,通過提供簡化的替代方案 ,保持系統的可用性和用戶體驗。

2、需求分析

2.1、對單個接口整體限流

目的:控制對?耗時較長的、經常訪問的接?口的請求頻率,防止過多請?求導致系過載

限流規則:

  1. 策略:整個接口每秒鐘不超過 10 次請求
  2. 阻塞操作:提示“系統壓力過大,請耐心等待”

熔斷規則:

  1. 熔斷條件:如果接口異常率超過 10%,或者慢調用(響應時長 > 3 秒)的比例大于 20%,觸發 60 秒熔斷。
  2. 熔斷操作:直接返回本地數據(緩存或空數據)

2.2、對單個 IP 訪問單個接口限流

限流規則:

  1. 策略:每個 IP 地址每分鐘允許查看題目列表的次數不能超過 60 次。
  2. 阻塞操作:提示“訪問過于頻繁,請稍后再試”

熔斷規則:

  1. 熔斷條件:如果接口異常率超過 10%,或者慢調用(響應時長 > 3 秒)的比例大于 20%,觸發 60 秒熔斷。
  2. 熔斷操作:直接返回本地數據(緩存或空數據)

3、Sentinel 介紹

Sentinel是阿里巴巴開源的限流、熔斷、降級組件,旨在為分布式系統提供可靠的保護機制。它設計用于解決高并發流量下的穩定性問題,并且支持與 Dubbo、Spring Cloud 等多種框架集成。

詳細內容可查看 -> 官方文檔

它的功能:

  1. 限流:支持基于 QPS、并發數量等條件的限流,支持滑動窗口、預熱、漏桶等算法。
  2. 熔斷降級:支持失敗率、慢調用比例等指標觸發熔斷,并提供自動恢復機制。
  3. 熱點參數限流:可以基于特定的參數進行限流,如限制特定用戶 ID 的請求頻率。
  4. 系統負載保護:可以根據系統的實際負載(如 CPU、內存)動態調整流量。
  5. 豐富的規則配置:通過配置中心或控制臺動態調整限流和熔斷規則。

優勢:功能?豐富、提供控制臺、?更新較頻繁、社區活?躍、文檔清晰,能夠?快速入門上手。

3.1、使用方式

使用 Sentinel 來進行資源保護,主要分為幾個步驟:

  1. 定義資源
  2. 定義規則
  3. 檢驗規則是否生效

3.2、架構設計

在 Sentinel 里面,所有的資源都對應一個資源名稱以及一個 Entry。Entry 可以通過對主流框架的適配自動創建,也可以通過注解的方式或調用 API 顯式創建;每一個 Entry 創建的時候,同時也會創建一系列功能插槽(slot chain)。這些插槽有不同的職責,例如:

3.2.1、NodeSelectorSlot

NodeSelectorSlot 的本質作用:Sentinel 是通過一條一條資源“鏈路”來判斷是否限流/降級的,而 它 就是用來維護這些資源鏈路的結構樹。

具體干這幾件事:

1、把資源“掛”到調用上下文樹上
比如你訪問 nodeA,它就會:

  • 看你當前上下文是哪個入口(entrance1)
  • 在 entrance1 節點下面查:有沒有掛過 nodeA
  • 沒有就新建一個 DefaultNode(nodeA),掛上去!

2、同一個資源,但不同入口,樹結構是獨立的!

ContextUtil.enter("entrance1", "appA");
SphU.entry("nodeA"); // 第一次
ContextUtil.exit();ContextUtil.enter("entrance2", "appA");
SphU.entry("nodeA"); // 第二次
ContextUtil.exit();

這相當于你從 兩個不同入口玩了同一個關卡,Sentinel 會建立兩條路徑記錄:

machine-root├── EntranceNode(entrance1)│       └── DefaultNode(nodeA)└── EntranceNode(entrance2)└── DefaultNode(nodeA)

為什么這么設計?
因為在真實業務中:

  • 你可能有多個入口(比如首頁、搜索頁都能訪問同一個資源)
  • 你想控制每條鏈路的 QPS(比如“從搜索頁過來的 QPS 限制更嚴格”)

所以 Sentinel 就必須要分得清:

“你是從哪兒來的,然后才訪問的這個資源”

3.2.2、ClusterBuilderSlot

ClusterBuilderSlot 則用于存儲資源的統計信息以及調用者信息,例如該資源的 RT, QPS, thread count 等等,這些信息將用作為多維度限流,降級的依據;

ClusterBuilderSlot 的作用
1、調用方級別限流!

  • 比如限制 “微信小程序” 每秒最多訪問 100 次,其他 origin 不受影響。

2、監控更細粒度!

  • 哪個來源調用最多?
  • 哪個來源的調用最慢、最容易出錯?

比如:是不是 Web 前端的調用出異常多,是不是他們傳參老有問題?

配合熱點參數限流、來源限流做更精細的控制。

3.3.3、StatisticSlot

StatisticSlot 是 Sentinel 的核心功能插槽之一,用于統計實時的調用數據。

  • clusterNode:資源唯一標識的 ClusterNode 的 runtime 統計
  • origin:根據來自不同調用者的統計信息
  • defaultnode: 根據上下文條目名稱和資源 ID 的 runtime 統計入口的統計

Sentinel 底層采用高性能的滑動窗口數據結構 LeapArray 來統計實時的秒級指標數據,可以很好地支撐寫多于讀的高并發場景。

3.3.4、LeapArray底層原理

LeapArray 底層是一個固定長度的環形數組,每個元素是一個帶有時間戳的窗口格子 WindowWrap。
它支持在高并發場景下以時間為索引安全讀寫,保證統計的是“最近一段時間”的窗口數據,用于 Sentinel 的實時監控與限流、降級判斷。

結構總覽:

public class LeapArray<T> {protected final int sampleCount; // 窗口格子數,比如10protected final int intervalInMs; // 窗口總時長,比如1000ms(1s)private final WindowWrap<T>[] array; // 固定長度數組,環形復用
}

每個窗口格子是這樣一個類:

public class WindowWrap<T> {private final long windowStart; // 窗口開始時間private final long windowLength; // 每個格子的長度(interval / sampleCount)private final T value; // 存放統計信息的對象,比如 MetricBucket
}

它是怎么定位時間屬于哪個窗口的?

比如:

總窗口時間是 1000ms,格子數是 10

每個格子負責 100ms

現在時間是 10:00:01.450(即 1450ms)

① 算出這個時間屬于哪個格子:

int idx = (timestamp / windowLength) % sampleCount;
// 1450 / 100 = 14 -> 14 % 10 = 4,落在索引為4的格子

② 再判斷這個格子的起始時間是不是還有效:

//當前時間戳 ? 除以窗口長度 ? 計算出當前時間該落在哪個格子 ? 比較該格子的起始時間 
//? 如果不同 ? 就滑窗、清理、重建!
window.windowStart == timestamp - (timestamp % windowLength)

如果有效:直接返回當前格子

如果無效(已經過期了):用 CAS 創建一個新的 WindowWrap(復用原來的槽位)

3.3.4.1、它是怎么滑動更新的?

核心點:每次請求到來時,才會“懶更新”窗口格子

流程如下:

1、當前時間戳算出對應窗口索引(如上)

2、取出格子對象,檢查是否是當前時間的窗口

  • 是:直接用
  • 否:CAS 替換為新窗口 + 清空舊統計值(滑動來了)

3、更新格子里的統計數據

它并不需要定時器或后臺線程維護窗口,而是靠訪問觸發滑動,非常節省資源。

3.3.4.2、并發怎么處理?

多線程訪問時可能并發寫同一個窗口:

  • 用的是 AtomicReferenceArray + Compare-And-Swap (CAS)
  • 每個格子內部統計信息用 LongAdder 等并發友好結構
3.3.4.3、總結:

LeapArray 是一個時間輪+懶更新+CAS構建的滑動窗口數組,專為高并發下限流降級而生。

3.3.5、FlowSlot

這個 slot 主要根據預設的資源的統計信息,按照固定的次序,依次生效。如果一個資源對應兩條或者多條流控規則,則會根據如下次序依次檢驗,直到全部通過或者有一個規則生效為止:

  1. 指定應用生效的規則,即針對調用方限流的;
  2. 調用方為 other 的規則;
  3. 調用方為 default 的規則。

3.3.6、DegradeSlot

這個 slot 主要針對資源的平均響應時間(RT)以及異常比率,來決定資源是否在接下來的時間被自動熔斷掉。
在這里插入圖片描述

4、代碼實戰

4.1、查看題庫列表接口限流熔斷

 /*** 分頁獲取題庫列表(封裝類)** @param questionBankQueryRequest* @param request* @return*/@PostMapping("/list/page/vo")@SentinelResource(value = "listQuestionBankVOByPage",blockHandler = "handleBlockException",fallback = "handleFallback")public BaseResponse<Page<QuestionBankVO>> listQuestionBankVOByPage(@RequestBody QuestionBankQueryRequest questionBankQueryRequest,HttpServletRequest request) {long current = questionBankQueryRequest.getCurrent();long size = questionBankQueryRequest.getPageSize();// 限制爬蟲ThrowUtils.throwIf(size > 200, ErrorCode.PARAMS_ERROR);// 查詢數據庫Page<QuestionBank> questionBankPage = questionBankService.page(new Page<>(current, size),questionBankService.getQueryWrapper(questionBankQueryRequest));// 獲取封裝類return ResultUtils.success(questionBankService.getQuestionBankVOPage(questionBankPage, request));}

熔斷降級操作,處理 異常 / 熔斷場景下的兜底邏輯,避免用戶看到系統崩潰。

 /*** listQuestionBankVOByPage 降級操作:直接返回本地數據*/public BaseResponse<Page<QuestionBankVO>> handleFallback(@RequestBody QuestionBankQueryRequest questionBankQueryRequest,HttpServletRequest request, Throwable ex) {// 可以返回本地數據或空數據return ResultUtils.success(null);}

限流操作

/*** listQuestionBankVOByPage 流控操作* 限流:提示“系統壓力過大,請耐心等待”* 熔斷:執行降級操作*/public BaseResponse<Page<QuestionBankVO>> handleBlockException(@RequestBody QuestionBankQueryRequest questionBankQueryRequest,HttpServletRequest request, BlockException ex) {// 降級操作if (ex instanceof DegradeException) {return handleFallback(questionBankQueryRequest, request, ex);}// 限流操作return ResultUtils.error(ErrorCode.SYSTEM_ERROR, "系統壓力過大,請耐心等待");}

小Tips💡:為什么需要專門寫降級操作判斷?

// 降級操作if (ex instanceof DegradeException) {return handleFallback(questionBankQueryRequest, request, ex);}

Sentinel 中“熔斷觸發”其實本質上也是一種“被限流”行為,會先走 blockHandler,而不是直接走 fallback。

具體來說

情況觸發邏輯進入哪個方法?
QPS 超限Sentinel 流控規則blockHandler()
異常率 > 50% 熔斷開啟Sentinel 熔斷規則也進入 blockHandler()
方法內空指針等異常Java 拋異常fallback()

這時候你在 blockHandler() 里接收到的是 BlockException,它可能是:

  • FlowException(QPS 控制)
  • DegradeException(熔斷控制)
  • ParamFlowException(熱點參數)
  • AuthorityException(授權規則)
  • SystemBlockException(系統保護)

你得根據 ex instanceof DegradeException 去區分熔斷的 case。

總結: 雖然 Sentinel 有 fallback 專門處理 異常 / 熔斷,但 在觸發熔斷時默認走的是 blockHandler,你必須自己判斷 ex 類型來決定要不要轉交給 fallback 處理。也可以理解為:只有業務?異常(比如請求參數錯誤、或?者數據庫操作失敗等問題),?才會算到熔斷條件中,限流熔?斷本身的異常 BlockE?xception 是不計算的

4.2、單 IP 查看題目列表限流熔斷

對于這個需求,需要對每個用戶進一步精細化限流,而不是整體接口限流,可以采用 熱點參數限流機制,允許根據參數控制限流觸發條件,例如:將 IP 地址作為熱點參數。
在這里插入圖片描述
代碼如下:

/*** 分頁獲取題目列表(封裝類) - 限流版** @param questionQueryRequest* @param request* @return*/@PostMapping("/list/page/vo/sentinel")public BaseResponse<Page<QuestionVO>> listQuestionVOByPageSentinel(@RequestBody QuestionQueryRequest questionQueryRequest,HttpServletRequest request) {long current = questionQueryRequest.getCurrent();long size = questionQueryRequest.getPageSize();// 限制爬蟲ThrowUtils.throwIf(size > 20, ErrorCode.PARAMS_ERROR);// 基于 IP 限流String remoteAddr = request.getRemoteAddr();Entry entry = null;try  {entry = SphU.entry("listQuestionVOByPage", EntryType.IN, 1, remoteAddr);// 被保護的業務邏輯// 查詢數據庫Page<Question> questionPage = questionService.listQuestionByPage(questionQueryRequest);// 獲取封裝類return ResultUtils.success(questionService.getQuestionVOPage(questionPage, request));} catch (Throwable t) {// 自定義業務異常if (!BlockException.isBlockException(t)) {Tracer.trace(t);return ResultUtils.error(ErrorCode.SYSTEM_ERROR, "系統異常");}// 資源訪問阻止,被限流或被降級if (t instanceof DegradeException) {return handleFallback(questionQueryRequest, request, t);}// 限流操作return ResultUtils.error(ErrorCode.SYSTEM_ERROR, "訪問過于頻繁,請稍后再試");} finally {if (entry != null) {entry.exit(1, remoteAddr);}}}/*** listQuestionVOByPageSentinel 降級操作:直接返回本地數據*/public BaseResponse<Page<QuestionVO>> handleFallback(@RequestBody QuestionQueryRequest questionQueryRequest,HttpServletRequest request, Throwable ex) {// 可以返回本地數據或空數據return ResultUtils.success(null);}

String remoteAddr = request.getRemoteAddr() 參數 remoteAddr 的作用是獲取用戶 IP,作為限流參數維度,防止一個 IP 亂刷。

entry = SphU.entry("listQuestionVOByPage", EntryType.IN, 1, remoteAddr) 作用是將 listQuestionVOByPage 作為資源注冊到 Sentinel 的上下文中,開始對該資源進行限流、熔斷、熱點參數等規則的監控與統計。

異常處理判斷邏輯:

情況處理方式
不是 Sentinel 異常(業務異常、系統異常)打點上報(Tracer.trace(t)),提示“系統異常”
是 Sentinel 熔斷異常(DegradeException走自定義的降級處理邏輯:handleFallback
是 Sentinel 限流異常(FlowException 等)返回:“訪問過于頻繁,請稍后再試”

重點💡

1、若 entry 的時候傳入了熱點參數,那么 exit 的時候也一定要帶上對應的參數(exit(count, args)),否則可能會有統計錯誤。

2、SphU.entry(xxx) 需要與 entry.exit() 方法成對出現,匹配調用,否則會導致調用鏈記錄異常,拋出 ErrorEntryFreeException 異常。

3、注意 Sentinel 的降級僅針對業務異常,對 Sentinel 限流降級本身的異常 BlockException 不生效。為了統計異常比例或異常數,需要手動通過 Tracer.trace(ex) 記錄業務異常。

4.3、定義規則

新建 sentinel 包并定義一個單獨的 Manager 作為 Bean,利用 @PostConstruct 注解,在 Bean 加載后創建規則。

@Component
public class SentinelRulesManager {@PostConstructpublic void initRules() throws Exception {initFlowRules();initDegradeRules();}// 限流規則public void initFlowRules() {// 單 IP 查看題目列表限流規則ParamFlowRule rule = new ParamFlowRule("listQuestionVOByPage").setParamIdx(0) // 對第 0 個參數限流,即 IP 地址.setCount(60) // 每分鐘最多 60 次.setDurationInSec(60); // 規則的統計周期為 60 秒ParamFlowRuleManager.loadRules(Collections.singletonList(rule));}// 降級規則public void initDegradeRules() {// 單 IP 查看題目列表熔斷規則DegradeRule slowCallRule = new DegradeRule("listQuestionVOByPage").setGrade(CircuitBreakerStrategy.SLOW_REQUEST_RATIO.getType()).setCount(0.2) // 慢調用比例大于 20%.setTimeWindow(60) // 熔斷持續時間 60 秒.setStatIntervalMs(30 * 1000) // 統計時長 30 秒.setMinRequestAmount(10) // 最小請求數.setSlowRatioThreshold(3); // 響應時間超過 3 秒DegradeRule errorRateRule = new DegradeRule("listQuestionVOByPage").setGrade(CircuitBreakerStrategy.ERROR_RATIO.getType()).setCount(0.1) // 異常率大于 10%.setTimeWindow(60) // 熔斷持續時間 60 秒.setStatIntervalMs(30 * 1000) // 統計時長 30 秒.setMinRequestAmount(10); // 最小請求數// 加載規則DegradeRuleManager.loadRules(Arrays.asList(slowCallRule, errorRateRule));}
}

本地化配置,讓 Sentinel 的限流和降級規則支持本地文件持久化(可讀可寫)

/*** 持久化配置為本地文件*/
public void listenRules() throws Exception {//獲取項目根目錄并創建 sentinel/ 文件夾String rootPath = System.getProperty("user.dir");File sentinelDir = new File(rootPath, "sentinel");if (!FileUtil.exist(sentinelDir)) {FileUtil.mkdir(sentinelDir);}// 設置規則文件路徑String flowRulePath = new File(sentinelDir, "FlowRule.json").getAbsolutePath();String degradeRulePath = new File(sentinelDir, "DegradeRule.json").getAbsolutePath();// 初始化 限流規則讀取器(拉模式)ReadableDataSource<String, List<FlowRule>> flowRuleDataSource = new FileRefreshableDataSource<>(flowRulePath, flowRuleListParser);FlowRuleManager.register2Property(flowRuleDataSource.getProperty());//注冊 限流規則寫入器WritableDataSource<List<FlowRule>> flowWds = new FileWritableDataSource<>(flowRulePath, this::encodeJson);WritableDataSourceRegistry.registerFlowDataSource(flowWds);// 降級規則讀取器FileRefreshableDataSource<List<DegradeRule>> degradeRuleDataSource= new FileRefreshableDataSource<>(degradeRulePath, degradeRuleListParser);DegradeRuleManager.register2Property(degradeRuleDataSource.getProperty());WritableDataSource<List<DegradeRule>> degradeWds = new FileWritableDataSource<>(degradeRulePath, this::encodeJson);// Register to writable data source registry so that rules can be updated to fileWritableDataSourceRegistry.registerDegradeDataSource(degradeWds);
}//JSON字符串 -> 規則對象
private Converter<String, List<FlowRule>> flowRuleListParser = source -> JSON.parseObject(source,new TypeReference<List<FlowRule>>() {});
private Converter<String, List<DegradeRule>> degradeRuleListParser = source -> JSON.parseObject(source,new TypeReference<List<DegradeRule>>() {});// 規則對象 -> JSON字符串
private <T> String encodeJson(T t) {return JSON.toJSONString(t);
}

注意:在初始化時加入 listenRules()方法

 @PostConstructpublic void initRules() throws Exception {initFlowRules();initDegradeRules();listenRules();}

5、總結

Sentinel 的規則配置 + 接口中的限流/熔斷操作 的聯動協同

5.1、規則配置部分(限流 & 熔斷)

①在內存中加載規則(程序啟動時)

如對 listQuestionVOByPage 添加:

  • 限流:每個 IP 每分鐘訪問不超 60 次
  • 熔斷:慢調用比例超 20%,觸發熔斷;異常率超 10%,也觸發熔斷

②文件持久化監聽

調用 listenRules() 做兩件事:監聽本地文件變化,自動刷新配置

將規則寫回文件(支持動態修改)

5.2、接口限流/熔斷的具體操作(怎么用規則)

①注解方式(簡潔明了)

具體來說:

應規則名就是 value 指定的 “listQuestionBankVOByPage”:

  • 如果被限流了 ? 走 handleBlockException()
  • 如果被熔斷了 ? 也會走 handleBlockException(),但你可以判斷異常類型 DegradeException
  • 如果業務異常了(比如系統異常)? 走 handleFallback()

②編程方式(可擴展性強)

entry = SphU.entry("listQuestionVOByPage", EntryType.IN, 1, remoteAddr);
  1. 參數 remoteAddr 作為限流 key(這是為了實現 ParamFlowRule)
  2. try-catch 中寫核心業務邏輯
  3. catch 中判斷是否是限流/熔斷異常:

對于 對單個接口整體限流 我們使用 @SentinelResource 注解方式 做限流操作,這時注解會監控所有參數。

對于 單個IP查看題目列表限流熔斷 用 編程式 做限流操作,是因為我們只需要對 用戶IP 這一個參數監控,不需要對傳入的所有參數做監控。

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

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

相關文章

深度解析 torch.mean 的替代方案

torch.mean 是什么意思 代碼效果解釋 segment_vector = torch.mean(segment_embedding, dim=1) # [1, hidden_dim] 這行代碼的作用是在指定維度上對張量 segment_embedding 求平均值,實現類似平均池化的效果。 具體來說,dim=1 表示沿著索引為1的維度進行操作。假設 segment…

Paraformer語音模型:一種語音模型加速方法

隨著智能語音技術的普及&#xff0c;語音識別&#xff08;ASR&#xff09;、語音合成&#xff08;TTS&#xff09;、聲紋識別等應用場景對模型推理效率提出了極高要求&#xff0c;本文介紹將Paraformer語音模型從預訓練模型導出為ONNX格式&#xff0c;并使用ONNX Runtime進行推…

本地部署FreeGPT+內網穿透公網遠程訪問,搞定ChatGPT外網訪問難題

?FreeGPT?是一個基于GPT 3.5/4的ChatGPT聊天網頁用戶界面&#xff0c;提供了一個開放的聊天界面&#xff0c;開箱即用?。ChatGPT是非常熱門的&#xff0c;但訪問體驗一直不太理想。為了解決這一問題&#xff0c;出現了各類方法和工具&#xff0c;其中FreeGPT是一款非常實用的…

ElasticSearch遷移至openGauss

Elasticsearch 作為一種高效的全文搜索引擎&#xff0c;廣泛應用于實時搜索、日志分析等場景。而 openGauss&#xff0c;作為一款企業級關系型數據庫&#xff0c;強調事務處理與數據一致性。那么&#xff0c;當這兩者的應用場景和技術架構發生交集時&#xff0c;如何實現它們之…

品優購項目(HTML\CSS)

項目效果可訪問 http://zhousunyu.3vdo.club 查看 主頁 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><titl…

因泰立科技:鐳眸T51激光雷達,打造智能門控新生態

在高端門控行業&#xff0c;安全與效率是永恒的追求。如今&#xff0c;隨著科技的飛速發展&#xff0c;激光雷達與TOF相機技術的融合&#xff0c;為門控系統帶來了前所未有的智能感知能力&#xff0c;開啟了精準守護的新時代。因泰立科技的鐳眸T51激光雷達&#xff0c;作為這一…

MyBatisPlus--快速入門

MyBatisPlus介紹 從名字中就可以感覺到MybatisPlus與MyBatis之間的淵源&#xff0c;而MyBatis是一個非常流行的持久層框架&#xff0c;主要來做數據庫的增刪改查&#xff0c;而MyBatisPlus這種命名方式讓人不得不往MyBatis的升級版去聯想&#xff0c;事實也確實如此&#xff0…

redis持久化策略

RDB 是通過生成數據快照來實現持久化的&#xff0c;相當于給內存中的數據拍一張"照片"保存到磁盤上。AOF 記錄所有寫操作命令&#xff0c;以Redis協議格式追加到文件末尾。 RDB 在滿足特定條件時觸發內存快照&#xff0c;生成新的RDB文件替換舊文件 AOF 先寫入內…

Spring Boot中使用@JsonAnyGetter和@JsonAnySetter處理動態JSON屬性

Spring Boot 中使用 @JsonAnyGetter 和 @JsonAnySetter 處理動態 JSON 屬性 在實際的后端開發中,尤其是使用 Spring Boot 構建 API 時,我們經常會遇到需要處理動態 JSON 屬性的場景。例如,前端傳遞過來的 JSON 數據結構不固定,或者業務需求變更頻繁,導致實體類無法預先定…

拉取gitlab項目

一、下載nvm管理node 先下載配置好nvm,再用nvm下載node 下載鏈接&#xff1a;開始 下載nvm - nvm中文官網 情況&#xff1a;npm i 下載依賴緩慢&#xff0c;可能是node版本不對&#xff0c;可能node版本太高 可能得問題&#xff1a;使用nvm 下載低版本的node時&#xff0c;…

【解決辦法】ubuntu重啟不起來,輸入用戶名和密碼進不去,又重新返回登錄頁。

項目場景&#xff1a; ubuntu重啟不起來&#xff0c;輸入用戶名和密碼進不去&#xff0c;又重新返回登錄頁。 問題描述 在華碩天選一代筆記本上面安裝了ubuntu22.04.5桌面版&#xff0c;但是重啟以后出現&#xff0c;輸入了用戶名和密碼&#xff0c;等待一會還讓輸入用戶名和…

# 云端大模型:智能時代的新引擎

云端大模型&#xff1a;智能時代的新引擎 在人工智能技術的迅猛發展中&#xff0c;云端大模型扮演著至關重要的角色。它們不僅推動了技術的邊界&#xff0c;也為各行各業帶來了前所未有的機遇。本文將結合一系列圖片和代碼示例&#xff0c;深入探討云端大模型的功能、應用及其…

(1)pytest簡介和環境準備

1. pytest簡介 pytest是python的一種單元測試框架&#xff0c;與python自帶的unittest測試框架類似&#xff0c;但是比unittest框架使用起來更簡潔&#xff0c;效率更高。根據pytest的官方網站介紹&#xff0c;它具有如下特點&#xff1a; 非常容易上手&#xff0c;入門簡單&a…

實驗設計與分析(第6版,Montgomery)第5章析因設計引導5.7節思考題5.5 R語言解題

本文是實驗設計與分析&#xff08;第6版&#xff0c;Montgomery著&#xff0c;傅玨生譯) 第5章析因設計引導5.7節思考題5.5 R語言解題。主要涉及方差分析&#xff0c;正態假設檢驗&#xff0c;殘差分析&#xff0c;交互作用圖。 dataframe <-data.frame( wrapc(17,20,12,9,…

線程池的詳細知識(含有工廠模式)

前言 下午學習了線程池的知識。重點探究了ThreadPoolExecutor里面的各種參數的含義。我詳細了解了這部分的知識。其中有一個參數涉及工廠模式&#xff0c;我將這一部分知識分享給大家~ 線程池的詳細介紹(含工廠模式) 結語 分享到此結束啦。byebye~

嵌入式開發學習(第二階段 C語言筆記)

內存操作 我們對于內存操作需要依賴于string.h頭文件中相關的函數庫。 內存操作函數 內存填充 頭文件&#xff1a;#include <string.h> 函數原型&#xff1a; void* memset(void *s,int c,size_t n)函數功能&#xff1a;將內存塊s的前n個字節填充為c&#xff0c;一般…

C++學習-入門到精通【9】面向對象編程:繼承

C學習-入門到精通【9】面向對象編程&#xff1a;繼承 目錄 C學習-入門到精通【9】面向對象編程&#xff1a;繼承一、基類與派生類CommunityMember類的繼承層次結構如何定義一個派生類呢 二、基類和派生類間的關系1.創建并使用類CommissionEmployee2.不使用繼承創建類BasePlusCo…

黑馬k8s(十七)

一&#xff1a;高級存儲 1.高級存儲-pv和pvc介紹 2.高級存儲-pv 3.高級存儲-pvc 最后一個改成5gi pvc3是沒有來綁定成功的 pv3沒有綁定 刪除pod、和pvc&#xff0c;觀察狀態&#xff1a; 4.高級存儲-pc和pvc的生命周期 二&#xff1a;配置存儲 1.配置存儲-ConfigMap 2.配…

cf每日刷題c++

目錄 Simple Repetition&#xff08;1000&#xff09; Fashionable Array&#xff08;800&#xff09; Kevin and Arithmetic(800) Permutation Warm-Up(800) Game of Mathletes(900) LRC and VIP(800) Simple Repetition&#xff08;1000&#xff09; https://codeforc…

歷年中國科學技術大學計算機保研上機真題

2025中國科學技術大學計算機保研上機真題 2024中國科學技術大學計算機保研上機真題 2023中國科學技術大學計算機保研上機真題 在線測評鏈接&#xff1a;https://pgcode.cn/school?classification1 拆分數字 題目描述 給定一個數字&#xff0c;拆分成若干個數字之和&#xff…