您好,登錄后才能下訂單哦!
本篇文章給大家分享的是有關Sentinel的使用分析,小編覺得挺實用的,因此分享給大家學習,希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。
限流
熔斷降級
流量塑形
系統負載保護
熱點防護 詳細概念介紹請閱讀:https://github.com/alibaba/Sentinel/wiki/%E4%B8%BB%E9%A1%B5
資源是 Sentinel 的關鍵概念。它可以是 Java 應用程序中的任何內容,例如,由應用程序提供的服務,或由應用程序調用的其它應用提供的服務,甚至可以是一段代碼。在接下來的文檔中,我們都會用資源來描述代碼塊。 只要通過 Sentinel API 定義的代碼,就是資源,能夠被 Sentinel 保護起來。大部分情況下,可以使用方法簽名,URL,甚至服務名稱作為資源名來標示資源。
圍繞資源的實時狀態設定的規則,可以包括流量控制規則、熔斷降級規則以及系統保護規則。所有規則可以動態實時調整。
<dependency> <groupId>com.alibaba.csp</groupId> <artifactId>sentinel-core</artifactId> <version>1.8.0</version> </dependency>
以下代碼將一段Java方法定義為保護資源,規則設置為每秒鐘訪問1次,通過控制臺輸出內容可以發現Sentinel生效。
public class demo { public static void main(String[] args) { // 配置規則. initFlowRules(); while (true) { // 1.5.0 版本開始可以直接利用 try-with-resources 特性,自動 exit entry try (Entry entry = SphU.entry("sentinel-test1")) { // 被保護的業務邏輯 System.out.println("業務資源訪問成功!"); } catch (BlockException ex) { // 處理被流控的邏輯 System.out.println("資源訪問失敗!!!"); } try { Thread.sleep(500); } catch (InterruptedException e) { e.printStackTrace(); } } } private static void initFlowRules(){ List<FlowRule> rules = new ArrayList<>(); FlowRule rule = new FlowRule(); rule.setResource("sentinel-test1"); rule.setGrade(RuleConstant.FLOW_GRADE_QPS); // Set limit QPS. rule.setCount(1); rules.add(rule); FlowRuleManager.loadRules(rules); } }
// 1.5.0 版本開始可以利用 try-with-resources 特性(使用有限制) // 資源名可使用任意有業務語義的字符串,比如方法名、接口名或其它可唯一標識的字符串。 try (Entry entry = SphU.entry("resourceName")) { // 被保護的業務邏輯 // do something here... } catch (BlockException ex) { // 資源訪問阻止,被限流或被降級 // 在此處進行相應的處理操作 }
**注意: **
若 entry 的時候傳入了熱點參數,那么 exit 的時候也一定要帶上對應的參數(exit(count, args)),否則可能會有統計錯誤。這個時候不能使用 try-with-resources 的方式。
通過 Tracer.trace(ex) 來統計異常信息時,由于 try-with-resources 語法中 catch 調用順序的問題,會導致無法正確統計異常數,因此統計異常信息時也不能在 try-with-resources 的 catch 塊中調用 Tracer.trace(ex)。
Entry entry = null; // 務必保證 finally 會被執行 try { // 資源名可使用任意有業務語義的字符串,注意數目不能太多(超過 1K),超出幾千請作為參數傳入而不要直接作為資源名 // EntryType 代表流量類型(inbound/outbound),其中系統規則只對 IN 類型的埋點生效 entry = SphU.entry("自定義資源名"); // 被保護的業務邏輯 // do something... } catch (BlockException ex) { // 資源訪問阻止,被限流或被降級 // 進行相應的處理操作 } catch (Exception ex) { // 若需要配置降級規則,需要通過這種方式記錄業務異常 Tracer.traceEntry(ex, entry); } finally { // 務必保證 exit,務必保證每個 entry 與 exit 配對 if (entry != null) { entry.exit(); } }
熱點參數埋點示例:
Entry entry = null; try { // 若需要配置例外項,則傳入的參數只支持基本類型。 // EntryType 代表流量類型,其中系統規則只對 IN 類型的埋點生效 // count 大多數情況都填 1,代表統計為一次調用。 entry = SphU.entry(resourceName, EntryType.IN, 1, paramA, paramB); // Your logic here. } catch (BlockException ex) { // Handle request rejection. } finally { // 注意:exit 的時候也一定要帶上對應的參數,否則可能會有統計錯誤。 if (entry != null) { entry.exit(1, paramA, paramB); } }
// 資源名可使用任意有業務語義的字符串 if (SphO.entry("自定義資源名")) { // 務必保證finally會被執行 try { /** * 被保護的業務邏輯 */ } finally { SphO.exit(); } } else { // 資源訪問阻止,被限流或被降級 // 進行相應的處理操作 }
**注意:**SphO.entry(xxx) 需要與 SphO.exit()方法成對出現,匹配調用,位置正確,否則會導致調用鏈記錄異常,拋出ErrorEntryFreeException` 異常。
// 原本的業務方法 // 配置 blockHandler 和 fallback 函數來進行限流之后的處理 @SentinelResource(value="資源名稱", blockHandler = "blockHandlerForGetUser") public User getUserById(String id) { throw new RuntimeException("getUserById command failed"); } // blockHandler 函數,原方法調用被限流/降級/系統保護的時候調用 public User blockHandlerForGetUser(String id, BlockException ex) { return new User("admin"); }
詳細文檔:https://github.com/alibaba/Sentinel/wiki/%E6%B3%A8%E8%A7%A3%E6%94%AF%E6%8C%81
try { AsyncEntry entry = SphU.asyncEntry(resourceName); // 異步調用. doAsync(userId, result -> { try { // 在此處處理異步調用的結果. } finally { // 在回調結束后 exit. entry.exit(); } }); } catch (BlockException ex) { // Request blocked. // Handle the exception (e.g. retry or fallback). }
通過代碼定義流量控制規則:
private void initFlowQpsRule() { List<FlowRule> rules = new ArrayList<>(); FlowRule rule = new FlowRule(resourceName); // set limit qps to 20 rule.setCount(20); rule.setGrade(RuleConstant.FLOW_GRADE_QPS); rule.setLimitApp("default"); rules.add(rule); FlowRuleManager.loadRules(rules); }
**注意:**同一個資源可以同時有多個限流規則,檢查規則時會依次檢查。 詳細參考文檔:https://github.com/alibaba/Sentinel/wiki/%E6%B5%81%E9%87%8F%E6%8E%A7%E5%88%B6
通過代碼定義熔斷降級規則:
private void initDegradeRule() { List<DegradeRule> rules = new ArrayList<>(); DegradeRule rule = new DegradeRule(); rule.setResource(KEY); // set threshold RT, 10 ms rule.setCount(10); rule.setGrade(RuleConstant.DEGRADE_GRADE_RT); rule.setTimeWindow(10); rules.add(rule); DegradeRuleManager.loadRules(rules); }
**注意:**同一個資源可以同時有多個降級規則。 詳細參考文檔:https://github.com/alibaba/Sentinel/wiki/%E7%86%94%E6%96%AD%E9%99%8D%E7%BA%A7
通過代碼定義系統保護規則:
private void initSystemRule() { List<SystemRule> rules = new ArrayList<>(); SystemRule rule = new SystemRule(); rule.setHighestSystemLoad(10); rules.add(rule); SystemRuleManager.loadRules(rules); }
**注意:**系統規則只針對入口資源(EntryType=IN)生效。 詳細參考文檔:https://github.com/alibaba/Sentinel/wiki/%E7%B3%BB%E7%BB%9F%E8%87%AA%E9%80%82%E5%BA%94%E9%99%90%E6%B5%81
很多時候,我們需要根據調用方來限制資源是否通過,這時候可以使用 Sentinel 的訪問控制(黑白名單)的功能。黑白名單根據資源的請求來源(origin)限制資源是否通過,若配置白名單則只有請求來源位于白名單內時才可通過;若配置黑名單則請求來源位于黑名單時不通過,其余的請求通過。 授權規則,即黑白名單規則(AuthorityRule)非常簡單,主要有以下配置項:
resource:資源名,即規則的作用對象
limitApp:對應的黑名單/白名單,不同 origin 用 , 分隔,如 appA,appB
strategy:限制模式,AUTHORITY_WHITE 為白名單模式,AUTHORITY_BLACK 為黑名單模式,默認為白名單模式 通過代碼定義訪問控制規則:
private void initAuthorityRule() { AuthorityRule rule = new AuthorityRule(); rule.setResource("test"); rule.setStrategy(RuleConstant.AUTHORITY_WHITE); rule.setLimitApp("appA,appB"); AuthorityRuleManager.loadRules(Collections.singletonList(rule)); }
從https://github.com/alibaba/Sentinel/releases下載jar包 使用如下命令啟動:
java -Dserver.port=8080 -Dcsp.sentinel.dashboard.server=localhost:8080 -Dproject.name=sentinel-dashboard -jar sentinel-dashboard.jar
-Dserver.port參數指定控制臺端口號 -Dcsp.sentinel.dashboard.server參數指定控制臺服務地址 -Dproject.name參數指定項目名 訪問指定服務地址,用戶名、密碼都是sentinel
添加依賴:
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId> <version>0.9.0.RELEASE</version> </dependency>
在application.yaml中進行簡單的配置:
spring: cloud: sentinel: transport: dashboard: localhost:8080 // 控制臺地址 application: name: sentinel-demo // 在控制臺中項目的名字 server: port: 9090
依賴自動識別HTTP協議的接口,在簇點鏈路中可以看到。在后面的操作按鈕中可以進行各種規則限制。
以上就是Sentinel的使用分析,小編相信有部分知識點可能是我們日常工作會見到或用到的。希望你能通過這篇文章學到更多知識。更多詳情敬請關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。