Netflix Hystrix — 應對複雜分佈式系統中的延時和故障容錯spring
應用場景負載均衡
分佈式系統中常常會出現某個基礎服務不可用形成整個系統不可用的狀況, 這種現象被稱爲服務雪崩效應. 爲了應對服務雪崩, 一種常見的作法是手動服務降級. 而Hystrix的出現,給咱們提供了另外一種選擇。分佈式
Hystrix的內部處理邏輯
構建Hystrix的Command對象, 調用執行方法.ide
Hystrix檢查當前服務的熔斷器開關是否開啓, 若開啓, 則執行降級服務getFallback方法.url
若熔斷器開關關閉, 則Hystrix檢查當前服務的線程池是否能接收新的請求, 若超過線程池已滿, 則執行降級服務getFallback方法..net
若線程池接受請求, 則Hystrix開始執行服務調用具體邏輯run方法.線程
若服務執行失敗, 則執行降級服務getFallback方法, 並將執行結果上報Metrics更新服務健康情況.3d
若服務執行超時, 則執行降級服務getFallback方法, 並將執行結果上報Metrics更新服務健康情況.rest
若服務執行成功, 返回正常結果.對象
若服務降級方法getFallback執行成功, 則返回降級結果.
若服務降級方法getFallback執行失敗, 則拋出異常.
很少說先配置執行一波
Maven
<!--斷路由,服務容錯保護-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-hystrix</artifactId>
</dependency>
Java Code
public class BaseService {
@Autowired
protected RestTemplate restTemplate;
protected static String SERVICE_BIZ = "http://service-biz";
@Bean
@LoadBalanced
//開啓負載均衡
RestTemplate restTemplate() {
return new RestTemplate();
}
}
/**
* Created by gaomin on 2017/12/24.
*/
@Service
public class RestTemplateServiceImp extends BaseService implements RestTemplateService {
@Override @HystrixCommand(fallbackMethod = "getBizSerivceDataErrorBack") public Object getBizSerivceData() { String url = SERVICE_BIZ+"/index/findUserMenuList"; Map<String,Object> uriVariables = new HashMap<>(); return restTemplate.getForObject(url,Object.class); } /** * getBizSerivceDataErrorBack 和 getBizSerivceData 參數要同樣返回類型也要同樣 * 服務降級 SERVICE_BIZ服務掛了,自動走這個方法.適用於全部第三方 * 調用別的服務時,若是別的服務未響應,會致使本服務請求阻塞,這個能夠解決斷路由保護 * 直接返回error,默認請求時間2000毫秒 * @return */ public Object getBizSerivceDataErrorBack(){ //能夠從新請求,還能夠繼續降級 .... return null; } } 咱們常常調用第三方的東西,若是延遲了,服務掛了,咱們不但願會致使本身的接口阻塞,報錯等等。