SpringCloud Hystrix服務熔斷及服務降級

分佈式系統面臨的問題
複雜分佈式系統中服務通常存在數十個依賴關係,每個依賴在某些時候不可避免的存在失敗的情況。

服務雪崩
多個微服務之間調用的時候,假設服務A調用服務B和服務C,而服務B和服務C又調用其他服務,這就是“扇出”,如果“扇出”的鏈路上某個服務的響應時間過長或者不可用,對服務A就會造成越來越多的系統資源佔用,進而引起系統崩潰,即“雪崩效應”。

Hystrix簡介
一個用於處理分佈式系統的延遲和容錯的開源庫,上面說到在分佈式系統中不可避免地的存在失敗的情況,hystrix可以保證在一個依賴出現問題的情況下,不會導致整體服務失敗,避免級聯故障,以提高分佈式系統的彈性。
“斷路器”本身是一種開關裝置,當某個服務單元發生故障時,通過斷路器的故障監控(類似與熔斷絲),向調用方返回一個預期的可處理的備選響應,而不是長時間的等待或拋出無法處理的異常,這樣就可以保證調用方不會長時間的、不必要的佔用,從而避免故障在分佈式系統中的蔓延乃至雪崩。

Hystrix能幹嗎?

  • 服務熔斷
  • 服務降級
  • 服務限流
  • 接近實時的監控
  • … …

Hystrix的工作原理:

  • 防止任何單個依賴項耗盡所有容器(例如Tomcat)用戶線程
  • 減少負載並快速失敗,而不是排隊
  • 在可行的情況下提供備用,以保護用戶免受故障的影響
  • 使用隔離技術(例如隔板,泳道和斷路器模式)來限制任何一種依賴關係的影響
  • 通過近實時指標,監視和警報優化發現時間
  • 通過在Hystrix的大多數方面中以低延遲傳播配置更改來優化恢復時間,並支持動態屬性更改,這使您可以通過低延遲反饋迴路進行實時操作修改。
  • 防止整個依賴客戶端執行失敗,而不僅僅是網絡通信失敗

服務熔斷是什麼?
對微服務雪崩效應的一種鏈路保護機制,當扇出鏈路中微服務響應時間過長或不可用時,會進行服務的降級,進而熔斷該服務節點的調用,快速返回錯誤的響應信息,當檢測到該鏈路訪問正常時恢復該鏈路的正常調用。spring cloud中hystrix會監控微服務的調用,當失敗調用達到一定的閾值,默認爲5秒20次失敗調用就會啓動熔斷機制,熔斷機制的註解爲@HystrixCommand唯一的註解

原理簡單介紹完畢,接下來開始動手實現
1)引入依賴

<!-- Hystrix依賴 -->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-hystrix</artifactId>
    <version>1.4.6.RELEASE</version>
</dependency>

2)@HystrixCommand熔斷器配置

	@GetMapping("/query/{id}")
    @HystrixCommand(fallbackMethod = "queryHystrixUserById") //指定異常熔斷方法
    public String queryUserById(@Param(value = "id")Long id){
        return new User().setUsername("沒有查到用戶信息")
                .setPass("123")
                .toString();
    }

    public String queryHystrixUserById(@Param(value = "id")Long id){
        User user = userService.queryUserById(id);
        return user.toString();
    }

3)主啓動類開啓熔斷機制

@SpringBootApplication
@EnableEurekaClient
@EnableCircuitBreaker //開啓hystrix熔斷器
public class ProHystrixApplication {

    public static void main(String[] args) {
        SpringApplication.run(ProHystrixApplication.class,args);
    }

}

服務熔斷處理完成
服務熔斷處理完成
服務熔斷處理完成

服務降級思想
降級指的是當服務的提供方不可使用的時候,程序不會出現異常,而會出現本地的操作調用。
例如:年底 12306 都是最繁忙的時候,那麼在這個情況會發現有一些神奇的情況:當到了指定的時間大家開始搶票的 時候,如果你不搶,而後查詢一些冷門的車次,票有可能查詢不出來,因爲這個時候會將所有的系統資源給搶票調度了,而其它的 服務由於其暫時不受到過多的關注,這個時候可以考慮將服務降級(服務暫停)
服務的降級處理是在客戶端實現的,與你的服務器端沒有關係

服務降級的實現
1)服務降級類

public class IUserServiceFallFatory implements FallbackFactory { //實現FallbackFactory.create方法

    public IUserService create(Throwable throwable) {
        return new IUserService() {
            public boolean addUser(User user) {
                return false;
            }

            public User queryUserById(Long id) {
                return new User().setUsername("未查詢到用戶");
            }

            public List<User> queryUserList() {
                return null; //不建議直接返回空,不利於前端解析
            }
        };
    }
}

2)關聯客戶端接口

//value:微服務名稱 fallbackFactory:服務降級
@FeignClient(value = "pro_user",fallbackFactory = IUserServiceFallFatory.class) //配置服務降級
public interface IUserService {

    @GetMapping("/api/user/add")
    public boolean addUser(User user);

    @GetMapping("/api/user/query/{id}")
    public User queryUserById(@PathVariable("id")Long id);

    @GetMapping("/api/user/query")
    public List<User> queryUserList();


}

3)配置開啓feign—>hystrix的服務降級

feign:
  hystrix:
    enabled: true #開啓服務降級

服務降級處理完成
服務降級處理完成
服務降級處理完成

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