Spring Cloud 微服務架構實戰(三)——使用alibaba-sentinel流量控制、熔斷降級

什麼是Sentinel

隨着微服務的流行,服務和服務之間的穩定性變得愈來愈重要。Sentinel 以流量爲切入點,從流量控制、熔斷降級、系統負載保護等多個維度保護服務的穩定性。html

Sentinel 具備如下特徵:java

  • 豐富的應用場景:Sentinel 承接了阿里巴巴近 10 年的雙十一大促流量的核心場景,例如秒殺(即突發流量控制在系統容量能夠承受的範圍)、消息削峯填谷、集羣流量控制、實時熔斷下游不可用應用等。
  • 完備的實時監控:Sentinel 同時提供實時的監控功能。您能夠在控制檯中看到接入應用的單臺機器秒級數據,甚至 500 臺如下規模的集羣的彙總運行狀況。
  • 普遍的開源生態:Sentinel 提供開箱即用的與其它開源框架/庫的整合模塊,例如與 Spring Cloud、Dubbo、gRPC 的整合。您只須要引入相應的依賴並進行簡單的配置便可快速地接入 Sentinel。
  • 完善的 SPI 擴展點:Sentinel 提供簡單易用、完善的 SPI 擴展接口。您能夠經過實現擴展接口來快速地定製邏輯。例如定製規則管理、適配動態數據源等。

Spring Cloud接入

1.首先,修改 pom.xml 文件,引入 Sentinel starter。

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>

2.接入限流埋點

  • HTTP 埋點
    Sentinel starter 默認爲全部的 HTTP 服務提供了限流埋點,若是隻想對 HTTP 服務進行限流,那麼只須要引入依賴,無需修改代碼。git

  • 自定義埋點
    若是須要對某個特定的方法進行限流或降級,能夠經過 @SentinelResource 註解來完成限流的埋點,示例代碼以下:github

@SentinelResource("resource")
public String hello() {
  return "Hello";
}

3.經過控制檯,配置限流規則

啓動 Sentinel 控制檯

  1. 首先須要獲取 Sentinel 控制檯,支持直接下載和源碼構建兩種方式。spring

    1.1 直接下載:下載 Sentinel 控制檯
    1.2 源碼構建:進入 Sentinel Github 項目頁面,將代碼 git clone 到本地自行編譯打包,參考此文檔編程

  2. 啓動控制檯,執行 Java 命令 java -jar sentinel-dashboard.jar完成 Sentinel 控制檯的啓動。 控制檯默認的監聽端口爲 8080。Sentinel 控制檯使用 Spring Boot 編程模型開發,若是須要指定其餘端口,請使用 Spring Boot 容器配置的標準方式,詳情請參考 Spring Boot 文檔app

啓動應用

  1. 增長配置,在應用的 /src/main/resources/application.properties 中添加基本配置信息
spring.cloud.sentinel.transport.port=8719
spring.cloud.sentinel.transport.dashboard= localhost:8080

2.啓動應用,並調用服務,任意的controller暴露的http服務框架

 

配置限流規則並驗證

  1. 訪問 http://localhost:8080 頁面,能夠在左側看到 naco-consumer 應用已經註冊到了控制檯,單擊 流控規則 ,能夠看到目前的流控規則爲空。ide

     

  2. 配置 URL 限流規則:點擊新增流控規則,資源名填寫須要限流的 URL 相對路徑,單機閾值選擇須要限流的閾值,點擊新增進行確認。(爲了便於演示效果,這裏將值設置成了 1)。spring-boot

     

  3. 訪問 URL,當 QPS 超過 1 時,能夠看到限流效果以下。

     

4.Feign支持

Sentinel 適配了 Feign 組件。若是想使用,除了引入 sentinel-starter 的依賴外還須要 2 個步驟:

  • 配置文件打開 sentinel 對 feign 的支持:feign.sentinel.enabled=true

  • 加入 feign starter 依賴觸發 sentinel starter 的配置類生效:

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

這是一個 FeignClient 的簡單使用示例:

@FeignClient(name = "nacos-config" ,fallback = ConfigFeignClientFallback.class, configuration = FeignConfiguration.class)
public interface ConfigFeignClient {
    @RequestMapping(value = "/config/get", method = RequestMethod.GET)
    String userKey();
}

class FeignConfiguration {
    @Bean
    public ConfigFeignClientFallback configFeignClientFallback() {
        return new ConfigFeignClientFallback();
    }
}

class ConfigFeignClientFallback implements ConfigFeignClient {
    @Override
    public String userKey() {
        return "echo fallback";
    }
}

5.驗證降級

1.咱們把服務提供方nacos-config應用中止運行。

  1. 訪問nacos-consumer應用的使用feign的接口服務。
  2. 因爲feign在訪問nacos-config時發生異常,觸發降級條件,因而結果以下:

     

  3. 從新啓動nacos-config服務,訪問變回正常:

     

6.自定義限流、降級邏輯

請參考官方文檔:

相關文章
相關標籤/搜索