1. 程式人生 > >Spring Cloud(三)Hystrix的服務熔斷、服務降級

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服務後,進行測試呼叫如下,返回熔斷器定義的資料。