Spring Cloud(三)Hystrix的服務熔斷、服務降級
雪崩效應
在微服務架構中通常會有多個服務層呼叫,基礎服務的故障可能會導致級聯故障,進而造成整個系統不可用的情況,這種現象被稱為服務雪崩效應。服務雪崩效應是一種因“服務提供者”的不可用導致“服務消費者”的不可用,並將不可用逐漸放大的過程。
如果下圖所示:A作為服務提供者,B為A的服務消費者,C和D是B的服務消費者。A不可用引起了B的不可用,並將不可用像滾雪球一樣放大到C和D時,雪崩效應就形成了。
Hystrix特性
1.斷路器機制
斷路器很好理解, 當Hystrix Command請求後端服務失敗數量超過一定比例(預設50%), 斷路器會切換到開路狀態(Open). 這時所有請求會直接失敗而不會發送到後端服務. 斷路器保持在開路狀態一段時間後(預設5秒), 自動切換到半開路狀態(HALF-OPEN). 這時會判斷下一次請求的返回情況, 如果請求成功, 斷路器切回閉路狀態(CLOSED), 否則重新切換到開路狀態(OPEN). Hystrix的斷路器就像我們家庭電路中的保險絲, 一旦後端服務不可用, 斷路器會直接切斷請求鏈, 避免傳送大量無效請求影響系統吞吐量, 並且斷路器有自我檢測並恢復的能力.
2.Fallback
Fallback相當於是降級操作. 對於查詢操作, 我們可以實現一個fallback方法, 當請求後端服務出現異常的時候, 可以使用fallback方法返回的值. fallback方法的返回值一般是設定的預設值或者來自快取.
Feign Hystrix
繼續上篇文章的服務註冊發現與呼叫的工程
配置檔案新增
#啟用熔斷機制
feign.hystrix.enabled=true
UserHystrix 熔斷器,熔斷器要實現遠端呼叫的介面,在具體方法的中新增服務呼叫超時返回的內容
/* * @author uv * @date 2018/10/9 9:03 * 熔斷器 */ import com.uv.consumer.client.UserClient; import com.uv.consumer.entity.User; import java.util.ArrayList; import java.util.List; import org.springframework.stereotype.Component; @Component public class UserHystrix implements UserClient{ @Override public List<User> getUserList() { return new ArrayList<>(); } @Override public User getUserByPath(int id) { return new User().setAge(0).setId(-1).setName(null).setSex(null); } @Override public User getUserById(int id) { return new User().setAge(0).setId(-1).setName(null).setSex(null); } }
在UserClient的FeignClient註解新增fallback指向熔斷器
@FeignClient(name = "cloud-provider", fallback = UserHystrix.class)
測試
provider服務正常啟動的時候,呼叫測試顯示如下,返回呼叫取到的資料。
關閉provider服務後,進行測試呼叫如下,返回熔斷器定義的資料。