sentinel是阿里巴巴研發的一款微服務組件,主要為用戶提供服務保護,包括限流熔斷等措施
(一)主要功能
流量控制(限流):比如限制1s內有多少請求能到達服務器,防止大量請求打崩服務器
熔斷降級:當下級服務響應慢或者不可用時,熔斷服務,快速失敗,保護上游服務
(二)使用方法
去Releases · alibaba/Sentinel · GitHub下載對應的jar包
在jar包所在的目錄cmd運行命令
java -Dserver.port=8090 -Dcsp.sentinel.dashboard.server=localhost:8090 -Dproject.name=sentinel-dashboard -jar sentinel-dashboard-1.8.8.jar
然后通過8080端口即可訪問sentinel的控制臺 ,賬號密碼均為sentinel
然后去項目中添加依賴
<dependency><groupId>com.alibaba.csp</groupId><artifactId>sentinel-transport-simple-http</artifactId><version>x.y.z</version>
</dependency>
同時修改服務的application.yml
spring:cloud:sentinel:transport:dashboard: localhost:8090 # 指定 Sentinel Dashboard 地址port: 8719 # 客戶端監控端口,用于與 Sentinel Dashboard 通信
dashboard的地址必須和sentinel控制臺的地址一致,連接控制臺
port端口號是服務與sentinel的通信端口,是獨立的,不能和運行服務的端口一樣
在項目的代碼中使用:
@SentinelResource注解
常用參數
value:指定資源名,在控制臺中可看
blockHandler:觸發限流規則時會調用哪個方法,一般會寫一個兜底方法,方法參數要和設置了限流的方法一致,但可以加一個BlockException
fallback:觸發異常時調用哪個兜底方法,和上面的很像,但是上面是用于觸發限流后用的,這個是用于觸發異常用的,方法參數可以加一個Throwable
(三)限流規則
限流主要是阻止大量請求同時打到服務器上
資源名 與@SentinelResource的value對應
針對來源 就是調用這個controller發送請求的來源,你要限流哪些來源的,默認全部
閾值類型:QPS每秒通過多少個(多少個就是單機閾值的數量),并發線程數通常配合線程池使用
是否集群:多服務器的情況下會用,也要設置一個閾值
比如,設置全局閾值12,比如進來100個請求,有三個服務器,它們總共只能處理12個請求
如果設置的單機均攤12,進來100個請求,就會每個服務器都能處理12個請求,總共36
繼續看:
流控模式分為3種:直接、關聯和鏈路
直接沒什么好說的,就是對單一資源進行限流
關聯就是a資源關聯b資源,當b資源訪問量大觸發限流時,a也會被限流
鏈路就是當同一個方法會被多種渠道調用時,只對部分渠道進行限流
流控效果分三種:快速失敗、warm up和排隊等待
快速失敗就是觸發限流后,后面的請求全部丟棄,報錯
warm up就是冷啟動,需要設置啟動時間n,前n秒內處理量大概為閾值的1/3,后面再逐步提高處理量達到閾值
排隊等待就是觸發限流后,后面的請求不會丟棄,而是排隊等待前面的執行完后它再執行,需要設置排隊時間,超過這個時間請求還未被處理的話,丟棄
ps:只有快速失敗支持關聯和鏈路,其它兩種不支持
(四)熔斷規則
當a服務調用b服務時,b服務可能會卡住執行很久,也可能會異常,這時a要及時熔斷,切斷與b的聯系,保護自己
又有一個問題?怎么判斷服務有問題去熔斷呢?熔斷之后怎么恢復連接呢?
答:判斷熔斷主要根據熔斷策略,符合條件即熔斷。恢復連接的話,當a、b服務間斷開的時長達到熔斷時長后,服務會切換到半開狀態,a會向b發送一個或幾個請求,如果這些請求正常執行,那就取消熔斷恢復運行,如果這些請求有問題(滿足熔斷條件),就會繼續保持熔斷
熔斷策略有三種:慢調用、異常比例和異常數
選擇慢調用
最大RT:最大的響應時間,超過這個時間判定為慢調用
比例閾值:當n%的調用是慢調用時,觸發熔斷
熔斷時長:熔斷多久
最小請求數:要觸發熔斷起碼要有多少個請求,低于這個數值不會熔斷
統計時長:統計時長
選擇異常比例
其他不變,沒用最大RT,比例閾值改為當n%的調用是異常時觸發熔斷
選擇異常數
其他不變,比例閾值改為異常數
(五)熱點規則
就是可以對方法的具體參數進行限流
當用戶調用這個方法,攜帶了3個參數,你可以設置熱點來對具體的第幾個參數進行限流
(六)總結
sentinel是服務保護的重要組件,起到限流、熔斷等作用
首先下載sentinel的jar包,用命令運行,用瀏覽器打開sentinel的控制臺
然后去項目中添加對應依賴,修改代碼,添加@SentinelResource,并寫對應的兜底方法
@RestController
public class UserController {@GetMapping("/user")@SentinelResource(value = "getUser", // 資源名,用于控制臺設置規則fallback = "fallbackMethod", // 業務異常兜底方法blockHandler = "blockHandlerMethod" // 流控、熔斷時的處理方法)public String getUser(@RequestParam(required = false) String name) {if ("error".equals(name)) {throw new RuntimeException("模擬業務異常");}return "用戶:" + name;}// fallback 方法:處理業務異常(如運行時異常)public String fallbackMethod(String name, Throwable e) {return "fallback:業務處理異常,返回兜底用戶";}// blockHandler 方法:處理被 Sentinel 限流、降級、熔斷的情況public String blockHandlerMethod(String name, BlockException ex) {return "blockHandler:服務被限流或熔斷,返回默認用戶";}
}
其實代碼部分很少,主要用控制臺對限流規則、熔斷規則進行配置即可