說起springcloud熔斷讓我想起了去年股市中的熔斷,多次痛的領悟,隨意實施的熔斷對整個系統的影響是災難性的,好了接下來我們還是說正事。
# 熔斷器
*****
## 雪崩效應
在微服務架構中通常會有多個服務層調用,基礎服務的故障可能會導致級聯故障,進而造成整個系統不可用的情況,這種現象被稱為服務雪崩效應。服務雪崩效應是一種因“服務提供者”的不可用導致“服務消費者”的不可用,并將不可用逐漸放大的過程。
如果下圖所示:A作為服務提供者,B為A的服務消費者,C和D是B的服務消費者。A不可用引起了B的不可用,并將不可用像滾雪球一樣放大到C和D時,雪崩效應就形成了。

## 熔斷器(CircuitBreaker)
熔斷器的原理很簡單,如同電力過載保護器。它可以實現快速失敗,如果它在一段時間內偵測到許多類似的錯誤,會強迫其以后的多個調用快速失敗,不再訪問遠程服務器,從而防止應用程序不斷地嘗試執行可能會失敗的操作,使得應用程序繼續執行而不用等待修正錯誤,或者浪費CPU時間去等到長時間的超時產生。熔斷器也可以使應用程序能夠診斷錯誤是否已經修正,如果已經修正,應用程序會再次嘗試調用操作。
熔斷器模式就像是那些容易導致錯誤的操作的一種代理。這種代理能夠記錄最近調用發生錯誤的次數,然后決定使用允許操作繼續,或者立即返回錯誤。 熔斷器開關相互轉換的邏輯如下圖:

熔斷器就是保護服務高可用的最后一道防線。
## Hystrix特性
### 1.斷路器機制
斷路器很好理解, 當Hystrix Command請求后端服務失敗數量超過一定比例(默認50%), 斷路器會切換到開路狀態(Open). 這時所有請求會直接失敗而不會發送到后端服務. 斷路器保持在開路狀態一段時間后(默認5秒), 自動切換到半開路狀態(HALF-OPEN). 這時會判斷下一次請求的返回情況, 如果請求成功, 斷路器切回閉路狀態(CLOSED), 否則重新切換到開路狀態(OPEN). Hystrix的斷路器就像我們家庭電路中的保險絲, 一旦后端服務不可用, 斷路器會直接切斷請求鏈, 避免發送大量無效請求影響系統吞吐量, 并且斷路器有自我檢測并恢復的能力.
### 2.Fallback
Fallback相當于是降級操作. 對于查詢操作, 我們可以實現一個fallback方法, 當請求后端服務出現異常的時候, 可以使用fallback方法返回的值. fallback方法的返回值一般是設置的默認值或者來自緩存.
### 3.資源隔離
在Hystrix中, 主要通過線程池來實現資源隔離. 通常在使用的時候我們會根據調用的遠程服務劃分出多個線程池. 例如調用產品服務的Command放入A線程池, 調用賬戶服務的Command放入B線程池. 這樣做的主要優點是運行環境被隔離開了. 這樣就算調用服務的代碼存在bug或者由于其他原因導致自己所在線程池被耗盡時, 不會對系統的其他服務造成影響. 但是帶來的代價就是維護多個線程池會對系統帶來額外的性能開銷. 如果是對性能有嚴格要求而且確信自己調用服務的客戶端代碼不會出問題的話, 可以使用Hystrix的信號模式(Semaphores)來隔離資源.
# Feign Hystrix
*****
因為熔斷只是作用在服務調用這一端,因此我們根據上一篇的示例代碼只需要改動spring-cloud-consumer項目相關代碼就可以。因為,Feign中已經依賴了Hystrix所以在maven配置上不用做任何改動。
## 1、配置文件
application.properties添加這一條:
```
feign.hystrix.enabled=true
```
## 2、創建回調類
創建HelloRemoteHystrix類繼承與HelloRemote實現回調的方法
```
@Component
public class HelloRemoteHystrix implements HelloRemote{
@Override
public String hello(@RequestParam(value = "name") String name) {
return "hello" +name+", this messge send failed ";
}
}
```
## 3、添加fallback屬性
在HelloRemote類添加指定fallback類,在服務熔斷的時候返回fallback類中的內容。
```
@FeignClient(name= "spring-cloud-producer",fallback = HelloRemoteHystrix.class)
public interface HelloRemote {
@RequestMapping(value = "/hello")
public String hello(@RequestParam(value = "name") String name);
}
```
改動點就這點,很簡單吧。
## 4、測試
那我們就來測試一下看看效果吧。
依次啟動spring-cloud-eureka、spring-cloud-producer、spring-cloud-consumer三個項目。
瀏覽器中輸入:http://localhost:9001/hello/neo
返回:hello neo,this is first messge
說明加入熔斷相關信息后,不影響正常的訪問。接下來我們手動停止spring-cloud-producer項目再次測試:
瀏覽器中輸入:http://localhost:9001/hello/neo
返回:hello neo, this messge send failed
根據返回結果說明熔斷成功。
- JeeSpringCloud
- JeeSpringCloud-獎項
- JeeSpringCloud-企業版
- 企業開發文檔(開源不易)!
- JeeSpringCloud項目外包服
- 快速開發
- 部署初級
- 部署高級
- 部署異常處理
- JeeSpringDriver.java相關注解類報紅色
- Whitelabel Error Page用開發工具啟動報錯
- MAC電腦Whitelabel Error Page用開發工具啟動報錯
- jstl_core報錯沒有找到
- 多模塊訪問不了jsp或訪問不了jsp
- 導入sql報錯
- Error creating 'tfTicketServiceImpl'
- 運行后系統不到的報acivemq異常
- 有報數據庫相關錯誤
- 運行act表格異常
- 不用使用中文路徑
- 開發異常處理
- 代碼生成后訪問報404
- 發版日志&計劃
- 發版日志
- 發版計劃
- 企業群技術咨詢
- 開發培訓文檔
- 目錄
- 系統介紹
- 功能介紹
- 代碼生成步驟
- 代碼生成專題
- 架構代碼介紹
- 集群
- 隊列
- 高速緩存
- 多項目
- JeeSpringCloud-熱部署
- 系統配置項
- 系統配置界面
- 正式版啟用
- 驗證碼啟用
- 修改版本
- 異常郵箱
- 授權功能
- 系統配置文件
- application.yml
- bootstrap.yml
- 系統專題
- 系統模塊專題
- 云接口專題
- 代碼生成專題
- 開發專題
- 數據權限
- SpringBoot教程(免費)
- 入門篇
- web綜合開發
- SpringCloud(免費)
- 大話Spring Cloud
- 注冊中心Eureka
- 服務提供與調用
- 熔斷器Hystrix
- 項目管理(免費)
- 手把手教你做2019年計劃
- 面試(免費)
- 40K!程序員四面美團,已拿Offer!這些經驗分享給你!
- 小白程序員僅用 5 分鐘入職 BAT,他只做了這件事!