Alibaba Sentinel 限流與熔斷初探(技巧篇)
阿新 • • 發佈:2020-03-12
>溫馨提示:原始碼分析 Alibaba Sentinel 專欄開始連載,本文展示如何學習一個全新的技術的方法。該專欄基於 1.7.0 版本。
在學習一個新技術或新框架時,建議先檢視其官方文件, Sentinel 官方文件連結如下:[官方文件](https://github.com/alibaba/Sentinel/wiki/%E4%BB%8B%E7%BB%8D),以獲得對其形成一個整體的認識。
@[TOC](本節目錄)
## 1、Sentinel 是什麼 ?主要能解決什麼問題?
按照官方的定義,Sentinel 意為分散式系統的流量防衛兵,主要提供限流、熔斷等服務治理相關的功能。
服務的動態註冊、服務發現是 SOA、微服務架構體系中首先需要解決的基本問題,服務治理是 SOA 領域又一重要課題,而 dubbo 框架只提供了一些基本的服務治理能力,例如限制服務併發呼叫數、配置合適的業務執行緒數量等,但熔斷相關的功能就涉及的較少。
Sentinel 將作為 Dubbo 生態的重要一員,將集中解決服務治理相關的課題,服務限流與熔斷又是服務治理首先要解決的課題。
那什麼是限流與熔斷呢?
限流:我們通常使用TPS對流量來進行描述,限流就是現在服務被呼叫的併發TPS,從而對系統進行自我保護。
熔斷:就是當系統中某一個服務出現效能瓶頸是,對這個服務的呼叫進行快速失敗,避免造成連鎖反應,從而影響整個鏈路的呼叫。
## 2、限流與熔斷的使用場景
限流還是比較好理解,例如一個專案在上線之前經過效能測試評估,例如服務在 TPS 達到 1w/s 時系統資源利用率飆升,與此同時響應時間急劇增大,那我們就要控制該服務的呼叫TPS,超過該 TPS 的流量就需要進行干預,可以採取拒絕、排隊等策略,實現流量的削峰填谷。
還有一個場景,例如一下開放平臺,對介面進行收費,免費使用者要控制呼叫TPS,賬戶的等級不同,允許呼叫的TPS也不同,這種情況就非常適合限流。
那熔斷的使用場景呢?我們首先來看一下如下的分散式架構。
![在這裡插入圖片描述](https://img-blog.csdnimg.cn/20191214230343989.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3ByZXN0aWdlZGluZw==,size_16,color_FFFFFF,t_70)
例如應用A 部署了3臺機器,如果由於某種原因,例如執行緒池 hold 住,導致傳送到它上面的請求會出現超時而報錯,由於該程序並未宕機,請求還是會通過負載演算法請求出現故障的機器,出現整個1/3的請求出現超時報錯,影響整個系統的可用性?也就是其中一臺故障會對整個服務質量產生嚴重的影響,雖然是叢集部署,但無法達到高可用性。那如何解決該問題?如果在呼叫方(API-Center) 對異常進行統計,發現發往某一臺機器的錯誤數或錯誤率達到設定的值,就在一定的世界間隔內不繼續發往該機器,轉而傳送給叢集內正常的節點,這樣就實現了高可用,這就是所謂的熔斷機制。
有了上面的基本認識,接下來會進行一些閱讀原始碼的準備,為後面的原始碼分析 Sentinel 打下堅實的基礎。
## 3、Sentinel 原始碼結構
![在這裡插入圖片描述](https://img-blog.csdnimg.cn/20191214230725995.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3ByZXN0aWdlZGluZw==,size_16,color_FFFFFF,t_70)
Sentinel 的核心模組說明如下:
- sentinel-core
Sentinel 核心模組,實現限流、熔斷等基本能力。
- sentinel-dashboard
Sentinel 視覺化控制檯,提供基本的管理介面,配置限流、熔斷規則等,展示監控資料等。
- sentinel-adapter
Sentinel 適配,Sentinel-core 模組提供的是限流等基本API,主要是提供給應用自己去顯示呼叫,對程式碼有侵入性,故該模組對主流框架進行了適配,目前已適配的模組如下:
- sentinel-apache-dubbo-adapter
對 Apache Dubbo 版本進行適配,這樣應用只需引入 sentinel-apache-dubbo-adapter 包即可對 dubbo 服務進行流控與熔斷,大家可以思考會利用 Dubbo 的哪個功能特性。
- sentinel-dubbo-adapter
對 Alibaba Dubbo 版本進行適配。
- sentinel-grpc-adapter
對 GRPC 進行適配。
- sentinel-spring-webflux-adapter
對響應式程式設計框架 webflux 進行適配。
- sentinel-web-servlet
對 servlet 進行適配,例如 Spring MVC。
- sentinel-zuul-adapter
對 zuul 閘道器進行適配。
- sentinel-cluster
提供叢集模式的限流與熔斷支援,因為通常一個應用會部署在多臺機器上組成應用叢集。
- sentinel-transport
網路通訊模組,提供 Sentinel 節點與 sentinel-dashboard 的通訊支援,主要有如下兩種實現。
- sentinel-transport-netty-http
基於 Netty 實現的 http 通訊模式。
- sentinel-transport-simple-http
簡單的 http 實現方式。
- sentinel-extension
Sentinel 擴充套件模式。主要提供瞭如下擴充套件(高階)功能:
- sentinel-annotation-aspectj
提供基於註解的方式來定義資源等。
- sentinel-parameter-flow-control
提供基於引數的限流(熱點限流)。
- sentinel-datasource-extension
限流規則、熔斷規則的儲存實現,預設是儲存在記憶體中。
- sentinel-datasource-apollo
基於 apollo 配置中心實現限流規則、熔斷規則的儲存,動態推送生效機制。
- sentinel-datasource-consul
基於 consul 實現限流規則、熔斷規則的儲存,動態推送生效機制。
- sentinel-datasource-etcd
基於 etcd 實現限流規則、熔斷規則的儲存,動態推送生效機制。
- sentinel-datasource-nacos
基於 nacos 實現限流規則、熔斷規則的儲存,動態推送生效機制。
- sentinel-datasource-redis
基於 redis 實現限流規則、熔斷規則的儲存,動態推送生效機制。
- sentinel-datasource-spring-cloud-config
基於 spring-cloud-config 實現限流規則、熔斷規則的儲存,動態推送生效機制。
- sentinel-datasource-zookeeper
基於 zookeeper 實現限流規則、熔斷規則的儲存,動態推送生效機制。
## 4、在 IntelliJ IDEA 中執行 Sentine Demo
在 sentinel-demo 模組下提供了很多示例,Seninel 一開始是為 Dubbo 而生的,故我們選取一下 sentinel-demo-apache-dubbo 為本次演示的示例。
注意:該版本需要引入的 apache dubbo 版本需要修改為 2.7.2。
```xml
```
Step1:先啟動 sentinel-dashboard,啟動引數配置如下:
![在這裡插入圖片描述](https://img-blog.csdnimg.cn/20191214230758222.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3ByZXN0aWdlZGluZw==,size_16,color_FFFFFF,t_70)
sentinel-demo-apache-dubbo 模組如下所示:
![在這裡插入圖片描述](https://img-blog.csdnimg.cn/20191214230836334.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3ByZXN0aWdlZGluZw==,size_16,color_FFFFFF,t_70)
先啟動服務提供者,其配置引數如下:
![在這裡插入圖片描述](https://img-blog.csdnimg.cn/20191214230902547.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3ByZXN0aWdlZGluZw==,size_16,color_FFFFFF,t_70)
然後啟動服務消費者,其配置引數如下:
![在這裡插入圖片描述](https://img-blog.csdnimg.cn/20191214230924603.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3ByZXN0aWdlZGluZw==,size_16,color_FFFFFF,t_70)
啟動後,我們能看到消費者會出現報錯,因為觸發了限流,我們可以通過控制檯檢視接入應用的資訊,例如輸入:http://localhost:8080
部分截圖如下:
![在這裡插入圖片描述](https://img-blog.csdnimg.cn/20191214231003110.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3ByZXN0aWdlZGluZw==,size_16,color_FFFFFF,t_70)
![在這裡插入圖片描述](https://img-blog.csdnimg.cn/20191214231019623.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3ByZXN0aWdlZGluZw==,size_16,color_FFFFFF,t_70)
可以在控制檯動態新增限流、熔斷等規則配置,然後接入的客戶端將能在不啟動應用的情況下生效。
預設情況下,sentinel-dashboard 中的規則是儲存在記憶體中,重啟後就會丟失,因此 Sentinel 提供了很多種資料來源的實現,例如 sentinel-datasource-zookeeper,這部分內容隨著該專欄的陸續更新,將會對該機制進行介紹。
---
> 作者資訊:丁威,《RocketMQ技術內幕》作者,目前擔任中通科技技術平臺部資深架構師,RocketMQ官方社群優秀佈道師、CSDN2019部落格之星TOP10,維護公眾號 [中介軟體興趣圈](https://mp.weixin.qq.com/s/LB7k8A06BgssXy9bxfZC3w)公眾號,目前主要發表了原始碼閱讀java集合、JUC(java併發包)、Netty、ElasticJob、Mycat、Dubbo、RocketMQ、mybaits等系列原始碼。點選連結:加入筆者的[知識星球](https://t.zsxq.com/QbYNzZN),一起探討高併發、分散式服務架構,分享閱讀原始碼