一、Hystrix簡介
在微服務架構中,根據業務來拆分成一個個的服務,服務與服務之間可以相互調用(RPC),在Spring Cloud可以用RestTemplate+Ribbon和Feign來調用。爲了保證其高可用,單個服務通常會集羣部署。由於網絡原因或者自身的原因,服務並不能保證100%可用,如果單個服務出現問題,調用這個服務就會出現線程阻塞,此時若有大量的請求涌入,Servlet容器的線程資源會被消耗完畢,導致服務癱瘓。服務與服務之間的依賴性,故障會傳播,會對整個微服務系統造成災難性的嚴重後果,這就是服務故障的“雪崩”效應。爲了解決這個問題,業界提出了斷路器模型。
作用:斷路器,保護系統,控制故障範圍。
Netflix開源了Hystrix組件,實現了斷路器模式,SpringCloud對這一組件進行了整合。 在微服務架構中,通常有多層服務調用。
較低級別的服務中的服務故障可能導致用戶級聯故障。當對特定服務的呼叫達到一定閾值時(Hystrix中的默認值爲5秒內的20次故障),電路打開,不進行通話。在錯誤和開路的情況下,開發人員可以提供後備。
斷路打開後,可用避免連鎖故障,fallback方法可以直接返回一個固定值。
二、Feign中使用斷路器
1.Feign自帶斷路器,在D版本的Spring Cloud之後,沒有默認打開。需在application.yml中配置打開:
#Feign自帶斷路器
feign:
hystrix:
enabled: true
2.基於上一篇的demo_eureka_feign項目繼續開發,只需在service層下的的SchedualServiceHi接口的註解中加上fallback的指定類即可:
package com.example.demo_eureka_feign.service;
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;
/**
* 定義一個feign接口,通過@ FeignClient(“服務名”),來指定調用哪個服務。
* 比如在代碼中調用了eureka-client-zyy-demo服務的“/hi”接口.
*/
@FeignClient(value = "eureka-client-zyy-demo",fallback = SchedualServiceHiHystric.class)
public interface SchedualServiceHi {
@RequestMapping(value = "/hi",method = RequestMethod.GET)
String sayHiFromClientOne(@RequestParam(value = "name") String name);
}
3.需要創建一個fallback指定的類SchedualServiceHiHystric,需要實現SchedualServiceHi 接口,並注入到Ioc容器中:
package com.example.demo_eureka_feign.service;
import org.springframework.stereotype.Component;
@Component
public class SchedualServiceHiHystric implements SchedualServiceHi {
@Override
public String sayHiFromClientOne(String name) {
return "sorry "+name;
}
}
4.啓動servcie-feign工程,不要啓動eureka-client-zyy-demo工程,瀏覽器打開http://localhost:8765/hi?name=forezp,顯示:
sorry forezp
啓動eureka-client-zyy-demo工程,再次訪問,瀏覽器顯示:
hello forezp ,I am from port:8762