Netflix Hystrix — 應對複雜分散式系統中的延時和故障容錯
+
應用場景
分散式系統中經常會出現某個基礎服務不可用造成整個系統不可用的情況, 這種現象被稱為服務雪崩效應. 為了應對服務雪崩, 一種常見的做法是手動服務降級. 而Hystrix的出現,給我們提供了另一種選擇
Hystrix的內部處理邏輯
構建Hystrix的Command物件, 呼叫執行方法.
Hystrix檢查當前服務的熔斷器開關是否開啟, 若開啟, 則執行降級服務getFallback方法.
若熔斷器開關關閉, 則Hystrix檢查當前服務的執行緒池是否能接收新的請求, 若超過執行緒池已滿, 則執行降級服務getFallback方法.
若執行緒池接受請求, 則Hystrix開始執行服務呼叫具體邏輯run方法.
若服務執行失敗, 則執行降級服務getFallback方法, 並將執行結果上報Metrics更新服務健康狀況.
若服務執行超時, 則執行降級服務getFallback方法, 並將執行結果上報Metrics更新服務健康狀況.
若服務執行成功, 返回正常結果.
若服務降級方法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;
}
}
我們經常呼叫第三方的東西,如果延遲了,服務掛了,我們不希望會導致自己的介面阻塞,報錯等等。