Hystrix 是一個用於處理分佈式系統的延遲和容錯的開源庫,在分佈式系統裏,許多依賴不可避免的會調用失敗,好比超時、異常等,Hystrix 可以保證在一個依賴出問題的狀況下,不會致使總體服務失敗,避免級聯故障,以提升分佈式系統的彈性。java
「斷路器」自己是一種開關裝置,當某個服務單元發生故障以後,經過斷路器的故障監控(相似熔斷保險絲),向調用方返回一個符合預期的、可處理的備選響應(FallBack),而不是長時間的等待或者拋出調用方沒法處理的異常,這樣就保證了服務調用方的線程不會被長時間、沒必要要地佔用,從而避免了故障在分佈式系統中的蔓延,乃至雪崩。git
不讓客戶端等待,並當即返回一個友好的提示(服務器忙,請稍後再試)github
🎃 哪些狀況會發生服務降級:spring
相似保險絲,電流過大時,直接熔斷斷電。瀏覽器
熔斷機制是應對雪崩效應的一種微服務鏈路保護機制,當扇出鏈路的某個微服務出錯不可用或者響應時間太長時,會進行服務的降級,進而熔斷該節點微服務的調用,快速返回錯誤的響應信息,當檢測到該節點微服務調用響應正常後,恢復調用鏈路。springboot
服務降級 → 服務熔斷 → 恢復調用鏈路服務器
對於高併發的操做,限制單次訪問數量併發
超時致使服務器變慢:超時再也不等待; 出錯(宕機或程序運行出錯):要有備選方案app
一、在須要服務降級的方法上標註註解,fallbackMethod 表明回退方法,須要本身定義,@HystrixProperty
中設置的是該方法的超時時間,若是超過該事件則自動降級maven
當運行超時或服務內部出錯都會調用回退方法
@HystrixCommand( fallbackMethod = "timeoutHandler", commandProperties = { @HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds", value = "3000") }) public String timeout(Long id) { int time = 3000; try { TimeUnit.MILLISECONDS.sleep(time); } catch (InterruptedException e) { e.printStackTrace(); } //模擬異常 //int i = 10 / 0; return "線程:" + Thread.currentThread().getName(); }
二、在啓動類上添加註解,開啓降級
@EnableCircuitBreaker
一、添加配置
# 在feign中開啓hystrix feign: hystrix: enabled: true
二、和服務提供方同樣,照葫蘆畫瓢
@HystrixCommand( fallbackMethod = "timeoutHandler", commandProperties = { @HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds", value = "1500") }) public String timeout(@PathVariable("id") Long id) { int i = 1/0; return hystrixService.timeout(id); }
三、在啓動類上添加註解
@EnableHystrix
以上配置方式存在的問題:
🎉 解決方式1:在類上配置一個全局回退方法,至關因而一個通用處理,當此回退方法能知足你的需求,就無需在方法上指定其它回退方法,若是須要使用特定的處理方法能夠再在業務方法上定義
@DefaultProperties(defaultFallback = "globalFallbackMethod")
🎉 解決方式2:但此時處理代碼和依然和業務代碼混合在一塊兒,咱們還可使用另外一種方式:編寫一個類實現 Feign 的調用接口,並重寫其方法做爲回退方法,而後在 @FeignClient
註解上添加 fallback
屬性,值爲前面的類。
在SpringCloud中,熔斷機制經過 Hystrix 實現。Hystrix 監控微服務間的調用情況,當失敗的調用到必定閾值,默認 5 秒內 20 次調用失敗就會啓動熔斷機制。熔斷機制的註解是 @HystrixCommand
@HystrixCommand( fallbackMethod = "paymentCircuitBreakerFallback", 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") //失敗率達到多少後跳閘 }) public String circuitBreaker(Long id) { if (id < 0) { throw new RuntimeException("id 不能爲負數"); } return Thread.currentThread().getName() + "\t" + "調用成功,流水號:" + IdUtil.simpleUUID(); } public String circuitBreakerFallback(Long id) { return "id 不能爲負數,你的id = " + id; }
@HystrixProperty
中的配置能夠參考 com.netflix.hystrix.HystrixCommandProperties
類
詳見官方文檔:https://github.com/Netflix/Hystrix/wiki/Configuration
也有雷鋒同志作了翻譯:https://www.jianshu.com/p/39763a0bd9b8
🎨 熔斷類型
🎨 斷路器何時起做用?
根據上面配置的參數,有三個重要的影響斷路器的參數
🎨 斷路器開啓或關閉的條件
🎨 斷路器開啓以後會發生什麼?
詳見官方文檔:https://github.com/Netflix/Hystrix/wiki/How-it-Works
一、新建一個項目,導入 maven 依賴
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-netflix-hystrix-dashboard</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency>
二、添加配置
server: port: 9001
三、開啓 Hystrix DashBoard
@SpringBootApplication @EnableHystrixDashboard public class ConsumerHystrixDashBoard9001 { public static void main(String[] args){ SpringApplication.run(ConsumerHystrixDashBoard9001.class, args); } }
四、瀏覽器輸入 http://localhost:9001/hystrix
,出現如下界面即啓動成功
注意:想要被 Hystrix DashBoard 監控的服務必須導入此依賴
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency>
在被監控服務的主啓動類裏添加以下代碼,不然某些舊版本可能報錯 Unable to connect to Command Metric Stream.
/** * 此配置是爲了服務監控而配置,與服務容錯自己無關,SpringCloud升級後的坑 * ServletRegistrationBean由於springboot的默認路徑不是"/hystrix.stream", * 只要在本身的項目裏配置上下面的servlet就能夠了 */ @Bean public ServletRegistrationBean getServlet(){ HystrixMetricsStreamServlet streamServlet = new HystrixMetricsStreamServlet(); ServletRegistrationBean registrationBean = new ServletRegistrationBean(streamServlet); registrationBean.setLoadOnStartup(1); registrationBean.addUrlMappings("/hystrix.stream"); registrationBean.setName("HystrixMetricsStreamServlet"); return registrationBean; }
在 Hystrix DashBoard 頁面輸入基本信息,進入儀表盤界面
大體狀況以下所示
操做界面分析:
代碼地址:https://github.com/songjilong/springcloud-hoxton-learning