熔断器---Hystrix
Hystrix:熔斷器,容錯管理工具,旨在通過熔斷機制控制服務和第三方庫的節點,從而對延遲和故障提供更強大的容錯能力。
說到熔斷器,先要引入另外一個詞,雪崩效應。
雪崩效應,百度百科的解釋是這樣的:
登山時,決不能順著山邊扔石子兒。一是有擊中別人的危險,一枚從數千英尺落下的小石頭,破壞力相當驚人;二是有可能引發雪崩,一枚不起眼的小石子兒,頂多只能撞動幾塊差不多大小的石頭;但只要有足夠數量的石頭翻滾起來,用不了多久,大塊大塊的巖石也會松動下滑。于是乎,這一顆小小的石子兒,就能引發一場雪崩。這個道理不言自明,好比就是水滴石穿、蝴蝶效應,說的都是一個小因素的變化,卻往往有著無比強大的力量,以至于最后改變整體結構、產生意想不到的結果。現在,把這個原理適用于商業和技術領域,它同樣能得到類似的效果—商業和技術本身具有一定的結構和體系,當人們適當地拆散其結構,并予以重新組合,便能釋放出猶如雪崩般巨大的能量。雪崩把舊有的產業體系打得粉碎,甚至,有時候干脆讓整個產業消失。在雪崩的巨大壓力下,商業與技術之間固有的聯系被徹底中斷,不得不接受新的改造和整合,其最終將引爆一系列創新的革命,這就是“雪崩效應”。
以上來自百度百科。
從上面可以看到,造成雪崩效應很可能就是因為一個特別小的原因,比如一個石子。然后讓我們在看一下下圖:
圖中每個字母代表了一個微服務,剪頭代表服務的調用。
假設1:
服務G由于某種原因癱瘓了,可以看出來影響的是服務M無法調用服務G,可能說某種意義上,影響的只是單服務,光看圖可能沒那么大影響。
假設2:
服務B癱瘓了,從圖中能夠發現上半區的所有服務都要癱瘓。
假設3:
最壞的可能,服務A癱瘓了,服務A的癱瘓導致B,C,D全部癱瘓,連鎖反應造成所有服務都死了,造成整個系統的癱瘓。
為了不讓這樣的事情發生,springcloud中提供了Hystrix熔斷器,即在失敗率達到閾值時(默認為5秒內20次失敗),自動調用回調方法,使請求快速返回。
舉一個通俗的例子,大家都能遇到這樣的情況,家里的用電量過高的時候,會出現“跳閘”,為什么出現跳閘,就是因為長期用電量過高,會出現超載,長期這樣就會升溫,引起火災等不好的連鎖反應。
下面介紹一下ribbon整合斷路器:
新建一個項目springcloud_hystric_ribbon,項目在springboot_ribbon上做了簡單的修改,pom文件中加入hystrix,pom文件代碼如下:
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.dalaoyang</groupId><artifactId>springcloud_hystric_ribbon</artifactId><version>0.0.1-SNAPSHOT</version><packaging>jar</packaging><name>springcloud_hystric_ribbon</name><description>springcloud_hystric_ribbon</description><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>1.5.9.RELEASE</version><relativePath/> <!-- lookup parent from repository --></parent><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding><java.version>1.8</java.version><spring-cloud.version>Edgware.SR1</spring-cloud.version></properties><dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-eureka</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-ribbon</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-hystrix</artifactId></dependency></dependencies><dependencyManagement><dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>${spring-cloud.version}</version><type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build></project>配置文件如下:
##端口號 server.port=8764##服務名稱 spring.application.name=springcloud_hystric_ribbon##注冊中心地址 eureka.client.service-url.defaultZone=http://eureka.dalaoyang.cn/eureka/啟動類加入注解@EnableHystrix開啟熔斷器,然后在之前的方法上加上注解 @HystrixCommand(fallbackMethod = "indexError"),其中fallbackMethod是在調用失敗時的回調方法。代碼如下:
package com.dalaoyang;import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand; import com.netflix.ribbon.proxy.annotation.Hystrix; import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.loadbalancer.LoadBalanced; import org.springframework.cloud.netflix.eureka.EnableEurekaClient; import org.springframework.cloud.netflix.hystrix.EnableHystrix; import org.springframework.context.annotation.Bean; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.client.RestTemplate;@SpringBootApplication @EnableEurekaClient @RestController @EnableHystrix public class SpringcloudHystricRibbonApplication {public static void main(String[] args) {SpringApplication.run(SpringcloudHystricRibbonApplication.class, args);}@Bean@LoadBalancedRestTemplate restTemplate() {return new RestTemplate();}@Value("${server.port}")String port;@Value("${spring.application.name}")String serviceName;@HystrixCommand(fallbackMethod = "indexError")@GetMapping("/")public String index(){return restTemplate().getForObject("http://service/",String.class);}public String indexError(){return "調用服務失敗!";} }啟動服務,訪問http://localhost:8764/,可以看到響應如下:
接下來說一下feign的熔斷器使用,其實上一篇文章已經使用了斷路器,這里就不具體介紹了,如果需要可以看我的上一篇文章--《聲明式調用---Feign》
然后我們在改造一下springcloud_hystric_ribbon項目,加入Hystrix Dashboard儀表盤,pom文件中加入依賴:
<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</artifactI> </dependency>啟動類加入@EnableHystrixDashboard啟動儀表盤。啟動項目,訪問http://localhost:8764/hystrix
可以看到下圖
上面填寫http://localhost:8764/hystrix.stream,title隨便填寫一下即可,然后點擊Monitor Stream,看到下圖
這是發現一直在loading,不要著急,在打開一個窗口請求一下http://localhost:8764/,然后在看一下儀表盤,如下圖所示:
源碼下載 :大老楊碼云
個人網站:https://dalaoyang.cn
轉載于:https://www.cnblogs.com/dalaoyang/p/8900954.html
總結
以上是生活随笔為你收集整理的熔断器---Hystrix的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 元祖、字典
- 下一篇: springboot+shiro+red