電腦做系統(tǒng)網(wǎng)站鄭州網(wǎng)站優(yōu)化培訓(xùn)
目錄
介紹
Sentinel 的特征
Sentinel 的組成
實(shí)戰(zhàn)使用
簡(jiǎn)單實(shí)例
配置本地控制臺(tái)
使用可視化ui配置簡(jiǎn)單流控
配置異步任務(wù)限流
使用注解定義限流資源
SpringCloud整合Sentinel
簡(jiǎn)單整合
?并發(fā)線程流控
關(guān)聯(lián)模式?
整合openFeign使用
介紹
隨著微服務(wù)的流行,服務(wù)和服務(wù)之間的穩(wěn)定性變得越來越重要。Sentinel 以流量為切入點(diǎn),從流量控制、熔斷降級(jí)、系統(tǒng)負(fù)載保護(hù)等多個(gè)維度保護(hù)服務(wù)的穩(wěn)定性。
Sentinel 的特征
豐富的應(yīng)用場(chǎng)景: Sentinel 承接了阿里巴巴近 10 年的雙十一大促流量的核心場(chǎng)景,例如秒殺(即突發(fā)流量控制在系統(tǒng)容量可以承受的范圍)、消息削峰填谷(對(duì)于突然到來的大量請(qǐng)求,您可以配置流控規(guī)則,以穩(wěn)定的速度逐步處理這些請(qǐng)求,從而避免流量突刺造成系統(tǒng)負(fù)載過高)、集群流量控制、實(shí)時(shí)熔斷下游不可用應(yīng)用等
完備的實(shí)時(shí)監(jiān)控: Sentinel 同時(shí)提供實(shí)時(shí)的監(jiān)控功能。您可以在控制臺(tái)中看到接入應(yīng)用的單臺(tái)機(jī)器秒級(jí)數(shù)據(jù),甚至 500 臺(tái)以下規(guī)模的集群的匯總運(yùn)行情況
廣泛的開源生態(tài): Sentinel 提供開箱即用的與其它開源框架 / 庫(kù)的整合模塊,例如與 Spring Cloud、Dubbo、gRPC 的整合。您只需要引入相應(yīng)的依賴并進(jìn)行簡(jiǎn)單的配置即可快速地接入 Sentinel
完善的 SPI 擴(kuò)展點(diǎn): Sentinel 提供簡(jiǎn)單易用、完善的 SPI 擴(kuò)展接口。您可以通過實(shí)現(xiàn)擴(kuò)展接口來快速地定制邏輯。例如定制規(guī)則管理、適配動(dòng)態(tài)數(shù)據(jù)源等
Sentinel 的組成
核心庫(kù)(Java 客戶端): 不依賴任何框架 / 庫(kù),能夠運(yùn)行于所有 Java 運(yùn)行時(shí)環(huán)境,同時(shí)對(duì) Dubbo / Spring Cloud 等框架也有較好的支持
控制臺(tái)(Dashboard): 基于 Spring Boot 開發(fā),打包后可以直接運(yùn)行,不需要額外的 Tomcat 等應(yīng)用容器
實(shí)戰(zhàn)使用
簡(jiǎn)單實(shí)例
準(zhǔn)備一個(gè)springboot項(xiàng)目.這里不再演示如何創(chuàng)建一個(gè)新的springboot項(xiàng)目
添加sentinle必備依賴
<!-- sentinel核心依賴--><dependency><groupId>com.alibaba.csp</groupId><artifactId>sentinel-core</artifactId><version>1.8.6</version></dependency>
書寫接口限流測(cè)試
import com.alibaba.csp.sentinel.Entry;
import com.alibaba.csp.sentinel.SphU;
import com.alibaba.csp.sentinel.slots.block.BlockException;
import com.alibaba.csp.sentinel.slots.block.RuleConstant;
import com.alibaba.csp.sentinel.slots.block.flow.FlowRule;
import com.alibaba.csp.sentinel.slots.block.flow.FlowRuleManager;
import jakarta.annotation.PostConstruct;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;import java.util.ArrayList;
import java.util.List;@RestController
public class TestController {@GetMapping("hello")public String hello(){//使用限流規(guī)則try (Entry entry = SphU.entry("Hello")){ //限流入口System.out.println("你好");return "你好 sentinel"; //被保護(hù)的資源}catch (BlockException e){e.printStackTrace();return "系統(tǒng)繁忙,請(qǐng)稍后"; //被限流或者被降級(jí)的操作處理}}/*** 定義限流規(guī)則* @PostConstruct 當(dāng)前類的構(gòu)造函數(shù)執(zhí)行之后執(zhí)行*/@PostConstructpublic void initFlowRule(){//創(chuàng)建存放限流規(guī)則的集合List<FlowRule> ruleList = new ArrayList<>();//創(chuàng)建限流規(guī)則FlowRule rule = new FlowRule();//定義資源 表示Sentinel會(huì)對(duì)哪個(gè)資源生效 相當(dāng)于做一個(gè)標(biāo)記rule.setResource("Hello");//定義限流規(guī)則類型 RuleConstant.Flow_GRADE_QPS: QPS限流類型rule.setGrade(RuleConstant.FLOW_GRADE_QPS);//定義QPS每秒能通過的請(qǐng)求個(gè)數(shù)rule.setCount(2);//將限流規(guī)則存放到集合中ruleList.add(rule);//加載限流規(guī)則FlowRuleManager.loadRules(ruleList);}
}
這里配置限流規(guī)則為1秒中最多可以通過2次,啟動(dòng)測(cè)試:
?可以看到請(qǐng)求過快的話會(huì)直接返回接口中配置限流規(guī)則后的異常信息,說明sentinel已經(jīng)初步使用成功
配置本地控制臺(tái)
sentinel可以通過配置本地控制臺(tái)ui來進(jìn)行接口限流的可視化管理,首先需要下載官網(wǎng)提供的可視化jar包
Releases · alibaba/Sentinel · GitHub
當(dāng)然有下載比較慢的問題,所以也可以在本博主提供的鏈接里進(jìn)行下載
sentinel1.8.6-jar阿里云下載
下載后在cmd窗口中運(yùn)行啟動(dòng)
java -Dserver.port=9000 -jar sentinel-dashboard-1.8.6.jar
?
瀏覽器地址欄輸入localhost:9000進(jìn)行訪問,賬號(hào)密碼默認(rèn)都是sentinel
?
?此時(shí)登錄后會(huì)發(fā)現(xiàn)沒有被監(jiān)控的服務(wù),因?yàn)樵摽刂婆_(tái)還沒有和本地項(xiàng)目進(jìn)行關(guān)聯(lián)
關(guān)聯(lián)本地項(xiàng)目需要添加控制臺(tái)所需依賴
<!-- 本地sentinel控制臺(tái)依賴--><dependency><groupId>com.alibaba.csp</groupId><artifactId>sentinel-transport-simple-http</artifactId><version>1.8.6</version></dependency>
然后在idea啟動(dòng)配置中添加啟動(dòng)配置
-Dcsp.sentinel.dashboard.server=localhost:9000 ? Sentinel控制臺(tái)的地址和端口號(hào)
-Dproject.name=SentinelQuickStart?? ??? ??? ??? ?本地應(yīng)用在控制臺(tái)中的名稱
這里博主使用的是idea新版ui,和舊版ui可能有些許不同
?
?
?
?
命令配置以空格隔開即可
啟動(dòng)項(xiàng)目后發(fā)現(xiàn)sentinel中可能還是沒有檢測(cè)到服務(wù),這里需要重新調(diào)用下之前配置的限流規(guī)則接口,也就是前面的hello接口,調(diào)用后再刷新sentinel頁(yè)面就可以看到監(jiān)聽的本地服務(wù)了
使用可視化ui配置簡(jiǎn)單流控
前面的流控是在底層書寫代碼進(jìn)行限流控制的,還可以使用可視化ui來配置接口的限流策略
首先注釋掉之前書寫的限流規(guī)則
重啟項(xiàng)目再測(cè)試接口
?
可以看到此時(shí)手寫的限流規(guī)則已失效,切換到sentinel控制臺(tái)
?
?注意此處的資源名要和后臺(tái)接口中配置的資源名一致
點(diǎn)擊保存
再測(cè)試接口
可以看到和之前的手動(dòng)書寫的限流規(guī)則一樣都起到了接口限流的作用,而且在控制臺(tái)中也可以看到接口的監(jiān)控情況
配置異步任務(wù)限流
在主啟動(dòng)類中開啟允許異步任務(wù)
?新建書寫一個(gè)服務(wù)層,并書寫異步方法
?
在sentinel中新增流控規(guī)則:
啟動(dòng)測(cè)試:
?可以看到異步任務(wù)的限流也成功監(jiān)控
使用注解定義限流資源
?前面都是使用的代碼方式來進(jìn)行接口資源的定義,下面使用注解的形式來進(jìn)行資源定義
首先導(dǎo)入所需依賴
<dependency><groupId>com.alibaba.csp</groupId><artifactId>sentinel-annotation-aspectj</artifactId><version>1.8.6</version></dependency>
書寫sentinel注解定義配置類
?書寫接口
?測(cè)試:
?可以看到基于注解定義的流控資源也已生效
SpringCloud整合Sentinel
簡(jiǎn)單整合
新建一個(gè)springboot項(xiàng)目,引入依賴:
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-alibaba-sentinel</artifactId><version>2.2.0.RELEASE</version></dependency>
書寫配置:
server.port=8083
# 設(shè)置本地應(yīng)用名稱
spring.application.name=SentinelSpringCloud
# 設(shè)置sentinel控制臺(tái)的地址和端口
spring.cloud.sentinel.transport.dashboard=localhost:9000
#Spring表達(dá)你允許循環(huán)依賴存在,并且希望Spring能夠自動(dòng)解決這些循環(huán)依賴關(guān)系。啟用此配置后,
# Spring會(huì)嘗試自動(dòng)解決循環(huán)依賴,以支持相關(guān)Bean之間的相互引用。
spring.main.allow-circular-references=true
?書寫接口:?
啟動(dòng)項(xiàng)目
輸入之前的 命令啟動(dòng)下載的可視化jar包
java -Dserver.port=9000 -jar sentinel-dashboard-1.8.6.jar
在控制臺(tái)中添加限流策略資源
?
調(diào)用接口測(cè)試
?并發(fā)線程流控
并發(fā)線程數(shù)
并發(fā)數(shù)控制用于保業(yè)務(wù)線程池不被慢調(diào)用耗盡,例如,當(dāng)應(yīng)用所依賴的下游應(yīng)用由于某種原因?qū)е路?wù)不穩(wěn)定、響應(yīng)延增加對(duì)于調(diào)用者來說,意味著否叫量下降和更多的線程教占用,極端值下其至導(dǎo)致線程池耗盡,為應(yīng)對(duì)大多線程占用的情況,業(yè)內(nèi)有使用隔離的方案,比通過不同業(yè)務(wù)邏使用不同線程池來隔富業(yè)務(wù)自身之間的資源爭(zhēng)搶線程池離),這種屬富方案雖然爆宮性比較好,但是代價(jià)就是線程數(shù)目大多,線程上下文切換的 ovehead 比大,特別是對(duì)低延的調(diào)用有比較的影響,Sein 并發(fā)控制不負(fù)責(zé)創(chuàng)建和管理池,而是簡(jiǎn)單統(tǒng)計(jì)當(dāng)前請(qǐng)求上下文的線數(shù)目(正在執(zhí)行的調(diào)用數(shù)目),如果超出聞值,新的請(qǐng)求會(huì)被立即拒絕,效果類似于信號(hào)量隔離。并發(fā)數(shù)控制涌常在調(diào)用端進(jìn)行配置
調(diào)整接口
新增流控規(guī)則時(shí)選擇并發(fā)線程數(shù)
?啟動(dòng)測(cè)試:
關(guān)聯(lián)模式?
關(guān)聯(lián)當(dāng)兩個(gè)資源之間具有資源爭(zhēng)搶或者依賴關(guān)系的時(shí)候,這兩個(gè)資源便具有了關(guān)聯(lián)。比如對(duì)數(shù)一個(gè)字段的讀和寫操作存在爭(zhēng)搶,讀的速度過高會(huì)影響寫得速度,寫的違度過高會(huì)影響讀的速度如果放任讀寫操作爭(zhēng)搶資源,則爭(zhēng)搶本身帶來的開銷會(huì)降低整體的否量,可使用關(guān)聯(lián)限流來避免具有關(guān)聯(lián)關(guān)系的資源之間過度的爭(zhēng)搶,舉例來說,tead h 和 mite h 這兩個(gè)資源分別代表數(shù)車讀寫,我們同以給 read ?設(shè)置限流規(guī)達(dá)到優(yōu)先的目的:設(shè)置 strate 為 1etatSIRTECT L時(shí)設(shè)置 eert 為 te這當(dāng)/于時(shí)教據(jù)的會(huì)被限流
舉例 生成訂單和查詢訂單,當(dāng)生成訂單接口訪問過高時(shí),被關(guān)聯(lián)的查詢訂單接口被限流
書寫接口:
控制臺(tái)中創(chuàng)建限流規(guī)則
?
?
正常測(cè)試:
?
這里手動(dòng)點(diǎn)擊很難看到限流作用,所以使用一些壓測(cè)工具進(jìn)行測(cè)試.可以使用傳統(tǒng)壓測(cè)工具jemter進(jìn)行壓測(cè),這里使用apipost進(jìn)行壓測(cè)
?
對(duì)生成訂單進(jìn)行接口壓測(cè),然后查看查詢訂單接口是否服務(wù)降級(jí)?
?可以看到對(duì)生成訂單進(jìn)行壓測(cè),關(guān)聯(lián)的查詢訂單卻受到了流控服務(wù)降級(jí)
整合openFeign使用
首先準(zhǔn)備一個(gè)最少有兩個(gè)服務(wù)的微服務(wù)項(xiàng)目并將服務(wù)注冊(cè)到nacos中,這樣可以進(jìn)行服務(wù)之間的遠(yuǎn)程調(diào)用,從而使用openFeign再整合sentinel 這里不再?gòu)念^演示,具體使用openFeign可以查看博主之前文章
這里準(zhǔn)備一個(gè)生產(chǎn)者服務(wù),一個(gè)消費(fèi)者服務(wù)
在生產(chǎn)者中新建接口
在消費(fèi)者中創(chuàng)建fen接口進(jìn)行遠(yuǎn)程調(diào)用生產(chǎn)者接口
控制層書寫接口調(diào)用
?啟動(dòng)測(cè)試:
調(diào)用消費(fèi)者接口,消費(fèi)者通過openFeign調(diào)用生產(chǎn)者的接口,說明此時(shí)接口已經(jīng)調(diào)通
更改接口,手動(dòng)添加錯(cuò)誤異常,從而模擬服務(wù)降級(jí)場(chǎng)景,從而使用sentinel進(jìn)行整合服務(wù)降級(jí)
?
重啟調(diào)用接口查看異常效果:
?
?整合sentinel進(jìn)行服務(wù)降級(jí)
配置中開啟fen對(duì)sentinel使用
創(chuàng)建服務(wù)降級(jí)服務(wù)實(shí)現(xiàn)fen服務(wù)
?
?設(shè)置服務(wù)降級(jí)服務(wù)接口
啟動(dòng)測(cè)試:
?