国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Sentinel為什么這么強,我扒了扒背后的實現(xiàn)原理

這篇具有很好參考價值的文章主要介紹了Sentinel為什么這么強,我扒了扒背后的實現(xiàn)原理。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

大家好,我是三友~~

最近我在整理代碼倉庫的時候突然發(fā)現(xiàn)了被塵封了接近兩年之久的Sentinel源碼庫

兩年前我出于好奇心扒了一下Sentinel的源碼,但是由于Sentinel本身源碼并不復雜,在簡單扒了扒之后幾乎就再沒扒過了

那么既然現(xiàn)在又讓我看到了,所以我準備再來好好地扒一扒,然后順帶寫篇文章來總結一下。

Sentinel簡介

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

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

上面兩句話來自Sentinel官網(wǎng)的自我介紹,從這短短的兩句話就可以看出Sentinel的定位和強大的功能。

核心概念

要想理解一個新的技術,那么首先你得理解它的一些核心概念

資源

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

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

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

規(guī)則

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

Sentinel的規(guī)則分為流量控制規(guī)則、熔斷降級規(guī)則以及系統(tǒng)保護規(guī)則,不同的規(guī)則實現(xiàn)的效果不一樣。

來個Demo

為了兼顧文章的完整性和我一貫的風格,必須要來個demo,如果你已經(jīng)使用過了Sentinel,那么就可以直接pass這一節(jié),直接快進到核心原理。

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)?{
????????//加載流控規(guī)則
????????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<>();

????????//創(chuàng)建一個流控規(guī)則
????????FlowRule?rule?=?new?FlowRule();
????????//對sayHello這個資源限流
????????rule.setResource("sayHello");
????????//基于qps限流
????????rule.setGrade(RuleConstant.FLOW_GRADE_QPS);
????????//qps最大為2,超過2就要被限流
????????rule.setCount(2);

????????rules.add(rule);

????????//設置規(guī)則
????????FlowRuleManager.loadRules(rules);
????}

}

解釋一下上面這段代碼的意思

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

  • SphU.entry("sayHello")這行代碼是Sentinel最最核心的源碼,這行代碼表面看似風平浪靜,實則暗流涌動。這行代碼表明接下來需要訪問某個資源(參數(shù)就是資源名稱),會去檢查需要被訪問的資源是否達到設置的流控、熔斷等規(guī)則。對于demo來說,就是檢查sayHello這個資源是否達到了設置的流量控制規(guī)則。

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

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

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

測試結果

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

2、集成Spring

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

引入依賴

<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:?9527
??
spring:
??application:
????name:?SentinelDemo

到這demo就搭建完成了。

此時你心理肯定有疑問,那前面提到的資源和對應的規(guī)則去哪了?

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

而真正的原因是Sentinel實現(xiàn)了SpringMVC中的HandlerInterceptor接口,在調(diào)用Controller接口之前,會將一個調(diào)用接口設置為一個資源,代碼如下

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

再后面的代碼就是調(diào)用上面demo中提到表面風平浪靜,實則暗流涌動的SphU.entry(..)方法,檢查被調(diào)用的資源是否達到了設置的規(guī)則。

好了,既然資源默認是接口,已經(jīng)有了,那么規(guī)則呢?

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

@RestController
public?class?SentinelDemoController?{

????static?{
????????List<FlowRule>?rules?=?new?ArrayList<>();

????????//創(chuàng)建一個流控規(guī)則
????????FlowRule?rule?=?new?FlowRule();
????????//對/sayHello這個資源限流
????????rule.setResource("/sayHello");
????????//基于qps限流
????????rule.setGrade(RuleConstant.FLOW_GRADE_QPS);
????????//qps最大為2,超過2就要被限流
????????rule.setCount(2);

????????rules.add(rule);

????????//設置規(guī)則
????????FlowRuleManager.loadRules(rules);
????}

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

}

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

http://localhost:9527/sayHello

瘋狂快速使勁地多點幾次,就出現(xiàn)下面這種情況

可以看出規(guī)則生效了,接口被Sentinel限流了,至于為什么出現(xiàn)這個提示,是因為Sentinel有默認的處理BlockException的機制,就在前面提到的進入資源的后面。

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

雖然上面這種硬編碼規(guī)則的方式可以使用,但是在實際的項目中,肯定希望能夠基于系統(tǒng)當期那運行的狀態(tài)來動態(tài)調(diào)整規(guī)則,所以Sentinel提供了一個叫Dashboard應用的控制臺,可以通過控制臺來動態(tài)修改規(guī)則。

控制臺其實就是一個jar包,可以從Sentinel的github倉庫上下載,或者是通過從下面這個地址獲取。

鏈接:https://pan.baidu.com/s/1Lw8V5ab_FUq934nLWDjfaw 提取碼:obr5

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

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

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

項目剛啟動的時候控制臺默認是沒有數(shù)據(jù)的,需要訪問一下接口,之后就有了。

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

核心原理

講完demo,接下來就來講一講Sentinel的核心原理,也就是前面提到暗流涌動的SphU.entry(..)這行代碼背后的邏輯。

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

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

這個責任鏈條中每個處理節(jié)點被稱為ProcessorSlot,中文意思就是處理器槽

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

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

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

默認情況下,節(jié)點是按照如下的順序進行排序的

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

下面就來按照上面節(jié)點的處理順序來好好扒一扒這8個ProcessorSlot。

1、NodeSelectorSlot

這個節(jié)點的作用是來設置當前資源對應的入口統(tǒng)計Node。

首先什么是統(tǒng)計Node?

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

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

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

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

那么什么叫對應的入口?

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

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

假設把杭州看做是服務,西湖看做是一個資源,到達西湖有兩種方式,地鐵和公交。

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

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

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

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

在SpringMVC環(huán)境底下,所有的http接口資源,默認的入口都是sentinel_spring_web_context

入口名稱也可以通過控制臺看到

那么為什么要搞一個入口的概念呢?這里咱先留個懸念,后面再說。

2、ClusterBuilderSlot

ClusterBuilderSlot的作用跟NodeSelectorSlot其實是差不多的,也是用來選擇統(tǒng)計Node,但是選擇的Node的統(tǒng)計維護跟NodeSelectorSlot不一樣。

ClusterBuilderSlot會選擇兩個統(tǒng)計Node:

  • 第一個統(tǒng)計Node是資源的所有入口的統(tǒng)計數(shù)據(jù)之和,就是資源訪問的總數(shù)據(jù)

  • 第二個統(tǒng)計Node就是統(tǒng)計資源調(diào)用者對資源訪問數(shù)據(jù)

資源調(diào)用者很好理解,比如一個http接口資源肯定會被調(diào)用,那么調(diào)用這個接口的服務或者應用其實就是資源的調(diào)用者,但是一般資源的調(diào)用者就是指某個服務,后面調(diào)用者我可能會以服務來代替。

一個接口可以被很多服務調(diào)用,所以一個資源可以很多調(diào)用者,而不同調(diào)用者都會有單獨的一個統(tǒng)計Node,用來分別統(tǒng)計不同調(diào)用者對資源的訪問數(shù)據(jù)。

舉個例子,現(xiàn)在訪問西湖這個資源的大兄弟來自上海,那么就會為上海創(chuàng)建一個統(tǒng)計Node,用來統(tǒng)計所有來自上海的人數(shù),如果是北京,那么就會為北京創(chuàng)建一個統(tǒng)計Node。

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

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

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

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

當資源所在的服務接收到請求時,Sentinel就會從S-user請求頭獲取到服務名,之后再通過ContextUtil.enter("入口名", "調(diào)用者名")來設置當前資源的調(diào)用者

這里我原以為Sentinel會適配比如OpenFeign之類的框架,會自動將服務名攜帶到請求頭中,但是我翻了一下源碼,發(fā)現(xiàn)并沒有去適配,不知道是出于什么情況的考慮。

所以這一節(jié)加上上一節(jié),我們知道了一個資源其實有三種維度的統(tǒng)計Node:

  • 分別統(tǒng)計不同入口的訪問數(shù)據(jù)
  • 統(tǒng)計所有入口訪問數(shù)據(jù)之和
  • 分別統(tǒng)計來自某個服務的訪問數(shù)據(jù)

為了方便區(qū)分,我來給這三個統(tǒng)計Node取個響亮的名字

不同入口的訪問數(shù)據(jù)就叫他DefaultNode,統(tǒng)計所有入口訪問數(shù)據(jù)之和就叫他ClusterNode,來自某個服務的訪問數(shù)據(jù)就叫他OriginNode。

是不是夠響亮!

那么他們的關系就可以用下面這個圖來表示

3、LogSlot

這個Slot沒什么好說的,通過名字可以看出來,其實就是用來打印日志的。

當發(fā)生異常,就會打印日志。

4、StatisticSlot

這個Slot就比較重要了,就是用來統(tǒng)計數(shù)據(jù)的。

前面說的NodeSelectorSlot和ClusterBuilderSlot,他們的作用就是根據(jù)資源當前的入口和調(diào)用來源來選擇對應的統(tǒng)計Node。

而StatisticSlot就是對這些統(tǒng)計Node進行實際的統(tǒng)計,比如加一下資源的訪問線程數(shù),資源的請求數(shù)量等等。

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

5、AuthoritySlot

Authority是授權的意思,這個Slot的作用是對資源調(diào)用者進行授權,就是黑白名單控制。

可以通過控制臺來添加授權規(guī)則。

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

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

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

6、SystemSlot

這個的作用是根據(jù)整個系統(tǒng)運行的統(tǒng)計數(shù)據(jù)來限流的,防止當前系統(tǒng)負載過高。

它支持入口qps、線程數(shù)、響應時間、cpu使用率、負載5個限流的維度。

對于系統(tǒng)的入口qps、線程數(shù)、平均響應時間這些指標,也會有一個統(tǒng)計Node專門去統(tǒng)計,所以這個統(tǒng)計Node的作用就好比會去統(tǒng)計所有訪問西湖的人數(shù),統(tǒng)計也在StatisticSlot代碼中,前面說的時候我把代碼隱藏了

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

7、FlowSlot

這個Slot會根據(jù)預設的規(guī)則,結合前面的統(tǒng)計出來的實時信息進行流量控制。

在說FlowSlot之前,先來用之前畫的那張圖回顧一下一個資源的三種統(tǒng)計維度

這里默默地注視10s。。

限流規(guī)則配置項比較多

這里我們來好好扒一扒這些配置項的意思。

針對來源,來源就是前面說的調(diào)用方,這個配置表明,這個規(guī)則適用于哪個調(diào)用方,默認是default,就是指規(guī)則適用于所有調(diào)用方,如果指定了調(diào)用方,那么這個規(guī)則僅僅對指定的調(diào)用方生效。

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

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

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

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

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

直接模式的意思就是當資源的ClusterNode統(tǒng)計數(shù)據(jù)統(tǒng)計達到了閾值,就會觸發(fā)限流。

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

關聯(lián)模式下需要填寫關聯(lián)的資源名稱

關聯(lián)的意思就是當關聯(lián)資源的ClusterNode統(tǒng)計的qps達到了設置的閾值時,就會觸發(fā)當前資源的限流操作。

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

鏈路模式也一樣,它需要關聯(lián)一個入口資源

關聯(lián)入口的意思就是指,當訪問資源的實際入口跟關聯(lián)入口是一樣的時候,就會根據(jù)這個入口對應的DefaultNode的統(tǒng)計數(shù)據(jù)來判斷是否需要限流。

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

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

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

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

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

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

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

DegradeSlot

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

Sentinel支持三種熔斷策略:慢調(diào)用比例、異常比例 、異常數(shù),通過規(guī)則配置也可以看出來。

熔斷器的工作流程大致如下

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

  • 當處于CLOSED狀態(tài)時,可以訪問資源,訪問之后會進行慢調(diào)用比例、異常比例、異常數(shù)的統(tǒng)計,一旦達到了設置的閾值,就會將熔斷器的狀態(tài)設置為OPEN

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

  • 當處于HALF_OPEN狀態(tài)時,直接拒絕訪問資源

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

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

此時服務調(diào)用方就可基于熔斷降級方式解決。

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

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

總結

通過整篇文章的分析之后,再回頭看看Sentinel的簡介的內(nèi)容,其實就能更好地理解Sentinel的定位和功能。

Sentinel核心就是一堆統(tǒng)計數(shù)據(jù)和基于這些統(tǒng)計數(shù)據(jù)實現(xiàn)的流控和熔斷的功能,源碼并不復雜,而且Sentinel的代碼寫得非常好。

最后Sentinel源碼注釋倉庫地址:

https://github.com/sanyou3/sentinel.git

本文demo代碼倉庫地址:

https://github.com/sanyou3/sentinel-demo

往期熱門文章推薦

扒一扒Nacos、OpenFeign、Ribbon、loadbalancer組件協(xié)調(diào)工作的原理

如何去閱讀源碼,我總結了18條心法

如何實現(xiàn)延遲任務,我總結了11種方法

如何寫出漂亮代碼,我總結了45個小技巧

三萬字盤點Spring/Boot的那些常用擴展點

兩萬字盤點那些被玩爛了的設計模式

掃碼或者搜索關注公眾號 三友的java日記 ,及時干貨不錯過,公眾號致力于通過畫圖加上通俗易懂的語言講解技術,讓技術更加容易學習,回復 面試 即可獲得一套面試真題。文章來源地址http://www.zghlxwxcb.cn/news/detail-424766.html

到了這里,關于Sentinel為什么這么強,我扒了扒背后的實現(xiàn)原理的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉載,請注明出處: 如若內(nèi)容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • 職場工作多年,為什么成長這么慢

    在職場工作多年,卻沒有成長,是許多人都會遇到的問題。這種情況可能讓人感到沮喪和無助,但是它的根本原因是什么呢?在本文中,我們將探討為什么會出現(xiàn)這種情況,以及如何克服這種困境。 成長需要我們對自己的能力和表現(xiàn)進行評估和反思。如果沒有對自己的工作進

    2023年04月16日
    瀏覽(32)
  • 為什么這么設計—— Go的GC

    Go語言采用了3色標記清理法來對內(nèi)存進行自動垃圾回收, 過程是這樣的: (1)起初所有的對象都是白色的; (2)從根對象出發(fā)掃描所有可達對象,標記為灰色,放入待處理隊列; (3)從待處理隊列中取出灰色對象,將其引用的對象標記為灰色并放入待處理隊列中,自身標

    2024年02月12日
    瀏覽(20)
  • 48 | DMA:為什么Kafka這么快?

    48 | DMA:為什么Kafka這么快?

    過去幾年里,整個計算機產(chǎn)業(yè)界,都在嘗試不停地提升 I/O 設備的速度。把 HDD 硬盤換成 SSD 硬盤,我們?nèi)匀挥X得不夠快;用 PCI Express 接口的 SSD 硬盤替代 SATA 接口的 SSD 硬盤,我們還是覺得不夠快,所以,現(xiàn)在就有了傲騰(Optane)這樣的技術。 但是,無論 I/O 速度如何提升,

    2024年02月21日
    瀏覽(16)
  • 為什么現(xiàn)在原生家庭的問題這么嚴重?

    匿名用戶 191 人贊同了該回答 換一個玄學的角度來看這個問題,之前看b站,有一個up主說,中國有歷史記載的人口數(shù)一直都很穩(wěn)定,7-8千萬到1億左右,明朝2億,清朝到民國算是增長比較多的,有4億,但是從開國到現(xiàn)在增長了10億,從輪回的角度來講,哪來那么多的人來轉世

    2024年02月13日
    瀏覽(35)
  • 玩轉Discord:為什么它這么吸引加密社區(qū)?

    玩轉Discord:為什么它這么吸引加密社區(qū)?

    ? ? Twitter、Telegram、Discord,目前加密貨幣項目和社區(qū)必備的三件套,其重要程度堪比國內(nèi)所說的“兩微一抖(微博、微信和抖音)”。 Twitter和Telegram國內(nèi)的用戶還算了解,Discord相對來說就比較陌生了,但是近一年以來,隨著國內(nèi)社交平臺的審查收緊,NFT、DAO的盛行,Discor

    2024年02月04日
    瀏覽(29)
  • 電腦為什么這么卡?6個方法處理電腦卡頓

    電腦為什么這么卡?6個方法處理電腦卡頓

    你是否打開電腦就卡到不行?電腦的開機速度慢,就連打開網(wǎng)頁也在轉圈圈,一直加載不出來。世界上最痛苦的事莫過于此,想要好好工作,卻一直加載不出網(wǎng)頁。 你知道電腦為什么這么卡嗎? 其實大多數(shù)的原因都在這篇文章列出來了,有興趣的朋友一起來看看,下面還有

    2024年02月11日
    瀏覽(30)
  • 為什么C++這么復雜還不被淘汰?

    為什么C++這么復雜還不被淘汰?

    C++是一門廣泛使用的編程語言,主要用于系統(tǒng)和應用程序的開發(fā)。盡管C++具有一些復雜的語法和概念,但它仍然是編程界的重量級選手,在編程語言排行榜中一直位居前列。 為什么C++這么復雜還不被淘汰呢? C++有以下優(yōu)勢 1、C++具有高性能 C++是一門編譯型語言,可以直接編

    2024年02月05日
    瀏覽(18)
  • 視頻中為什么需要這么多的顏色空間?

    視頻中為什么需要這么多的顏色空間?

    作者 | 17哥 導讀 :在視頻處理中,我們經(jīng)常會用到不同的色彩空間: 非線性RGB,線性 RGB,YUV,XYZ ……為什么需要這么多的色彩空間呢?為什么在 FFMpeg 中會有 color_space,color_transfer,color_primaries 等一系列的顏色屬性呢?這些術語之間究竟隱藏著什么秘密 ? 全文5840字,預計閱

    2023年04月13日
    瀏覽(22)
  • ChatGPT是怎么實現(xiàn)的?為什么它這么有效?

    ChatGPT是怎么實現(xiàn)的?為什么它這么有效?

    ChatGPT 能夠自動生成類似于人類寫作的文本,這一點非常引人注目,也令人意外。但它是如何實現(xiàn)的?為什么它能夠如此出色地生成我們認為有意義的文本?我的目的是在這里概述ChatGPT內(nèi)部的運行情況,并探討它能夠如此出色地產(chǎn)生有意義文本的原因。 首先需要解釋的是,

    2023年04月26日
    瀏覽(23)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包