摘要:是一個(gè)靈活的系統(tǒng)負(fù)載控制框架,通過控制接口和方法的調(diào)用來保證系統(tǒng)負(fù)載不會(huì)過大,維持正常響應(yīng)速度。創(chuàng)建一個(gè)項(xiàng)目首先創(chuàng)建一個(gè)空的項(xiàng)目,加上的依賴。編寫控制規(guī)則將控制規(guī)則包裝為類。超過這個(gè)閾值則會(huì)拒絕調(diào)用該方法。
Alibaba Sentinel 是一個(gè)靈活的系統(tǒng)負(fù)載控制框架,通過控制接口和方法的調(diào)用來保證系統(tǒng)負(fù)載不會(huì)過大,維持正常響應(yīng)速度。
該項(xiàng)目的地址是 https://github.com/alibaba/Se... 。但是阿里的文檔一貫看起來一頭霧水,所以本文介紹如何用一個(gè)最簡(jiǎn)單的項(xiàng)目來上手。如果你熟悉 Spring Boot,那么幾分鐘就可以搞定。
1、創(chuàng)建一個(gè) Maven 項(xiàng)目首先創(chuàng)建一個(gè)空的 Maven 項(xiàng)目,加上 Spring Boot 的依賴。pom.xml 看起來是下面的樣子,你可以直接拿來用:
4.0.0 com.demo sentinel-test 1.0-SNAPSHOT 1.8 1.8 UTF-8 org.springframework.boot spring-boot-dependencies 2.1.3.RELEASE pom import
這里沒有將 Spring Boot 作為 parent 項(xiàng)目,而是使用
在 pom.xml 中,首先添加 Spring Boot 依賴:
org.springframework.boot spring-boot-starter
然后添加 Sentinel。在這個(gè)例子當(dāng)中,我們將用 注解 來實(shí)現(xiàn)負(fù)載控制,所以添加 sentinel-annotation-aspectj 依賴:
com.alibaba.csp sentinel-annotation-aspectj 1.5.1
添加了這兩個(gè)依賴就 OK 了。
3、啟動(dòng)類Spring Boot 項(xiàng)目需要一個(gè) main() 方法來啟動(dòng),我們命名這個(gè)類為 com.demo.SentinelTestApplication,其內(nèi)容如下:
@SpringBootApplication public class SentinelTestApplication { public static void main(String[] args) throws Exception { SpringApplication.run(SentinelTestApplication.class, args); } }
目前這個(gè)類還沒有具體的內(nèi)容,但我們應(yīng)該先運(yùn)行一下,確保前面做的事情沒有出錯(cuò),然后再添加內(nèi)容。
4、需要進(jìn)行訪問控制的服務(wù) DemoService我們?cè)?com.demo 包下創(chuàng)建一個(gè)名為 DemoService 的類,這個(gè)類包含一個(gè)需要做訪問控制的 call() 方法:
@Service public class DemoService { private int counter; @SentinelResource(value = "DemoService.call", blockHandler = "callBlocked") public void call() { System.out.println("Hello (" + ++counter + ")"); } public void callBlocked(BlockException ex) { System.err.println("Blocked (" + ++counter + ") : " + ex.toString()); } }
所謂訪問控制就是當(dāng)某個(gè)方法調(diào)用過于頻繁時(shí),拒絕掉一部分調(diào)用。什么才叫過于頻繁,我們可以通過自定義控制規(guī)則的方式來告訴 Sentinel。定義控制規(guī)則的部分放在后面介紹,我們現(xiàn)在先關(guān)注業(yè)務(wù)本身,也就是 DemoService 類。
這個(gè)類包含兩個(gè)方法,其中 call() 方法是主角,正常的業(yè)務(wù)會(huì)調(diào)用這個(gè)方法;而 callBlocked() 則會(huì)在 call() 方法被拒絕掉時(shí)調(diào)用。
call() 方法上面的 @SentinelResource 注解標(biāo)明了該方法是需要進(jìn)行訪問控制的。Sentinel 將需要進(jìn)行訪問控制的方法都稱作資源。這個(gè)注解有兩個(gè)屬性,value 屬性表示該資源的名稱,我們通過名稱為不同的資源制定不同的控制規(guī)則。blockHandler 屬性表示方法被拒絕時(shí)應(yīng)該調(diào)用哪個(gè)替代方法,這個(gè)替代方法必須在同一個(gè)類當(dāng)中,且參數(shù)列表要在原方法參數(shù)列表的基礎(chǔ)上再添加一個(gè) BlockException 類型的參數(shù)。
5、編寫控制規(guī)則Sentinel 將控制規(guī)則包裝為 com.alibaba.csp.sentinel.slots.block.flow.FlowRule 類。它包含下面幾個(gè)屬性:
resource : 該規(guī)則針對(duì)哪個(gè)資源;
grade : 從哪個(gè)方面進(jìn)行度量,如該方法的每秒調(diào)用次數(shù),或同時(shí)調(diào)用該方法的線程數(shù)等等。
count : 度量閾值。超過這個(gè)閾值則會(huì)拒絕調(diào)用該方法。
strategy : 多個(gè)規(guī)則之間的搭配策略,具體參考這里。
下面我們?cè)?SentinelTestApplication 類里面添加一個(gè)創(chuàng)建規(guī)則的方法,同時(shí)在 main() 方法里面初始化它:
private static void initRules() throws Exception { FlowRule rule1 = new FlowRule(); rule1.setResource("DemoService.call"); rule1.setGrade(RuleConstant.FLOW_GRADE_QPS); rule1.setCount(5); // 每秒調(diào)用最大次數(shù)為 5 次 Listrules = new ArrayList<>(); rules.add(rule1); // 將控制規(guī)則載入到 Sentinel com.alibaba.csp.sentinel.slots.block.flow.FlowRuleManager.loadRules(rules); } public static void main(String[] args) throws Exception { initRules(); // Sentinel 載入規(guī)則不一定非要在 Spring 初始化之前,在這之后也可以。 SpringApplication.run(SentinelTestApplication.class, args); }
這樣 Sentinel 的規(guī)則就設(shè)置完畢。
6、啟用 Sentinel 注解的 AOP 攔截Spring 提供 AOP 機(jī)制來實(shí)現(xiàn)方法調(diào)用的攔截,這是 Sentinel 實(shí)現(xiàn)控制規(guī)則的原理。Sentinel 提供 com.alibaba.csp.sentinel.annotation.aspectj.SentinelResourceAspect 類,我們要在 Spring 容器中加入這個(gè) bean 才能讓 @SentinelResource 注解起作用。我們需要在 SentinelTestApplication 類里面添加下面的代碼:
@Bean public SentinelResourceAspect sentinelResourceAspect() { return new SentinelResourceAspect(); }
當(dāng)然,在實(shí)際項(xiàng)目里面這一步可以放到自動(dòng)配置當(dāng)中。
7、測(cè)試控制規(guī)則最后我們寫一個(gè)方法來測(cè)試控制規(guī)則是否起作用,同樣是在 SentinelTestApplication 類里面:
@Autowired private DemoService demoService; @PostConstruct public void run() { for (int i = 0; i < 10; i++) { demoService.call(); } }
實(shí)際運(yùn)行 main() 方法時(shí),你將會(huì)看到這樣的輸出:
Hello (1) Hello (2) Hello (3) Hello (4) Hello (5) Blocked (6) : com.alibaba.csp.sentinel.slots.block.flow.FlowException Blocked (7) : com.alibaba.csp.sentinel.slots.block.flow.FlowException Blocked (8) : com.alibaba.csp.sentinel.slots.block.flow.FlowException Blocked (9) : com.alibaba.csp.sentinel.slots.block.flow.FlowException Blocked (10) : com.alibaba.csp.sentinel.slots.block.flow.FlowException
通過這個(gè)例子,你應(yīng)該大概了解 Sentinel 運(yùn)作的機(jī)制了。在這個(gè)基礎(chǔ)上,Sentinel 還能實(shí)現(xiàn)控制規(guī)則的實(shí)時(shí)修改、遠(yuǎn)程配置、狀態(tài)監(jiān)控等等,它是個(gè)非常強(qiáng)大的框架。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/77527.html
摘要:介紹隨著微服務(wù)的流行,服務(wù)和服務(wù)之間的穩(wěn)定性變得越來越重要。以流量為切入點(diǎn),從流量控制熔斷降級(jí)系統(tǒng)負(fù)載保護(hù)等多個(gè)維度保護(hù)服務(wù)的穩(wěn)定性。完備的實(shí)時(shí)監(jiān)控同時(shí)提供實(shí)時(shí)的監(jiān)控功能。您只需要引入相應(yīng)的依賴并進(jìn)行簡(jiǎn)單的配置即可快速地接入。 Sentinel 介紹 隨著微服務(wù)的流行,服務(wù)和服務(wù)之間的穩(wěn)定性變得越來越重要。 Sentinel 以流量為切入點(diǎn),從流量控制、熔斷降級(jí)、系統(tǒng)負(fù)載保護(hù)等多個(gè)維度...
摘要:但是比較可惜的是已經(jīng)宣布對(duì)停止更新。客戶端整合每個(gè)微服務(wù)客戶端都需要整合的客戶端封裝與配置,才能將監(jiān)控信息上報(bào)給展示以及實(shí)時(shí)的更改限流或熔斷規(guī)則等。下面我們就分兩部分來看看,如何使用來實(shí)現(xiàn)接口限流。 最近管點(diǎn)閑事浪費(fèi)了不少時(shí)間,感謝網(wǎng)友libinwalan的留言提醒。及時(shí)糾正路線,繼續(xù)跟大家一起學(xué)習(xí)Spring Cloud Alibaba。 Nacos作為注冊(cè)中心和配置中心的基礎(chǔ)教程,...
摘要:要使用注解來保護(hù)資源需要引入下面的依賴引入之后我們需要配置切面讓其生效,因?yàn)槭峭ㄟ^切面來實(shí)現(xiàn)的,我這邊以中使用進(jìn)行配置示列然后在需要限制的方法上加注解即可錯(cuò)誤發(fā)生在表示資源名,必填項(xiàng)處理的方法名,可選項(xiàng)。 在前面我們對(duì)Sentinel做了一個(gè)詳細(xì)的介紹,可以手動(dòng)的通過Sentinel提供的SphU類來保護(hù)資源。這種做法不好的地方在于每個(gè)需要限制的地方都得寫代碼,從 0.1.1 版本開始...
摘要:所以,在整合了做規(guī)則存儲(chǔ)之后,需要知道在下面兩個(gè)地方修改存在不同的效果控制臺(tái)中修改規(guī)則僅存在于服務(wù)的內(nèi)存中,不會(huì)修改中的配置值,重啟后恢復(fù)原來的值。控制臺(tái)中修改規(guī)則服務(wù)的內(nèi)存中規(guī)則會(huì)更新,中持久化規(guī)則也會(huì)更新,重啟后依然保持。 通過上一篇《使用Sentinel實(shí)現(xiàn)接口限流》的介紹,相信大家對(duì)Sentinel已經(jīng)有了初步的認(rèn)識(shí)。在Spring Cloud Alibaba的整合封裝之下,接...
摘要:在之前的練習(xí)中,只要應(yīng)用重啟,就需要重新配置,這樣在我們實(shí)際的項(xiàng)目是非常不實(shí)用的,那么有沒有辦法把我們配置的規(guī)則保存下來呢答案是,那么接下來,給大家來介紹如何將規(guī)則持久化。重新啟動(dòng)測(cè)試效果添加流控規(guī)則查看同步的配置 在之前的練習(xí)中,只要應(yīng)用重啟,就需要重新配置,這樣在我們實(shí)際的項(xiàng)目是非常不實(shí)用的,那么有沒有辦法把我們配置的規(guī)則保存下來呢?答案是YES,那么接下來,給大家來介紹如何將Se...
閱讀 3146·2021-10-27 14:16
閱讀 2954·2021-09-24 10:33
閱讀 2364·2021-09-23 11:21
閱讀 3284·2021-09-22 15:14
閱讀 887·2019-08-30 15:55
閱讀 1749·2019-08-30 15:53
閱讀 1854·2019-08-29 11:14
閱讀 2244·2019-08-28 18:11