Spring cloud(4)-熔斷(Hystrix)

ohcomeyes發表於2018-10-24

Spring Cloud Hystrix(熔斷)

由於網路原因或者自身的原因,服務並不能保證100%可用,如果單個服務出現問題,呼叫這個服務就會出現執行緒阻塞,此時若有大量的請求湧入,Servlet容器的執行緒資源會被消耗完畢,導致服務癱瘓。服務與服務之間的依賴性,故障會傳播,會對整個微服務系統造成災難性的嚴重後果,這就是服務故障的“雪崩”效應
雪崩應對策略:

  • 流量控制:控制的方式有很多種,類似佇列,令牌,漏桶等等。
  • 閘道器限流: 因為Nginx的高效能, 目前一線網際網路公司大量採用Nginx+Lua的閘道器進行流量控制, 由此而來的OpenResty也越來越熱門.使用OpenResty,其是由Nginx核心加很多第三方模組組成,其最大的亮點是預設整合了Lua開發環境,使得Nginx可以作為一個Web Server使用。藉助於Nginx事件驅動模型非阻塞IO,可以實現高效能的Web應用程式。
    而且OpenResty提供了大量元件如Mysql、Redis、Memcached等等,使在Nginx上開發Web應用更方便更簡單。目前在京東如實時價格、秒殺、動態服務、單品頁、列表頁等都在使用Nginx+Lua架構,其他公司如淘寶、去哪兒網等。
  • 使用者互動限流:友好的提示,從源端限制流量流入。

基於Netflix的開源框架 Hystrix實現的框架目標在於通過控制那些訪問遠端系統、服務和第三方庫的節點,從而對延遲和故障提供更強大的容錯能力。Hystrix具備了服務降級、服務熔斷、執行緒隔離、請求快取、請求合併以及服務監控等強大功能。

image

新增依賴

<
!-- hystrix 斷路器 -->
<
dependency>
<
groupId>
org.springframework.cloud<
/groupId>
<
artifactId>
spring-cloud-starter-hystrix<
/artifactId>
<
/dependency>
複製程式碼

restTempate整合hystrix

@EnableHystrix@EnableDiscoveryClient@SpringBootApplicationpublic class RibbonConsumerApplication { 
@LoadBalanced @Bean RestTemplate restTemplate() {
return new RestTemplate();

} public static void main(String[] args) {
SpringApplication.run(RibbonConsumerApplication.class, args);

}
}複製程式碼

Feign是自帶斷路器的,如果在Dalston版本的,預設是沒有開啟的,通過配置開啟

feign:  hystrix:    enabled: true複製程式碼

@HystrixCommand 表明該方法為hystrix包裹,可以對依賴服務進行隔離、降級、快速失敗、快速重試等等

  • fallbackMethod降級方法
  • commandProperties 普通配置屬性,可以配置HystrixCommand對應屬性,例如採用執行緒池還是訊號量隔離、熔斷器熔斷規則等等
  • ignoreExceptions 忽略的異常,預設HystrixBadRequestException不計入失敗
  • groupKey() 組名稱,預設使用類名稱
  • commandKey 命令名稱,預設使用方法名

消費者提供方法(defaultStores)

restTemplate配置使用

@RestControllerpublic class ConsumerController { 
@Autowired private RestTemplate restTemplate;
@HystrixCommand(fallbackMethod = "defaultStores") @GetMapping(value = "/hello") public String hello() {
return restTemplate.getForEntity("http://eureka-provider/", String.class).getBody();

} public String defaultStores() {
return "Ribbon + hystrix ,提供者服務掛了";

}
}複製程式碼

feign配置使用

@EnableHystrix@EnableFeignClients@EnableDiscoveryClient@SpringBootApplicationpublic class FeignConsumerApplication { 
public static void main(String[] args) {
SpringApplication.run(FeignConsumerApplication.class, args);

}
}複製程式碼
@FeignClient(value ="eureka-provider",fallbackFactory = HystrixClientFallbackFactory.class)public interface  HomeClient { 
@GetMapping("/") String consumer();

}複製程式碼
@Componentpublic class HystrixClientFallbackFactory implements FallbackFactory<
HomeClient>
{
@Override public HomeClient create(Throwable throwable) {
return () ->
"feign + hystrix ,提供者服務掛了";

}
}複製程式碼

Hystrix Dashboard是作為斷路器狀態的一個元件,提供了資料監控和友好的圖形化介面。

<
dependency>
<
groupId>
org.springframework.cloud<
/groupId>
<
artifactId>
spring-cloud-starter-hystrix<
/artifactId>
<
/dependency>
<
dependency>
<
groupId>
org.springframework.boot<
/groupId>
<
artifactId>
spring-boot-starter-actuator<
/artifactId>
<
/dependency>
<
dependency>
<
groupId>
org.springframework.cloud<
/groupId>
<
artifactId>
spring-cloud-starter-hystrix-dashboard<
/artifactId>
<
/dependency>
複製程式碼

在程式的入口加上@EnableHystrixDashboard註解,開啟HystrixDashboard

結語

github上有關於Spring Cloud完整的部署。
其它相關文章
Spring cloud(1)-簡介以及選擇
Spring cloud(2)-服務發現(Eureka,Consul)
Spring cloud(3)-負載均衡(Feign,Ribbon)
Spring cloud(4)-熔斷(Hystrix)
Spring cloud(5)-路由閘道器(Zuul)
Spring cloud(6)-配置管理及重新整理(Config,Bus)
最後,給個 star 吧~
個人部落格~
簡書~

來源:https://juejin.im/post/5bd038f9f265da0a867c77a5

相關文章