1. 程式人生 > >一起來學Spring Cloud | 第五章:熔斷器 ( Hystrix)

一起來學Spring Cloud | 第五章:熔斷器 ( Hystrix)

在微服務專案中,一個系統可以分割成很多個不同的服務模組,不同模組之間我們通常需要進行相互呼叫。springcloud中可以使用RestTemplate+Ribbon和Feign來呼叫(工作中基本都是使用feign)。有時為了提高系統的健壯性,某些訪問量大的服務模組還會做叢集部署。但是服務之間的呼叫不可能百分之百成功的,如果出現超時、異常會導致服務無法提供功能。這時如果有大量請求訪問異常服務,就會造成系統資源耗盡,導致服務癱瘓。服務與服務之間的依賴性,故障會傳播,會對整個微服務系統造成災難性的嚴重後果,這就是服務故障的“雪崩”效應。在實際工作中,複雜的系統往往有成百上千個服務模組,某個功能模組出現異常,不能影響其它功能的正常執行,所以熔斷器Hystrix就派上用場了。

一、Hystrix簡介:

Hystrix由Netfilix API團隊研發於2011年,2012年開始在Hystrix公司內部推廣和使用,Hystrix在Netflix中久經沙場,現在已經是一個非常成熟的系統,而最近流行的微服務架構和Spring Cloud,讓Hystrix成為了配套的基礎設施,在國內也逐漸流行起來。

hystrix的出現即為解決服務雪崩效應,它通過四個方面的機制來解決這個問題

1. 隔離(執行緒池隔離和訊號量隔離):限制呼叫分散式服務的資源使用,某一個呼叫的服務出現問題不會影響其他服務呼叫。

2. 降級:超時降級、資源不足時(執行緒或訊號量)降級,降級後可以配合降級介面返回託底資料。

3. 熔斷:當失敗率達到閥值自動觸發降級(如因網路故障/超時造成的失敗率高),熔斷器觸發的快速失敗會進行快速恢復。

4. 快取:提供了請求快取、請求合併實現。

如果想要了解更多的Hystrix的底層及實現原理,可以參考相關文章學習,本系列主要講解如何快速在工作中使用Hystrix。

二、環境準備:

最終目錄結構:

 

本系列文章,都是層層遞進的,本章內容在前面搭建好的專案框架上進行開發講解,對搭建springcloud的多模組子專案框架不清楚的同學可以參考 :一起來學Spring Cloud | 第一章 :如何搭建一個多模組的springcloud專案 

工作中,我們基本上都是使用feign進行服務呼叫的,所以本章只講解Feign中使用斷路器,對上一章feign工程搭建有興趣的可以參考:一起來學Spring Cloud | 第四章:服務消費者 ( Feign )

三、Feign中使用斷路器:

1. 在上章的springcloud-feign-client工程的application.properties配置檔案中,加入配置:feign.hystrix.enabled=true

server.port=9600
spring.application.name=springcloud-feign-client
eureka.client.serviceUrl.defaultZone=http://localhost:8761/eureka/
feign.hystrix.enabled=true

2. 在上章的springcloud-feign-client工程中,新增一個FeignRemoteService類的實現類,命名為:HystrixFeignRemoteCallBack,做為出現介面異常時的回撥方法

package com.haly.romote.hystrix;

import org.springframework.stereotype.Component;

import com.haly.romote.FeignRemoteService;

@Component
public class HystrixFeignRemoteCallBack implements FeignRemoteService{

	@Override
	public String hello(String name) {
		// TODO Auto-generated method stub
		return name + ",Due error,enter Hystrix";
	}

}

3. 在上章的springcloud-feign-client工程中,新增一個FeignRemoteService類中加入回撥實現類的註解配置

package com.haly.romote;

import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;

import com.haly.romote.hystrix.HystrixFeignRemoteCallBack;

@FeignClient(value = "springcloud-eureka-client",fallback = HystrixFeignRemoteCallBack.class)
public interface FeignRemoteService {

    @RequestMapping(value = "/hello",method = RequestMethod.GET)
    public String hello(@RequestParam(value = "name") String name);
    
}

4. 執行專案

① 先啟動springcloud-eureka-server模組,開啟eureka註冊中心

② 啟動springcloud-eureka-client模組,開啟提供遠端服務功能,並且提供介面能力 /hello

③ 啟動springcloud-feign-client模組,開啟消費模組,用來呼叫springcloud-eureka-client模組中的/hello介面

Eureka上的註冊資訊,如下圖:

開啟瀏覽器,輸入網址:http://localhost:9600/getHello?name=young碼農,執行結果如下:

我們模仿生產環境,服務提供者宕機(或者返回超時),這裡我們手動停掉springcloud-eureka-client服務

輸入網址:http://localhost:9600/getHello?name=young碼農

本章我們只是在回撥介面中,返回一個字串,工作中,有些場景會做一些業務邏輯處理(比如呼叫簡訊傳送介面,出現異常會在記錄一條異常日誌,後面來處理這些異常)。

工作中我們會遇到很多特殊場景,特別在訪問量過大,業務較複雜的時候,會出現一些奇奇怪怪的問題,所以Feign,Hystrix有許多配置項可以使用,我們可以根據相應業務配進行合理配置