SpringCloud微服務:Sentinel哨兵組件,管理服務限流和降級


源碼地址:GitHub·點這里||GitEE·點這里

一、基本簡介

1、概念描述

Sentinel 以流量為切入點,從流量控制、熔斷降級、系統負載保護等多個維度保護服務的穩定性。包括核心的獨立類庫,監控台,豐富的使用場景驗證。(這似乎是阿里開源組件的一貫作風,極其有特點,且特點很規律)

基本特性圖:

補刀一句:這種圖很多人可能不在意,但是一般官方給這個圖就是該中間件的基本使用思路,與核心功能點。

2、基礎性概念

  • 資源管理

資源是Sentinel組件中的核心概念之一。應用服務器上腳本,靜態頁面,API接口,文件圖片等都可以理解為資源,對於Java開發者而言,API接口就是這里資源的概念。

  • 規則配置

Sentinel組件通過流控規則的配置,來指定允許該資源(API接口)通過的請求次數,IP黑白名單,應用服務等。

  • 測試效果

QPS:每秒查詢率,是一台服務器每秒能夠處理的查詢次數。

TPS:每秒處理事務數,事務處理整體傾向於整個過程。

二、框架環境整合

這里的環境主要整合Nacos注冊中心,Feign服務,Sentinel哨兵,和Sentinel控制台。

1、基本依賴

這里的依賴需要參考官方文檔,不同的環境使用不同的依賴,這里主要適配SpringCloud環境,所以使用如下包即可。

<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
    <version>2.1.1.RELEASE</version>
</dependency>

2、控制台面板

這里直接從GitHub下載一個控制台服務包即可,也可以自己下載源碼,按照需求修改后自行打包。

java -jar sentinel-dashboard-1.7.1.jar

下載並啟動控制台服務。

3、服務配置

這里主要是把用到的兩個服務9001和9002連接到監控台。

spring:
  application:
    name: node09-nacos-9001
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848
      config:
        server-addr: 127.0.0.1:8848
        file-extension: yaml
    sentinel:
      transport:
        port: 9001
        dashboard: localhost:8080

最下面四行文件是哨兵控制台的主要配置,注意剛啟動之后控制台是看不到連接的,有資源被觸發之后才能看到。(附一張首頁效果圖)

三、流量控制

1、基本描述

流量控制(flow control),其原理是監控應用流量的 QPS 或並發線程數等指標,當達到指定的閾值時對流量進行控制,以避免被瞬時的流量高峰沖垮,從而保障應用的高可用性。

2、限流規則

限流規則主要由下面幾個因素組成。

  • resource:資源名,即限流規則的作用對象,對於Java服務端開發而言就是執行的方法;
  • count: 限流閾值,單位時間內能按照規則通過的請求量;
  • grade: 限流閾值類型,QPS 或並發線程數 ;
  • limitApp: 流控限制的指定應用來源,若為default則不區分調用來源;
  • strategy: 調用關系限流策略,直連,鏈路等;
  • controlBehavior: 流量控制效果,直接拒絕、Warm Up、勻速排隊;

3、基本案例

  • 硬編碼

配置規則

public class FlowRuleConfig {

    public static void initFlowQpsRule(String resourceName) {
        List<FlowRule> rules = new ArrayList<>();
        FlowRule rule = new FlowRule(resourceName);
        // 修改這里參數,查看效果
        rule.setCount(100);
        rule.setGrade(RuleConstant.FLOW_GRADE_QPS);
        rule.setLimitApp("default");
        rules.add(rule);
        FlowRuleManager.loadRules(rules);
    }
}

該規則參考上面的限流因素,不難理解。

使用方式

@RequestMapping(value = "/web/getOrder",method = RequestMethod.GET)
public String getOrder (@RequestParam("id") Integer id){
    FlowRuleConfig.initFlowQpsRule("getOrder");
    Entry entry = null;
    try {
        // 定義資源,埋點
        entry = SphU.entry("getOrder");
        // 保護的業務邏輯
        return "Order=" + id ;
    } catch (Exception e){
        e.printStackTrace();
    } finally {
        if (entry != null){entry.exit();}
    }
    return "Order Error" ;
}

測試的時候修改規則中count值,測試效果明顯。

  • 編碼簡化

SphU.entry中可以設置處理類型,限流閾值。

@RequestMapping(value = "/web/getState",method = RequestMethod.GET)
public String getState (@RequestParam("id") Integer id){
    Entry entry = null;
    try {
        entry = SphU.entry("getOrder",EntryType.IN,2);
        return "state=" + id;
    }
    catch (BlockException e){
        e.printStackTrace();
    } finally {
        if (entry != null){entry.exit();}
    }
    return "State Error" ;
}

不過這種模式依舊是代碼入侵嚴重,不太符合現在編程的大趨勢。Sentinel支持通過@SentinelResource注解定義資源並配置。

4、測試效果

請求上述的兩個測試接口,之后看控制台中9001服務的簇點鏈路。

可以基於控制台實時配置資源的:流控、降級、熱點、授權等核心功能,服務重啟之后配置也會重置。

四、服務熔斷降級

1、注解詳解

核心注解SentinelResource

用於定義資源,並提供可選的異常處理和 fallback 配置項。 @SentinelResource 注解包含以下屬性:

  • value

資源名稱,核心概念不能為空;

  • entryType

entry 類型,可選項默認為 EntryType.OUT;

  • blockHandler

對應處理BlockException的函數名稱,可選項。blockHandler函數訪問范圍需要是public,返回類型需要與原方法相匹配,參數類型需要和原方法相匹配並且最后加一個額外的參數,類型為BlockException。blockHandler函數默認需要和原方法在同一個類中。若希望使用其他類的函數,則可以指定 blockHandlerClass為對應的類的Class對象,注意對應的函數必須為 static 函數,否則無法解析。

  • fallback

fallback函數名稱,可選項,用於在拋出異常的時候提供fallback處理邏輯。fallback函數可以針對所有類型的異常(除了 exceptionsToIgnore里面排除掉的異常類型)進行處理。fallback 函數簽名和位置要求:返回值類型必須與原函數返回值類型一致;方法參數列表需要和原函數一致,或者可以額外多一個;

注意:這里可以這樣理解blockHandler和fallback,fallback處理業務邏輯的異常,服務降級,blockHandler處理sentinel組件控制的阻斷異常。

2、使用案例

9001接口服務

@Service
public class FlowServiceImpl implements FlowService {
    @Resource
    private JdbcTemplate jdbcTemplate ;
    @SentinelResource(value = "getPhone",blockHandler = "exceptionHandler", fallback = "fallback")
    @Override
    public String getPhone(Integer id) {
        String sql = "select phone from d_phone WHERE id="+id ;
        Integer.parseInt("hand") ;
        return jdbcTemplate.queryForList(sql,String.class).get(0) ;
    }
    // 降級處理
    public String fallback(Integer id) {
        return "服務降級,id="+id ;
    }
    // 異常處理
    public String exceptionHandler(Integer id,BlockException be) {
        be.printStackTrace();
        return "服務拋異常,id="+id ;
    }
}

9002請求服務

@RequestMapping(value = "/web/getJdbc",method = RequestMethod.GET)
public String getJdbc () {
    return msgFeign.getJdbc() ;
}

3、效果測試

通過控制台配置9001的限流規則,然后刷接口看效果。

注意阻斷異常和業務異常的返參區別。

4、對比Hystrix組件

Hystrix的核心點在於以隔離和熔斷為主的容錯機制,超時或被熔斷的調用將會快速失敗,並可以提供 fallback 機制;

Sentinel核心點在於流量控制多樣化,熔斷降級服務,系統負載保護,實時監控和控制台;

補刀一句:對於流量控制類的組件,大部分場景是使用限流,服務降級這兩塊核心功能。

五、源代碼地址

GitHub地址:知了一笑
https://github.com/cicadasmile/spring-cloud-base
GitEE地址:知了一笑
https://gitee.com/cicadasmile/spring-cloud-base

微服務系列組件

Eureka組件之服務注冊與發現

Ribbon和Feign組件實現負載均衡

Hystrix組件實現服務熔斷

Turbine組件,實現微服務集群監控

Zuul組件,實現路由網關控制

Config組件,實現配置統一管理

Zipkin組件,實現請求鏈路追蹤

組件總結,與Dubbo框架、Boot框架對比

阿里開源組件Nacos,服務和配置管理

分庫分表模式下,數據庫擴容方案描述

分庫分表模式,數據庫擴容方案實現


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM