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