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