SpringCloud(四)Hystrix解決雪崩問題-服務熔斷

服務熔斷

Hystix解決雪崩問題的手段有兩個:線程隔離 和 服務熔斷。在上節中瞭解了的服務服務降級使用,這節看看服務熔斷的配置使用

熔斷原理

熔斷器,也叫斷路器,其英文單詞爲: Circuit Breaker
熔斷機制的原理很簡單,像家裏的電路熔斷器,如果電路發生短路能立刻熔斷電路,避免發生災難。在分佈式系統中應用這-模式之後,服務調用方可以自己進行判斷某些服務反應慢或者存在大量超時的情況時,能夠主動熔斷,防止整個系統被拖垮。
不同於電路熔斷只能斷不能自動重連,Hystrix 可以實現彈性容錯,當情況好轉之後,可以自動重連。這就好比魔術師把鴿子變沒了容易,但是真正考驗技術的是如何把消失的鴿子再變回來。通過斷路的式,可以將後續請求直接拒絕掉,一段時間之後允許部分請求通過,如果調用成功則回到電路閉合狀態,否則繼續斷開。

狀態機有3個狀態

在這裏插入圖片描述

  • Closed: 關閉狀態(斷路器關閉),所有請求都正常訪問。
  • Open:打開狀態(斷路器打開),所有請求都會被降級。Hystix會對請求情況計數,當一定時間內失敗請求百分比達到閾值,則觸發熔斷,斷路器會完全關閉。默認失敗比例的閾值是50%,請求次數最少不低於20次。
  • Half Open:半開狀態,Closed狀態不是永久的,關閉後會進入休眠時間(默認是5S)。隨後斷路器會自動進入半開狀態。此時會釋放部分請求通過,若這些請求都是健康的,則會完全打開斷路器,否則繼續保持關閉,再次進行休眠計時。
@RestController
@RequestMapping("/consumer")
@DefaultProperties(defaultFallback = "findByIdFallback")
public class ConsumerController {

    @Autowired
    private RestTemplate restTemplate;
    @GetMapping("{id}")
    @HystrixCommand(commandProperties = {
            @HystrixProperty(name = "circuitBreaker.requestVolumeThreshold",value = "10"),
            @HystrixProperty(name = "circuitBreaker.sleepWindowInMilliseconds",value = "10000"),
            @HystrixProperty(name = "circuitBreaker.errorThresholdPercentage",value = "60")

    })
    public String findById(@PathVariable("id") Integer id) {
        if (id % 2 == 0) {//多次訪問偶數id觸發熔斷
            throw new RuntimeException("");
        }
        String url = "http://user-service/user/findById/" + id;
        String user = restTemplate.getForObject(url, String.class);
        return user;
    }
    
 	//默認fallback方法,不需要再有參數了
    public String findByIdFallback(){
        return "不好意思!服務器正忙!!!!";
    }
}

在這裏插入圖片描述
默認的熔斷觸發要求較高,休眠時間窗較短,爲了測試方便,我們可以通過配置修改熔斷策略

# 觸發熔斷的最小請求次數,默認20
circuitBreaker.requestVolumeThreshold=10 # requestVolumeThreshold
# 觸發熔斷的失敗請求最小佔比,默認50%
circuitBreaker.sleepWindowInMilliseconds=10000 # errorThresholdPercentage
# 休眠時長,默認是5000毫秒
circuitBreaker.errorThresholdPercentage =50 # sleepWindowlnMilliseconds

(一般熔斷時長,我們不需要去調,而上節的超時時長需要根據具體需求去調節)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章