目錄
-
- 前言
- hystrix使用
- feign接口內建hystrix
- 總結
前言
hystrix是Netflix推出的一個比較有知名度的服務降級、熔斷元件
hystrix設計的主要原則主要是為了解決分布式環境中由于網絡的不可确定性導緻的關聯服務的級聯故障。
如A服務調用B服務,B服務調用C,C服務調用D,由于D服務發生了故障,導緻C服務調用D服務時一直得不到響應,如響應時間達到30秒後傳回了逾時。
那麼在這30秒内如果有500個請求調用了A服務,由于D服務的故障,将導緻A、B、C三個服務都會有500個線程處于挂起狀态,此時500個線程可能已經是A、B、C服務的極限了,将會導緻當有其他請求調用A、B、C的正常請求時也無法通路到了,最後可能導緻A、B、C全部癱瘓。
hystrix就是為了解決以上的服務依賴調用時的級聯故障
hystrix使用
在一個springcloud項目中添加依賴
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
啟動類添加注解@EnableCircuitBreaker
現在我們寫一個D服務,即D服務的方法會延遲2秒再傳回
@RestController
public class HystrixController33 {
// 對該方法啟動Hystrix,失敗進入目前類的fallbackMethod方法,
// fallbackMethod的參數必須和目前保持一緻,可以加Throwable參數
@HystrixCommand(fallbackMethod = "fallbackMethod")
@GetMapping("/hystrixTimeOut")
public String hystrixTimeOut() {
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
return "成功";
}
public String fallbackMethod(Throwable e) {
System.out.println("error:"+e.toString());
return "進入fallbackMethod";
}
}
此時如果有一個C服務通過spring的RestTemplate來調用D服務的hystrixTimeOut方法,那麼D服務的方法hystrixTimeOut會進入fallbackMethod方法然後傳回失敗資訊。原因的hystrix預設的逾時時間是1秒,即當hystrixTimeOut阻塞了兩秒時已經超過了預設的1秒即會進入快速失敗。hystrix就是通過這種服務降級(快速失敗)的方式來解決服務級聯故障的
至此我們已經了解了hystrix最核心的思想了
當然hystrix還有非常豐富的降級政策,支援熔斷、逾時、限流、失敗門檻值等多種政策
1、逾時降級
application.properties配置以下配置
# ribbon的逾時時間主要是為了避免使用RestTemplate時ribbon的負載均衡逾時時間影響hystrix的逾時時間
ribbon.ReadTimeout=10000
ribbon.ConnectTimeout=10000
# 開啟逾時降級,預設為true
hystrix.command.default.execution.timeout.enabled=true
# 設定逾時時間為5秒,預設為1秒,這個配置是肯定要改的
hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds=5000
此時當C調用D時由于阻塞時間2秒小于5秒,是以方法不會被降級
2、限流降級
# hystrix限流
# 采用線程池的限流方式
hystrix.command.default.execution.isolation.strategy=THREAD
# 線程限流的核心線程數,肯定要修改,不修改則預設并發量隻有10,超過10的并發量就會限流降級
hystrix.threadpool.default.coreSize=100
# BlockingQueue的最大隊列數,預設值-1(-1時配置下面的queueSizeRejectionThreshold會無效)
hystrix.threadpool.default.maxQueueSize=300
# 即使maxQueueSize沒有達到,達到queueSizeRejectionThreshold該值後,請求也會被拒絕,預設值5
# 最好配置maxQueueSize和queueSizeRejectionThreshold一緻即可,如果兩個都使用預設的則最大并發量即為coreSize,超過則會被拒絕
hystrix.threadpool.default.queueSizeRejectionThreshold=300
配置限流降級,采用THREAD(線程池)方式限流,還可以配置SEMAPHORE(信号量)限流,
配置限流的最大核心線程數,配置隊列長度,以上配置下隻有D服務的hystrixTimeOut同時有100+300個并發請求進來時,超過門檻值的請求将會被降級,通過這種方式很好保護了資源避免過大并發導緻的資源耗盡
如果要使用SEMAPHORE(信号量),配置為
# 使用信号量模式,設定并發量
hystrix.command.default.execution.isolation.strategy=SEMAPHORE
hystrix.command.default.execution.isolation.semaphore.maxConcurrentRequests=200
hystrix.command.default.fallback.isolation.semaphore.maxConcurrentRequests=200
以上配置即門檻值達到200即被降級
3、失敗門檻值降級
hystrix預設失敗門檻值規則為:預設10秒内超過20個請求,并且失敗率達到50%即目前方法進入降級。失敗率門檻值可以配置
# 配置為60%
circuitBreaker.errorThresholdPercentage = 60
當該方法進入降級後,預設會在5秒後才會重新接受請求,此時會允許部分請求通過,若請求都是健康的(響應時間<250ms)則對請求健康恢複(取消熔斷),如果還不是健康的,則繼續熔斷。
feign接口內建hystrix
feign接口可以內建hystrix,配置為
@FeignClient(name="order", fallback = OrderFallback.class)
public interface OrderInterface {
@RequestMapping(value = "/test", method = GET)
String test(@RequestParam(”name") String name);
}
@Component
public class OrderFallback implements OrderInterface {
@Override
public String test(String name) {
return "請求失敗了";
}
}
當開啟了我們上面配置檔案application.properties的一些hystrix配置後,調用feign接口OrderInterface預設可以使用hystrix配置,是以無需配置方法注解@HystrixCommand,當我們不使用feign接口時我們針對某個方法如果要開啟降級測試則需要使用@HystrixCommand(fallbackMethod = “fallbackMethod”)
HystrixCommand的fallbackMethod可以在配置一個類的公共fallback方法,配置如下,使用@DefaultProperties配置
@DefaultProperties(defaultFallback = "fallbackTest")
@RestController
public class HystrixController2 {
@HystrixCommand
@ApiOperation("測試熔斷逾時")
@GetMapping("/testHystrix222")
public String testHystrix(@RequestParam("num") int num) {
if(true) {
throw new BizException(501,"2222222222異常");
}
return null;
}
/**
* 參數必須相同,可以加Throwable參數
*/
public String fallbackTest(Throwable e) {
System.out.println("error:"+e.toString());
return "進入fallbackMethod";
}
}
總結
1、hystrix的核心思想:解決多個服務依賴調用時的級聯故障
2、如果沒有調用多服務之間的請求鍊,一般不需要配置hystrix,如果當方法涉及遠端調用時,此時則需要考慮使用需要配置降級政策,避免該方法由于遠端調用時的逾時導緻服務癱瘓