亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Sentinel的使用分析

發布時間:2021-11-10 10:41:28 來源:億速云 閱讀:132 作者:柒染 欄目:大數據

本篇文章給大家分享的是有關Sentinel的使用分析,小編覺得挺實用的,因此分享給大家學習,希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。

Sentinel能用來做什么?

  1. 限流

  2. 熔斷降級

  3. 流量塑形

  4. 系統負載保護

  5. 熱點防護 詳細概念介紹請閱讀:https://github.com/alibaba/Sentinel/wiki/%E4%B8%BB%E9%A1%B5

Sentinel基本概念

資源

資源是 Sentinel 的關鍵概念。它可以是 Java 應用程序中的任何內容,例如,由應用程序提供的服務,或由應用程序調用的其它應用提供的服務,甚至可以是一段代碼。在接下來的文檔中,我們都會用資源來描述代碼塊。 只要通過 Sentinel API 定義的代碼,就是資源,能夠被 Sentinel 保護起來。大部分情況下,可以使用方法簽名,URL,甚至服務名稱作為資源名來標示資源。

規則

圍繞資源的實時狀態設定的規則,可以包括流量控制規則、熔斷降級規則以及系統保護規則。所有規則可以動態實時調整。

使用Sentinel

引入 Sentinel 依賴

<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) {
  // 資源訪問阻止,被限流或被降級
  // 在此處進行相應的處理操作
}

**注意: **

  1. 若 entry 的時候傳入了熱點參數,那么 exit 的時候也一定要帶上對應的參數(exit(count, args)),否則可能會有統計錯誤。這個時候不能使用 try-with-resources 的方式。

  2. 通過 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).
}

規則的種類

流量控制規則 (FlowRule)

通過代碼定義流量控制規則:

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

熔斷降級規則 (DegradeRule)

通過代碼定義熔斷降級規則:

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

系統保護規則 (SystemRule)

通過代碼定義系統保護規則:

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

訪問控制規則 (AuthorityRule)

很多時候,我們需要根據調用方來限制資源是否通過,這時候可以使用 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));
}

Sentinel Dashboard控制臺的啟動

從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

Spring Boot項目連接控制臺

添加依賴:

<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的使用分析

以上就是Sentinel的使用分析,小編相信有部分知識點可能是我們日常工作會見到或用到的。希望你能通過這篇文章學到更多知識。更多詳情敬請關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

来宾市| 左云县| 遂溪县| 扎囊县| 岑溪市| 安庆市| 大荔县| 巨野县| 贡觉县| 健康| 余姚市| 成都市| 张家口市| 嘉鱼县| 宁陵县| 嵩明县| 比如县| 微博| 二手房| 五峰| 奇台县| 隆德县| 华阴市| 勐海县| 嘉祥县| 乌鲁木齐市| 东方市| 洛宁县| 沙雅县| 许昌县| 天津市| 三亚市| 永新县| 海原县| 乌海市| 嘉禾县| 外汇| 恩施市| 嘉黎县| 遵化市| 夏津县|