文章目錄
- 常見服務調用異常
-
- 服務雪崩
- 服務限流
- 服務熔斷
- 服務降級
- 服務熔斷降級的方案
-
- 平均響應時間
- 異常比例
- 異常數量
- 常見的四種限流算法
-
- 計數器算法
- 滑動視窗限流算法
- 令牌桶限流算法
- 漏桶限流算法
- Sentinel
-
- 概述
-
- 部署Sentinel Dashboard
- Sentinel實戰
-
- 使用SphU或SphO進行限流
- 使用@SentinelResource進行限流
-
- 限流規則和熔斷規則參數解釋
- Sentinel內建
-
- SpringCloud--Dashboard方式
- 限流異常和資源清晰
-
- 自定義URL限流異常
- URL資源清晰
- 內建Nacos
- 總結
常見服務調用異常
服務雪崩
- 一個服務失敗,導緻整條鍊路的服務都失敗的情況
- 服務熔斷和服務降級就可以視為解決雪崩的手段
服務限流
- 限流的主要的目的是通過限制并發通路數或者限制一個視窗内所允許處理的請求數量來保護系統,一旦達到限制流量,則對目前請求進行對應的拒絕政策。如:跳轉錯誤頁面,進入排隊隊列,服務降級。
服務熔斷
當某個服務提供者無法正常為服務調用者提供服務時,為了防止服務雪崩,暫時将出現故障的接口隔離出來,後續一段時間内該服務調用者的請求都會直接失敗,知道目标服務恢複正常

服務降級
- 當下遊的服務因為某種原因響應過慢,下遊服務主動停掉一些不太重要的業務,釋放出伺服器資源,增加響應速度
- 當下遊的服務因為某種原因不可用,上遊主動調用本地的一些降級邏輯,避免卡頓,迅速傳回給使用者
- 服務降級大多是屬于一種業務級别的處理。比如:開關降級(做一個開關配置放在配置中心,在配置中心更改開關,決定哪些服務進行降級)
服務熔斷降級的方案
平均響應時間
比如1秒鐘持續進入5個請求,對應時刻的平均響應時間均超過門檻值,那麼接下來在一個固定的時間視窗内,對這個方法的通路都自動熔斷
異常比例
當某個方法每秒調用所獲得的異常總數的比例超過設定的門檻值,該資源會自動進入降級狀态,也就是在接下來的一個固定時間視窗中,對這個方法的調用都會自動傳回
異常數量
和異常比例類似,當某個方法在指定時間視窗内獲得的異常數量超過門檻值,會觸發熔斷
常見的四種限流算法
計數器算法
滑動視窗限流算法
令牌桶限流算法
漏桶限流算法
Sentinel
https://github.com/alibaba/Sentinel/wiki/介紹
概述
- 面向分布式服務架構的輕量級流量控制元件,主要以流量為切入點,從限流,流量整形,服務降級,系統負載保護等多元度實作微服務的穩定性
部署Sentinel Dashboard
- 下載下傳Sentinel源碼或者直接下載下傳release版本jar包
- 源碼:https://github.com/alibaba/Sentinel
- jar包:https://github.com/alibaba/Sentinel/releases
-
指令啟動Sentinel Dashboard
啟動指令:
java -Dserver.port=8000 -Dcsp.sentinel.dashboard.server=localhost:8000 - Dproject.name=sentinel-dashboard -jar sentinel-dashboard-x.x.x.jar
- 通路控制台http://localhost:8000
使用者名密碼: sentinel
Sentinel實戰
使用SphU或SphO進行限流
使用@SentinelResource進行限流
定義資源時,也可以使用@SentinelResource注解的方式,友善的進行資源管理。
- 首先:引入sentinel-annotation-aspectj依賴
<dependency> <groupId>com.alibaba.csp</groupId> <artifactId>sentinel-annotation-aspectj</artifactId> <version>1.4.0</version> </dependency>
- 其次:編寫Configuration配置類
- 第三:編寫服務類
@SentinelResource(value = "process", blockHandler = "processBlockHandler",
fallback ="fallbackHandler")
public void process() {
...
...
}
限流規則和熔斷規則參數解釋
- FlowRule(限流規則)
- rule.setGrade() //限流門檻值類型
- rule.setControlBehavior() // QPS流量流控行為
- rule.setStrategy() //調用關系限流政策
- DegradeRule(熔斷規則)
- rule.setGrade() 熔斷政策
Sentinel內建
SpringCloud–Dashboard方式
- 啟動Sentinel Dashboard
java -Dserver.port=8000
-Dcsp.sentinel.dashboard.server=localhost:8000
-Dproject.name=sentinel-dashboard
-jar sentinel-dashboard-1.8.0.jar
- 在application.yml中添加如下配置
spring: application: name: sentinel-demo cloud: sentinel: transport: dashboard: 127.0.0.1:8000
- 配置簇點鍊路
限流異常和資源清晰
自定義URL限流異常
通過實作UrlBlockHandler接口,來重寫blocked方法
URL資源清晰
通過實作UrlCleaner接口,重寫clean方法
內建Nacos
- 配置啟動Nacos
Nacos官網 https://nacos.io/zh-cn/docs/quick-start.html 下載下傳安裝包 https://github.com/alibaba/nacos/releases 啟動Nacos sh startup.sh -m standalone 打開控制台 http://localhost:8848/nacos 使用者名&密碼為:nacos & nacos
- 在nacos中建立流量配置規則
[
{ "resource": "/withnacos",
"limitApp": "default",
"grade": 1,
"count": 1,
"strategy": 0,
"clusterMode": false
}
]
- 添加Nacos資料源的依賴包
<dependency> <groupId>com.alibaba.csp</groupId> <artifactId>sentinel-datasource-nacos</artifactId> <version>1.7.0</version> </dependency>
- 在項目中application.yml中配置
spring:
application:
name: sentinel-nacos-demo
cloud:
sentinel:
transport:
dashboard: 127.0.0.1:8000
datasource:
- nacos:
server-addr: 127.0.0.1:8848
data-id: sentinel-nacos-demo-sentinel-flow
group-id: DEFAULT_GROUP
data-type: json
rule-type: flow