Hystrix “豪豬”,具有自我保護的能力。hystrix 通過如下機制來解決雪崩效應問題。
在微服務架構中,我們把每個業務都拆成了單個服務模塊,然後當有業務需求時,服務間可互相調用,但是,由於網絡原因或者其他一些因素,有可能出現服務不可用的情況,當某個服務出現問題時,其他服務如果繼續調用這個服務,就有可能出現線程阻塞,但如果同時有大量的請求,就會造成線程資源被用完,這樣就可能會導致服務癱瘓,由於服務間會相互調用,很容易造成蝴蝶效應導致整個系統宕掉。因此,就有人提出來斷路器來解決這一問題。
資源隔離:包括線程池隔離和信號量隔離,限制調用分佈式服務的資源使用,某一個調用的服務出現問題不會影響其他服務調用。
降級機制:超時降級、資源不足時(線程或信號量)降級,降級後可以配合降級接口返回託底數據。
熔斷:當失敗率達到閥值自動觸發降級(如因網絡故障/超時造成的失敗率高),熔斷器觸發的快速失敗會進行快速恢復。
緩存:提供了請求緩存、請求合併實現。
Hystrix服務降級,其實就是線程池中單個線程障處理,防止單個線程請求時間太長,導致資源長期被佔有而得不到釋放,從而導致線程池被快速佔用完,導致服務崩潰。
Hystrix能解決如下問題:
1.請求超時降級,線程資源不足降級,降級之後可以返回自定義數據
2.線程池隔離降級,分佈式服務可以針對不同的服務使用不同的線程池,從而互不影響
3.自動觸發降級與恢復
4.實現請求緩存和請求合併
springBoot使用的是2.0.2.RELEASE版本 springCloud使用的是Finchley.RELEASE版本。
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
在啓動類加上@EnableCircuitBreaker註解
//@SpringBootApplication
//@EnableDiscoveryClient
//@EnableCircuitBreaker
這三個註解相當於一個@SpringCloudApplication
@EnableFeignClients
//@SpringBootApplication
//@EnableDiscoveryClient
//@EnableCircuitBreaker
@SpringCloudApplication
public class OrderApplication {
public static void main(String[] args) {
SpringApplication.run(OrderApplication.class, args);
}
}
設置斷路器超時時間(默認1s)
feign:
hystrix:
enabled: true
client:
config:
default:
connectTimeout: 5000
readTimeout: 5000
1.在方法的頭上加了@HystrixCommand(fallbackMethod = "hystrixMethod")註解,
代表對這個方法使用了Hystrix相關的功能,fallbackMethod屬性是調用回調之後的處理方法。
默認設置了5s超時:
@GetMapping("/test")
@HystrixCommand(fallbackMethod = "hystrixMethod")
public String test(){
try {
Thread.sleep(6000);
} catch (InterruptedException e) {
e.printStackTrace();
}
return "ok";
}
public String hystrixMethod(){
return "請稍後再試";
}
2.Feign是自帶斷路器的,只需要在FeignClient的接口的註解中加上fallback的指定類就行了。
@FeignClient(name = "product", fallback = OrderHystrix.class)
public interface OrderClient {
@GetMapping("/product/list")
public String getProductInfo();
}
@Component
public class OrderHystrix implements OrderClient {
@Override
public String getProductInfo() {
return "商品服務忙,稍後再試。。。";
}
}