SpringCloud Sentinel
服務保護的基本概念
服務限流/熔斷
服務限流目的是爲了更好的保護我們的服務,在高併發的情況下,如果客戶端請求的數量達到一定極限(後臺可以配置閾值),請求的數量超出了設置的閾值,開啓自我的保護,直接調用我們的服務降級的方法,不會執行業務邏輯操作,直接走本地falback的方法,返回一個友好的提示。
服務降級
在高併發的情況下, 防止用戶一直等待,採用限流/熔斷方法,使用服務降級的方式返回一個友好的提示給客戶端,不會執行業務邏輯請求,直接走本地的falback的方法。
提示語:當前排隊人數過多,稍後重試~
服務的雪崩效應
默認的情況下,Tomcat或者是Jetty服務器只有一個線程池去處理客戶端的請求,這樣的話就是在高併發的情況下,如果客戶端所有的請求都堆積到同一個服務接口上, 那麼就會產生tomcat服務器所有的線程都在處理該接口,可能會導致其他的接口無法訪問。
假設我們的tomcat線程最大的線程數量是爲20,這時候客戶端如果同時發送100個請求會導致有80個請求暫時無法訪問,就會轉圈。
服務的隔離的機制
服務的隔離機制分爲信號量和線程池隔離模式
服務的線程池隔離機制:每個服務接口都有自己獨立的線程池,互不影響,缺點就是佔用cpu資源非常大。
服務的信號量隔離機制:最多隻有一定的閾值線程數處理我們的請求,超過該閾值會拒絕請求。
Sentinel 與hytrix區別
前哨以流量爲切入點,從流量控制,熔斷降級,系統負載保護等多個維度保護服務的穩定性。
前哨具有以下特徵:
1.豐富的應用場景:前哨兵承接了阿里巴巴近10年的雙十一大促流的核心場景,例如秒殺(即突然流量控制在系統容量可以承受的範圍),消息削峯填谷,傳遞流量控制,實時熔斷下游不可用應用等。
2.完備的實時監控:Sentinel同時提供實時的監控功能。您可以在控制檯中看到接收應用的單臺機器秒級數據,甚至500臺以下規模的整合的彙總運行情況。
廣泛的開源生態:Sentinel提供開箱即用的與其他開源框架/庫的集成模塊,例如與Spring Cloud,Dubbo,gRPC的整合。您只需要另外的依賴並進行簡單的配置即可快速地接入Sentinel。
3.完善的SPI擴展點:Sentinel提供簡單易用,完善的SPI擴展接口。您可以通過實現擴展接口來快速地定製邏輯。例如定製規則管理,適應動態數據源等。
Sentinel中文文檔介紹:
https://github.com/alibaba/Sentinel/wiki/介紹
SpringBoot項目整合Sentinel
Maven依賴的配置
<!--服務容錯的綜合性解決方案-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
<version>2.2.0.RELEASE</version>
</dependency>
註解形式配置管理Api限流
@SentinelResource value參數:流量規則資源名稱、
blockHandler 限流/熔斷出現異常執行的方法
Fallback 服務的降級執行的方法
package application.controller;
import application.service.SentinelService;
import com.alibaba.csp.sentinel.annotation.SentinelResource;
import com.alibaba.csp.sentinel.slots.block.BlockException;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
/**
* @author wtl
* @program: SpringCloudAlibaba
* @description: Sentinel它以流量 爲切入點, 從流量控制、熔斷降級、系統負載保護等多個維度來保護服務的穩定性
* @date 2020-03-09 13:16:10
*/
@RestController
public class SentinelController {
@Resource
private SentinelService sentinelService;
@SentinelResource(value = "method1",blockHandler = "exceptionInfo")
@GetMapping("/method1")
public String method1(){
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
return "method1";
}
@SentinelResource(value = "method2",fallback = "errorFallback")
@GetMapping("/method2")
public String method2(int age){
int j = 1/ age;
return "method2" + ">>>" + j;
}
public String exceptionInfo(BlockException blockException){
blockException.printStackTrace();
return "該服務被降級了!!!!!!";
}
public String errorFallback(int age){
return "服務熔斷了!!!";
}
}
安裝Sentinel控制檯
Sentinel 提供一個輕量級的控制檯, 它提供機器發現、單機資源實時監控以及規則管理等功能。
1 下載jar包,解壓到文件夾
https://github.com/alibaba/Sentinel/releases
2 啓動控制檯
# 直接使用jar命令啓動項目(控制檯本身是一個SpringBoot項目)
java -Dserver.port=8080 -Dcsp.sentinel.dashboard.server=localhost:8080 -Dproject.name=sentinel-dashboard -jar sentinel-dashboard-1.7.0.jar
3 修改 member ,在裏面加入有關控制檯的配置
spring:
application:
###application的名稱
name: springcloud-alibaba-impl-member
cloud:
nacos:
discovery:
###註冊中心
server-addr: 127.0.0.1:8848
config:
server-addr: 127.0.0.1:8848
###分組
group: DEFAULT_GROUP
###類型
file-extension: yaml
sentinel:
transport:
port: 8270 #跟控制檯交流的端口,隨意指定一個未使用的端口即可
dashboard: 127.0.0.1:8080 # 指定控制檯服務的地址
eager: true
datasource:
ds:
nacos:
### nacos連接地址
server-addr: 127.0.0.1:8848
## nacos連接的分組
group-id: DEFAULT_GROUP
###路由存儲規則
rule-type: flow
### 讀取配置文件的 data-id
data-id: springcloud-alibaba
### 讀取培訓文件類型爲json
data-type: json
profiles:
active: dev
第4步: 通過瀏覽器訪問localhost:8080 進入控制檯 ( 默認用戶名密碼是 sentinel/sentinel )
Sentinel如何保證規則的持久化
默認的情況下Sentinel的規則是存放在內存中,如果Sentinel客戶端重啓後,Sentinel數據規則可能會丟失。
解決方案:
Sentinel持久化機制支持四種持久化的機制。
1.本地文件
2.攜程阿波羅
3.Nacos
4.Zookeeper
SpringBoot客戶端整合
sentinel實現熔斷降級
https://github.com/alibaba/Sentinel/wiki/%E7%86%94%E6%96%AD%E9%99%8D%E7%BA%A7
除了流量控制以外,對調用鏈路中不穩定的資源進行熔斷降級也是保障高可用的重要措施之一。由於調用關係的複雜性,如果調用鏈路中的某個資源不穩定,最終會導致請求發生堆積。Sentinel 熔斷降級會在調用鏈路中某個資源出現不穩定狀態時(例如調用超時或異常比例升高),對這個資源的調用進行限制,讓請求快速失敗,避免影響到其它的資源而導致級聯錯誤。當資源被降級後,在接下來的降級時間窗口之內,對該資源的調用都自動熔斷(默認行爲是拋出 DegradeException)。
降級的策略
1.平均響應時間 (DEGRADE_GRADE_RT):當 1s 內持續進入 5 個請求,對應時刻的平均響應時間(秒級)均超過閾值(count,以 ms 爲單位),那麼在接下的時間窗口(DegradeRule 中的 timeWindow,以 s 爲單位)之內,對這個方法的調用都會自動地熔斷(拋出 DegradeException)。注意 Sentinel 默認統計的 RT 上限是 4900 ms,超出此閾值的都會算作 4900 ms,若需要變更此上限可以通過啓動配置項 -Dcsp.sentinel.statistic.max.rt=xxx 來配置。
2.異常比例 (DEGRADE_GRADE_EXCEPTION_RATIO):當資源的每秒請求量 >= 5,並且每秒異常總數佔通過量的比值超過閾值(DegradeRule 中的 count)之後,資源進入降級狀態,即在接下的時間窗口(DegradeRule 中的 timeWindow,以 s 爲單位)之內,對這個方法的調用都會自動地返回。異常比率的閾值範圍是 [0.0, 1.0],代表 0% - 100%。
3.異常數 (DEGRADE_GRADE_EXCEPTION_COUNT):當資源近 1 分鐘的異常數目超過閾值之後會進行熔斷。注意由於統計時間窗口是分鐘級別的,若 timeWindow 小於 60s,則結束熔斷狀態後仍可能再進入熔斷狀態。