在微服務項目中,一個系統能夠分割成不少個不一樣的服務模塊,不一樣模塊之間咱們一般須要進行相互調用。springcloud中可使用RestTemplate+Ribbon和Feign來調用(工做中基本都是使用feign)。有時爲了提升系統的健壯性,某些訪問量大的服務模塊還會作集羣部署。可是服務之間的調用不可能百分之百成功的,若是出現超時、異常會致使服務沒法提供功能。這時若是有大量請求訪問異常服務,就會形成系統資源耗盡,致使服務癱瘓。服務與服務之間的依賴性,故障會傳播,會對整個微服務系統形成災難性的嚴重後果,這就是服務故障的「雪崩」效應。在實際工做中,複雜的系統每每有成百上千個服務模塊,某個功能模塊出現異常,不能影響其它功能的正常運行,因此熔斷器Hystrix就派上用場了。html
1、Hystrix簡介:java
Hystrix由Netfilix API團隊研發於2011年,2012年開始在Hystrix公司內部推廣和使用,Hystrix在Netflix中久經沙場,如今已是一個很是成熟的系統,而最近流行的微服務架構和Spring Cloud,讓Hystrix成爲了配套的基礎設施,在國內也逐漸流行起來。web
hystrix的出現即爲解決服務雪崩效應,它經過四個方面的機制來解決這個問題spring
1. 隔離(線程池隔離和信號量隔離):限制調用分佈式服務的資源使用,某一個調用的服務出現問題不會影響其餘服務調用。瀏覽器
2. 降級:超時降級、資源不足時(線程或信號量)降級,降級後能夠配合降級接口返回託底數據。緩存
3. 熔斷:當失敗率達到閥值自動觸發降級(如因網絡故障/超時形成的失敗率高),熔斷器觸發的快速失敗會進行快速恢復。網絡
4. 緩存:提供了請求緩存、請求合併實現。架構
若是想要了解更多的Hystrix的底層及實現原理,能夠參考相關文章學習,本系列主要講解如何快速在工做中使用Hystrix。app
2、環境準備:框架
最終目錄結構:
本系列文章,都是層層遞進的,本章內容在前面搭建好的項目框架上進行開發講解,對搭建springcloud的多模塊子項目框架不清楚的同窗能夠參考 :一塊兒來學Spring Cloud | 第一章 :如何搭建一個多模塊的springcloud項目
工做中,咱們基本上都是使用feign進行服務調用的,因此本章只講解Feign中使用斷路器,對上一章feign工程搭建有興趣的能夠參考:一塊兒來學Spring Cloud | 第四章:服務消費者 ( Feign )
3、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有許多配置項可使用,咱們能夠根據相應業務配進行合理配置