Sentinel 限流利器(功能以及源碼解析)

Sentinel簡介

Sentinel是阿里開源的一款面向分布式、多語言異構化服務架構的流量治理組件。

主要以流量為切入點,從流量路由、流量控制、流量整形、熔斷降級、系統自適應過載保護、熱點流量防護等多個維度來幫助開發者保障微服務的穩定性。

核心概念

資源
資源是Sentinel中一個非常重要的概念,資源就是Sentinel所保護的對象。

資源可以是一段代碼,又或者是一個接口,Sentinel中并沒有什么強制規定,但是實際項目中一般以一個接口為一個資源,比如說一個http接口,又或者是rpc接口,它們就是資源,可以被保護。

資源是通過Sentinel的API定義的,每個資源都有一個對應的名稱,比如對于一個http接口資源來說,Sentinel默認的資源名稱就是請求路徑。

規則
規則也是一個重要的概念,規則其實比較好理解,比如說要對一個資源進行限流,那么限流的條件就是規則,后面在限流的時候會基于這個規則來判定是否需要限流。

Sentinel的規則分為流量控制規則、熔斷降級規則以及系統保護規則,不同的規則實現的效果不一樣。

Demo

1、基本使用
引入依賴

<dependency><groupId>com.alibaba.csp</groupId><artifactId>sentinel-core</artifactId><version>1.8.6</version>
</dependency>

測試代碼

public class SentinelSimpleDemo {public static void main(String[] args) {//加載流控規則initFlowRules();for (int i = 0; i < 5; i++) {Entry entry = null;try {entry = SphU.entry("sayHello");//被保護的邏輯System.out.println("訪問sayHello資源");} catch (BlockException ex) {System.out.println("被流量控制了,可以進行降級處理");} finally {if (entry != null) {entry.exit();}}}}private static void initFlowRules() {List<FlowRule> rules = new ArrayList<>();//創建一個流控規則FlowRule rule = new FlowRule();//對sayHello這個資源限流rule.setResource("sayHello");//基于qps限流rule.setGrade(RuleConstant.FLOW_GRADE_QPS);//qps最大為2,超過2就要被限流rule.setCount(2);rules.add(rule);//設置規則FlowRuleManager.loadRules(rules);}}

initFlowRules方法就是加載一個限流的規則,這個規則作用于sayHello這個資源,基于qps限流,當qps超過2之后就會觸發限流。

SphU.entry(“sayHello”)這行代碼是Sentinel最最核心的源碼。這行代碼表明接下來需要訪問某個資源(參數就是資源名稱),會去檢查需要被訪問的資源是否達到設置的流控、熔斷等規則。對于demo來說,就是檢查sayHello這個資源是否達到了設置的流量控制規則。

catch BlockException也很重要,當拋出BlockException這個異常,說明觸發了一些設置的保護規則,比如限流了,這里面就可以進行降級操作。

System.out.println(“訪問sayHello資源”)這行代碼表面是一個打印語句,實則就是前面一直在說的需要被保護的資源。

上面這段代碼的整體意思就是對sayHello這個需要訪問的資源設置了一個流控規則,規則的內容是當qps到達2的時候觸發限流,之后循環5次訪問sayHello這個資源,在訪問之前通過SphU.entry(“sayHello”)這行代碼進行限流規則的檢查,如果達到了限流的規則的條件,會拋出BlockException。

測試結果
在這里插入圖片描述

從結果可以看出,當前兩次訪問sayHello成功之后,qps達到了2,之后再訪問就被限流了,失敗了。

2、集成Spring
在實際的項目使用中一般不會直接寫上面的那段demo代碼,而是集成到Spring環境底下。

引入依賴

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><version>2.2.5.RELEASE</version>
</dependency>
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-sentinel</artifactId><version>2.2.5.RELEASE</version>
</dependency>

之后提供一個/sayHello接口

@RestController
public class SentinelDemoController {@GetMapping("/sayHello")public String sayHello() throws InterruptedException {return "hello";}}

配置文件

server:port: 9527spring:application:name: SentinelDemo

前面在說資源概念的時候,提到Sentinel中默認一個http接口就是一個資源,并且資源的名稱就是接口的請求路徑。

Sentinel實現了SpringMVC中的HandlerInterceptor接口,在調用Controller接口之前,會將一個調用接口設置為一個資源,代碼如下

在這里插入圖片描述

而getResourceName方法就是獲取資源名,其實就是接口的請求路徑,比如前面提供的接口路徑是/sayHello,那么資源名就是/sayHello。

再后面的代碼就是調用上面demo中提到的SphU.entry(…)方法,檢查被調用的資源是否達到了設置的規則。

既然資源默認是接口,已經有了,那么規則呢?

規則當然可以按照第一個demo的方式來做,比如在Controller接口中加載,代碼如下。

@RestController
public class SentinelDemoController {static {List<FlowRule> rules = new ArrayList<>();//創建一個流控規則FlowRule rule = new FlowRule();//對/sayHello這個資源限流rule.setResource("/sayHello");//基于qps限流rule.setGrade(RuleConstant.FLOW_GRADE_QPS);//qps最大為2,超過2就要被限流rule.setCount(2);rules.add(rule);//設置規則FlowRuleManager.loadRules(rules);}@GetMapping("/sayHello")public String sayHello() throws InterruptedException {return "hello";}}

此時啟動項目,在瀏覽器輸入以下鏈接

http://localhost:9527/sayHello

瘋狂快速使勁地多點幾次,就出現下面這種情況
在這里插入圖片描述

可以看出規則生效了,接口被Sentinel限流了,至于為什么出現這個提示,是因為Sentinel有默認的處理BlockException的機制,就在前面提到的進入資源的后面。
在這里插入圖片描述

當然,你也可以自定義處理的邏輯,實現BlockExceptionHandler接口就可以了。

雖然上面這種硬編碼規則的方式可以使用,但是在實際的項目中,肯定希望能夠基于系統當期那運行的狀態來動態調整規則,所以Sentinel提供了一個叫Dashboard應用的控制臺,可以通過控制臺來動態修改規則。
在這里插入圖片描述

控制臺其實就是一個jar包,可以從Sentinel的github倉庫上下載

之后通過java -jar命令啟動就可以了,端口默認8080,瀏覽器訪問http://ip:8080/#/login就可以登錄控制臺了,用戶名和密碼默認都是sentinel。

此時服務要接入控制臺,只需要在配置文件上加上控制臺的ip和端口即可

spring:cloud:sentinel:transport:# 指定控制臺的ip和端口dashboard: localhost:8080

項目剛啟動的時候控制臺默認是沒有數據的,需要訪問一下接口,之后就有了。
在這里插入圖片描述

之后就可以看到/sayHello這個資源,后面就可以通過頁面設置規則。

核心原理

Sentinel會為每個資源創建一個處理鏈條,就是一個責任鏈,第一次訪問這個資源的時候創建,之后就一直復用,所以這個處理鏈條每個資源有且只有一個。

SphU.entry(…)這行代碼背后就會調用責任鏈來完成對資源的檢查邏輯。

這個責任鏈條中每個處理節點被稱為ProcessorSlot,中文意思就是處理器槽
在這里插入圖片描述

這個ProcessorSlot有很多實現,但是Sentinel的核心就下面這8個:

  • NodeSelectorSlot
  • ClusterBuilderSlot
  • LogSlot
  • StatisticSlot
  • AuthoritySlot
  • SystemSlot
  • FlowSlot
  • DegradeSlot

這些實現會通過SPI機制加載,然后按照一定的順序組成一個責任鏈。

默認情況下,節點是按照如下的順序進行排序的
在這里插入圖片描述

雖然默認就8個,但是如果你想擴展,只要實現ProcessorSlot,按照SPI的規定配置一下就行。

1、NodeSelectorSlot
這個節點的作用是來設置當前資源對應的入口的統計Node。

首先什么是統計Node?

比如就拿上面的例子來說,當/sayHello這個資源的qps超過2的時候,要觸發限流。

但是有個疑問,Sentinel是怎么知道/sayHello這個資源的qps是否達到2呢?

當然是需要進行數據統計的,只有通過統計,才知道qps是否達到2,這個進行數據統計的類在Sentinel中叫做Node。

在這里插入圖片描述

通過Node這個統計的類就知道有多少請求,成功多少個,失敗多少個,qps是多少之類的。底層其實是使用到了滑動窗口算法。

那么什么叫對應的入口?

在Sentinel中,支持同一個資源有不同的訪問入口。

舉個例子,這個例子后面會反復提到。

假設把杭州看做是服務,西湖看做是一個資源,到達西湖有兩種方式,地鐵和公交。
在這里插入圖片描述

所以要想訪問西湖這個資源,就可以通過公交和地鐵兩種方式,而公交和地鐵就對應前面說的入口的意思。

只不過一般一個資源就一個入口,比如一個http接口一般只能通過http訪問,但是Sentinel支持多入口,你可以不用,但是Sentinel有。

所以NodeSelectorSlot的作用就是選擇資源在當前調用入口的統計Node,這樣就實現了統計同一個資源在不同入口訪問數據,用上面的例子解釋,就可以實現分別統計通過公交和地鐵訪問西湖的人數。

資源的入口可以在進入資源之前通過ContextUtil.enter(“入口名”, origin)來指定,如果不指定,那么入口名稱默認就是sentinel_default_context。

在SpringMVC環境底下,所有的http接口資源,默認的入口都是sentinel_spring_web_context
在這里插入圖片描述

入口名稱也可以通過控制臺看到
在這里插入圖片描述

2、ClusterBuilderSlot
ClusterBuilderSlot的作用跟NodeSelectorSlot其實是差不多的,也是用來選擇統計Node,但是選擇的Node的統計維護跟NodeSelectorSlot不一樣。

ClusterBuilderSlot會選擇兩個統計Node:

  • 第一個統計Node是資源的所有入口的統計數據之和,就是資源訪問的總數據

  • 第二個統計Node就是統計資源調用者對資源訪問數據

資源調用者很好理解,比如一個http接口資源肯定會被調用,那么調用這個接口的服務或者應用其實就是資源的調用者,但是一般資源的調用者就是指某個服務。

一個接口可以被很多服務調用,所以一個資源可以很多調用者,而不同調用者都會有單獨的一個統計Node,用來分別統計不同調用者對資源的訪問數據。

舉個例子,現在訪問西湖這個資源的人來自上海,那么就會為上海創建一個統計Node,用來統計所有來自上海的人數,如果是北京,那么就會為北京創建一個統計Node。

那么如何知道訪問資源來自哪個服務(調用者)呢?

也是通過ContextUtil.enter(“入口名”, origin)來指定,這個方法的第二個參數origin就是代表服務名的意思,默認是空。

所以ContextUtil.enter(…)可以同時指定資源的入口和調用者,一個資源一定有入口,因為不指定入口默認就是sentinel_default_context,但是調用者不指定就會沒有。

對于一個http請求來說,Sentinel默認服務名需要放到S-user這個請求頭中,所以如果你想知道接口的調用服務,需要在調用方發送請求的時候將服務名設置到S-user請求頭中。

當資源所在的服務接收到請求時,Sentinel就會從S-user請求頭獲取到服務名,之后再通過ContextUtil.enter(“入口名”, “調用者名”)來設置當前資源的調用者
在這里插入圖片描述
一個資源其實有三種維度的統計Node:

  • 分別統計不同入口的訪問數據
  • 統計所有入口訪問數據之和
  • 分別統計來自某個服務的訪問數據

不同入口的訪問數據就叫他DefaultNode,統計所有入口訪問數據之和就叫他ClusterNode,來自某個服務的訪問數據就叫他OriginNode。

在這里插入圖片描述

3、LogSlot
這個Slot沒什么好說的,通過名字可以看出來,其實就是用來打印日志的。
在這里插入圖片描述

當發生異常,就會打印日志。

4、StatisticSlot
這個Slot就比較重要了,就是用來統計數據的。

前面說的NodeSelectorSlot和ClusterBuilderSlot,他們的作用就是根據資源當前的入口和調用來源來選擇對應的統計Node。

而StatisticSlot就是對這些統計Node進行實際的統計,比如加一下資源的訪問線程數,資源的請求數量等等。
在這里插入圖片描述

前幾個Slot其實都是準備、統計的作用,并沒有涉及限流降級之類的,他們是為限流降級提供數據支持的。

5、AuthoritySlot
Authority是授權的意思,這個Slot的作用是對資源調用者進行授權,就是黑白名單控制。

可以通過控制臺來添加授權規則。
在這里插入圖片描述

在AuthoritySlot中會去獲取資源的調用者,之后會跟授權規則中的資源應用這個選項進行匹配,之后就會出現有以下2種情況:

授權類型是黑名單,匹配上了,說明在黑名單內,那么這個服務就不能訪問這個資源,沒匹配上就可以訪問

授權類型是白名單。匹配上了,說明在白名單內,那么這個服務就可以訪問這個資源,沒匹配上就不可以訪問

6、SystemSlot
這個的作用是根據整個系統運行的統計數據來限流的,防止當前系統負載過高。

它支持入口qps、線程數、響應時間、cpu使用率、負載5個限流的維度。
在這里插入圖片描述

對于系統的入口qps、線程數、平均響應時間這些指標,也會有一個統計Node專門去統計,所以這個統計Node的作用就好比會去統計所有訪問西湖的人數,統計也在StatisticSlot代碼中。
在這里插入圖片描述

至于cpu使用率、負載指標,Sentinel會啟動一個定時任務,每隔1s會去讀取一次當前系統的cpu和負載。

7、FlowSlot
這個Slot會根據預設的規則,結合前面的統計出來的實時信息進行流量控制。

在說FlowSlot之前,先來用之前畫的那張圖回顧一下一個資源的三種統計維度
在這里插入圖片描述
限流規則配置項比較多
在這里插入圖片描述
針對來源,來源就是前面說的調用方,這個配置表明,這個規則適用于哪個調用方,默認是default,就是指規則適用于所有調用方,如果指定了調用方,那么這個規則僅僅對指定的調用方生效。

舉個例子來說,比如說現在想限制來自上海的訪問的人數,那么針對來源可以填上海,之后當訪問的人來自上海的時候,Sentinel就會根據上海對應的OriginNode數據來判斷是否達到限流的條件。

閾值類型,就是限流條件,當資源的qps或者訪問的線程數到達設置的單機閾值,就會觸發限流。

是否集群,這個作用是用來對集群控制的,因為一個服務可能在很多臺機器上,而這個的作用就是將整個集群看成一個整體來限流,這里就不做深入討論。

流控模式,這個流控模式的選項僅僅對閾值類型為qps有效,當閾值類型線程數時無效。

這個配置就比較有意思了,分為直接、關聯、鏈路三種模式。

直接模式的意思就是當未設置針對來源時,資源的ClusterNode統計數據統計達到了閾值,就會觸發限流。

比如,當通過地鐵和公交訪問西湖人數之和達到單機閾值之后就會觸發限流。

關聯模式下需要填寫關聯的資源名稱
在這里插入圖片描述

關聯的意思就是當關聯資源的ClusterNode統計的qps達到了設置的閾值時,就會觸發當前資源的限流操作。

比如,假設現在西湖這個資源關聯了雷峰塔這個資源,那么當訪問雷峰塔的人數達到了指定的閾值之后,此時就觸發西湖這個資源的限流,就是雷峰塔流量高了但是限流的是西湖。

鏈路模式也一樣,它需要關聯一個入口資源
在這里插入圖片描述

關聯入口的意思就是指,當訪問資源的實際入口跟關聯入口是一樣的時候,就會根據這個入口對應的DefaultNode的統計數據來判斷是否需要限流。

也就是可以單獨限制通過公交和地鐵的訪問的人數的意思。

到這,其實前面說到的一個資源的三種統計維度的數據都用到了,現在應該明白了為什么需要這么多維度的數據,就是為不同維度限流準備的。

最后一個配置項,流控效果,這個就是如果是通過qps來限流,并且達到了限流的條件之后會做什么,如果是線程數,就直接拋出BlockException異常

也有三種方式,快速失敗、Warm Up、排隊等待

快速失敗的意思就是指一旦觸發限流了,那么直接拋出BlockException異常

Warm Up的作用就是為了防止系統流量突然增加時出現瞬間把系統壓垮的情況。通過"冷啟動",讓通過的流量緩慢增加,在一定時間內逐漸增加到閾值上限。

排隊等待,很好理解,意思當出現限流了,不是拋異常,而是去排隊等待一定時間,其實就是讓請求均勻速度通過,內部使用的是漏桶算法。

DegradeSlot
這是整個責任鏈中最后一個slot,這個slot的作用是用來熔斷降級的。

Sentinel支持三種熔斷策略:慢調用比例、異常比例 、異常數,通過規則配置也可以看出來。
在這里插入圖片描述

熔斷器的工作流程大致如下
在這里插入圖片描述

Sentinel會為每個設置的規則都創建一個熔斷器,熔斷器有三種狀態,OPEN(打開)、HALF_OPEN(半開)、CLOSED(關閉)

當處于CLOSED狀態時,可以訪問資源,訪問之后會進行慢調用比例、異常比例、異常數的統計,一旦達到了設置的閾值,就會將熔斷器的狀態設置為OPEN

當處于OPEN狀態時,會去判斷是否達到了熔斷時間,如果沒到,拒絕訪問,如果到了,那么就將狀態改成HALF_OPEN,然后訪問資源,訪問之后會對訪問結果進行判斷,符合規則設置的要求,直接將熔斷器設置為CLOSED,關閉熔斷器,不符合則還是改為OPEN狀態

當處于HALF_OPEN狀態時,直接拒絕訪問資源

一般來說,熔斷降級其實是對于服務的調用方來說的。

在項目中會經常調用其它服務或者是第三方接口,而對于這些接口,一旦它們出現不穩定,就有可能導致自身服務長時間等待,從而出現響應延遲等等問題。

此時服務調用方就可基于熔斷降級方式解決。

一旦第三方接口響應時間過長,那么就可以使用慢調用比例規則,當出現大量長時間響應的情況,那么就直接熔斷,不去請求。

雖然說熔斷降級是針對服務的調用方來說,但是Sentinel本身并沒有限制熔斷降級一定是調用其它的服務。

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

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

相關文章

子數組 之 logTrick算法,求解或,與,LCM,GCD

文章目錄 gcd的問題最大公約數 求解子數組的&,|,lcm,gcd的最值or計數問題&#xff0c;如果采用暴力的做法&#xff0c;那么時間復雜度會來到o(n^2),其實在求解的過程中&#xff0c;會出現很多的結果不變的情況&#xff0c;所以我們就可以提前結束 存在一定的單調性&#x…

How to use pgbench to test performance for PostgreSQL?

pgbench 是一個用于測試 PostgreSQL 數據庫性能的基準測試工具。通過模擬多個客戶端并發執行 SQL 查詢&#xff0c;它可以幫助你評估數據庫的性能。以下是使用 pgbench 的基本步驟&#xff1a; 安裝 pgbench pgbench 是 PostgreSQL 的一部分&#xff0c;因此在安裝 PostgreSQ…

應用服務接口第二次請求一直pending問題

目錄 一、問題背景二、問題排查過程三、解決方案四、總結 一、問題背景 升級內容發布到灰度環境&#xff0c;驗證相關服務&#xff0c;查看接口調用日志&#xff0c;發現第一次請求正常&#xff0c;第二次相同接口請求就一直pending&#xff0c;其他服務也是如此 二、問題排查…

嵌入式八股RTOS與Linux---網絡系統篇

前言 關于計網的什么TCP三次握手 幾層模型啊TCP報文啥的不在這里講,會單獨分成一個計算機網絡模塊 ??這里主要介紹介紹lwip和socket FreeRTOS下的網絡接口–移植LWIP 實際上FreeRTOS并不自帶網絡接口,我們一般會通過移植lwip協議棧讓FreeRTOS可以通過網絡接口收發數據,具體可…

推薦一款好看的 vue3 后臺模板

SoybeanAdmin 項目簡介 SoybeanAdmin 是一個基于最新前端技術棧的清新、優雅、高顏值且功能強大的后臺管理模板。它采用 Vue3, Vite5, TypeScript, Pinia, NaiveUI 和 UnoCSS 構建&#xff0c;為開發者提供了一個現代化、高效且易于擴展的后臺管理系統解決方案。 主要特點&am…

【django】1-1 django構建web程序的基礎知識

文章目錄 1 構建web應用的基礎知識1.1 互聯網相關的概念1.2 互聯網協議DNS(域名系統)IP協議(互聯網絡協議)TCP(傳輸控制協議)HTTP(超文本傳輸協議)SSL(安全套接字層)TLS(傳輸層安全) 1.3 URL 2 web程序2.1 web程序的本質2.2 web框架的設計模式1.2.1 經典的MVC設計模式1.2.2 Dja…

【智能體】從一個聊天工作流了解LangGraph

1. 前言 這篇文章將從如何搭建一個帶網絡搜索功能的聊天機器人工作流&#xff0c;帶你初步了解 LangGraph。 2. 前提條件 已搭建 Python 開發環境&#xff0c;使用 3.11 以上版本。 已熟悉 Python 基礎語法。可參考&#xff1a;【LLM】Python 基礎語法_llm python入門-CSDN博…

JAVA開發:實例成員與靜態成員

判斷Java中的實例成員與靜態成員 在Java中&#xff0c;可以通過以下幾種方式判斷一個成員是實例成員還是靜態成員&#xff1a; 1. 通過聲明方式判斷 靜態成員使用static關鍵字修飾&#xff0c;實例成員不使用&#xff1a; public class MyClass {// 實例成員int instanceVa…

Softmax 回歸 + 損失函數 + 圖片分類數據集

Softmax 回歸 softmax 回歸是機器學習另外一個非常經典且重要的模型&#xff0c;是一個分類問題。 下面先解釋一下分類和回歸的區別&#xff1a; 簡單來說&#xff0c;分類問題從回歸的單輸出變成了多輸出&#xff0c;輸出的個數等于類別的個數。 實際上&#xff0c;對于分…

MySQL-存儲過程

介紹 基本語法 創建 調用 查看 刪除 變量 系統變量 查看 設置 用戶定義變量 賦值 使用 局部變量 聲明 賦值 流程控制 參數 條件結構 IF case 循環結構 while repeat loop 游標 條件處理程序 介紹 舉個簡單的例子&#xff0c;我們先select某數據&…

使用 Go 和 Gin 實現高可用負載均衡代理服務器

前言 在現代分布式系統中,負載均衡是保障服務高可用性和性能的核心技術。本文將基于 Go 語言和 Gin 框架實現一個支持動態路由、健康檢查、會話保持等特性的企業級負載均衡代理服務器,并提供完整的壓力測試方案和優化建議。 通過本方案實現的負載均衡代理具備以下優勢: 單…

在 Linux(Ubuntu / CentOS 7)上快速搭建我的世界 MineCraft 服務器,并實現遠程聯機,詳細教程

Linux 部署 MineCraft 服務器 詳細教程&#xff08;丐版&#xff0c;無需云服務器&#xff09; 一、虛擬機 Ubuntu 部署二、下載 Minecraft 服務端三、安裝 JRE 21四、安裝 MCS manager 面板五、搭建服務器六、本地測試連接七、下載櫻花&#xff0c;實現內網穿透&#xff0c;邀…

批量取消 PDF 文檔中的所有超鏈接

在 PDF 文檔中我們可以插入各種各樣的文本也可以給文本設置字體&#xff0c;顏色等多種樣式&#xff0c;同時還可以給文字或者圖片添加上超鏈接&#xff0c;當我們點擊超鏈接之后&#xff0c;就會跳轉到對應的網頁。有時候這會對我們的閱讀或者使用形成一定的干擾&#xff0c;今…

Ubuntu xinference部署本地模型bge-large-zh-v1.5、bge-reranker-v2-m3

bge-large-zh-v1.5 下載模型到指定路徑&#xff1a; modelscope download --model BAAI/bge-large-zh-v1.5 --local_dir ./bge-large-zh-v1.5自定義 embedding 模型&#xff0c;custom-bge-large-zh-v1.5.json&#xff1a; {"model_name": "custom-bge-large…

Vue的實例

Every Vue application starts with a single Vue component instance as the application root. Any other Vue component created in the same application needs to be nested inside this root component. 每個 Vue 應用都以一個 Vue 組件實例作為應用的根開始。在同一個應…

Linux學習筆記(應用篇三)

基于I.MX6ULL-MINI開發板 LED學習GPIO應用編程輸入設備 開發板中所有的設備&#xff08;對象&#xff09;都會在/sys/devices 體現出來&#xff0c;是 sysfs 文件系統中最重要的目錄結構 /sys下的子目錄說明/sys/devices這是系統中所有設備存放的目錄&#xff0c;也就是系統中…

【圖論】網絡流算法入門

&#xff08;決定狠狠加訓圖論了&#xff0c;從一直想學但沒啟動的網絡流算法開始。&#xff09; 網絡流問題 ? 問題定義&#xff1a;在帶權有向圖 G ( V , E ) G(V, E) G(V,E) 中&#xff0c;每條邊 e ( u , v ) e(u, v) e(u,v) 有容量 c ( u , v ) c(u, v) c(u,v)&am…

遞歸、搜索與回溯第四講:floodfill算法

遞歸、搜索與回溯第四講&#xff1a;floodfill算法 1.Floodfill算法介紹2.圖像渲染3.島嶼數量4.島嶼的最大面積5.被圍繞的區域6.太平洋大西洋水流問題7.掃雷游戲8.衣櫥整理 1.Floodfill算法介紹 2.圖像渲染 3.島嶼數量 4.島嶼的最大面積 5.被圍繞的區域 6.太平洋大西洋水流問題…

【深度學習與實戰】2.3、線性回歸模型與梯度下降法先導案例--最小二乘法(向量形式求解)

為了求解損失函數 對 的導數&#xff0c;并利用最小二乘法向量形式求解 的值? 這是?線性回歸?的平方誤差損失函數&#xff0c;目標是最小化預測值 與真實值 之間的差距。 ?損失函數?&#xff1a; 考慮多個樣本的情況&#xff0c;損失函數為所有樣本的平方誤差之和&a…

氣象可視化衛星云圖的方式:方法與架構詳解

氣象衛星云圖是氣象預報和氣候研究的重要數據來源。通過可視化技術,我們可以將衛星云圖數據轉化為直觀的圖像或動畫,幫助用戶更好地理解氣象變化。本文將詳細介紹衛星云圖可視化的方法、架構和代碼實現。 一、衛星云圖可視化方法 1. 數據獲取與預處理 衛星云圖數據通常來源…