Hystrix的簡介及使用案例


雪崩效應:分布式系統環境下,服務間類似依賴非常常見,一個業務調用通常依賴多個基礎服務,當某個服務不可用時,商品服務請求線程被阻塞,當有大批量請求調用該服務時,最終可能使整個服務資源耗盡,無法繼續對外提供服務。
Hystrix正式為了解決這種問題才出現的。
服務熔斷:服務熔斷一般是指軟件系統中,由於某些原因使得服務出現了過載現象,為防止造成整個系統故障,從而采用的一種保護措施,所以很多地方把熔斷亦稱為過載保護。
服務降級:當服務器壓力劇增的情況下,根據實際業務情況及流量,對一些服務和頁面有策略的不處理或換種簡單的方式處理,從而釋放服務器資源以保證核心交易正常運作或高效運作。
使用:
1.導入依賴:
<!--hystrix-->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
2.主啟動類:加上@EnableHystrix或@EnableCircuitBreaker注解。
3.配置yml:
若和openfeign一起使用,需配置:
feign:
  hystrix:
    enabled: true
4.配置注解和編寫fallbackMethod方法
fallbackMethod方法為服務降級或熔斷時調用的方法,是兜底的方法。
降級:

@HystrixCommand(fallbackMethod = "TimeOutHandler",commandProperties = {
        @HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds",value = "5000")

execution.isolation.strategy:該屬性用來設置HystrixCommand.run()執行的隔離策略。默認為THREAD。

execution.isolation.thread.timeoutInMilliseconds:該屬性用來配置HystrixCommand執行的超時時間,單位為毫秒。

execution.timeout.enabled:該屬性用來配置HystrixCommand.run()的執行是否啟用超時時間。默認為true。

execution.isolation.thread.interruptOnTimeout:該屬性用來配置當HystrixCommand.run()執行超時的時候是否要它中斷。

execution.isolation.thread.interruptOnCancel:該屬性用來配置當HystrixCommand.run()執行取消時是否要它中斷。

該注解意味着當超時5秒后,將調用TimeOutHandler兜底。

熔斷:

@HystrixCommand(fallbackMethod = "paymentCircuitBreaker_fallback",commandProperties = {
@HystrixProperty(name = "circuitBreaker.enabled",value = "true"),
@HystrixProperty(name = "circuitBreaker.requestVolumeThreshold",value = "10"),
@HystrixProperty(name = "circuitBreaker.sleepWindowInMilliseconds",value = "10000"),
@HystrixProperty(name="circuitBreaker.errorThresholdPercentage",value = "60"),

circuitBreaker.enabled:確定當服務請求命令失敗時,是否使用斷路器來跟蹤其健康指標和熔斷請求。默認為true。

circuitBreaker.requestVolumeThreshold:用來設置在滾動時間窗中,斷路器熔斷的最小請求數。例如,默認該值為20的時候,如果滾動時間窗(默認10秒)內僅收到19個請求,即使這19個請求都失敗了,斷路器也不會打開。

circuitBreaker.sleepWindowInMilliseconds:用來設置當斷路器打開之后的休眠時間窗。休眠時間窗結束之后,會將斷路器設置為“半開”狀態,嘗試熔斷的請求命令,如果依然時候就將斷路器繼續設置為“打開”狀態,如果成功,就設置為“關閉”狀態。

circuitBreaker.errorThresholdPercentage:該屬性用來設置斷路器打開的錯誤百分比條件。默認值為50,表示在滾動時間窗中,在請求值超過requestVolumeThreshold閾值的前提下,如果錯誤請求數百分比超過50,就把斷路器設置為“打開”狀態,否則就設置為“關閉”狀態。

circuitBreaker.forceOpen:該屬性默認為false。如果該屬性設置為true,斷路器將強制進入“打開”狀態,它會拒絕所有請求。該屬性優於forceClosed屬性。

circuitBreaker.forceClosed:該屬性默認為false。如果該屬性設置為true,斷路器強制進入“關閉”狀態,它會接收所有請求。如果forceOpen屬性為true,該屬性不生效。

意味着在10秒內,10次請求有6次失敗,則打開斷路器,執行fallbackMethod方法。否則,將不會打開斷路器。

 

全局服務降級的使用:需要將多個服務的fallbackMethod函數設置為同一個,則需要使用@DefaultProperties注解:

@DefaultProperties(defaultFallback = "Gobal_Fallback")
public class ConsumerHystrixController {
@HystrixCommand
public String paymentTimeout(@PathVariable("id") Integer id){
int i=10/0;
String result=paymentHystrixService.paymentTimeout(id);
log.info(result);
return result;
}
//全局fallback
public String Gobal_Fallback(){
return "全局FallBack";
}
}
注:該注解將全局服務降級的方法設置為Gobal_Fallback,使用全局降級的方法只需加上@HystrixCommand。
和openfeign的使用:openfeign是基於接口進行調用的框架,和Hystrix一起使用也非常簡單:
@Service
@FeignClient(value="cloud-hystrix-payment",fallback = PaymentHystrixServiceImpl.class)
public interface PaymentHystrixService {
@GetMapping("/payment/hystrix/ok/{id}")
public String paymentInfo(@PathVariable("id") Integer id);
@GetMapping("/payment/hystrix/timeout/{id}")
public String paymentTimeout(@PathVariable("id") Integer id);
}
在@FeignClient中指定fallback = PaymentHystrixServiceImpl.class
PaymentHystrixServiceImpl實現了  PaymentHystrixService中的方法, PaymentHystrixService中的接口方法一一對應。
@CoPayment
public class PaymentHystrixServiceImpl implements PaymentHystrixService{
@Override
public String paymentInfo(Integer id) {
"PaymentHystrixServiceImpl 1";
    @Override
public String paymentTimeout(Integer id) {
return "PaymentHystrixServiceImpl 2";
}
}
最后:配置
feign:
hystrix:
enabled: true
開啟Hystrix的使用。
 
        

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM