Hystrix:熔斷器,容錯管理工具,旨在經過熔斷機制控制服務和第三方庫的節點,從而對延遲和故障提供更強大的容錯能力。java
說到熔斷器,先要引入另一個詞,雪崩效應。git
雪崩效應,百度百科的解釋是這樣的:web
爬山時,決不能順着山邊扔石子兒。一是有擊中別人的危險,一枚從數千英尺落下的小石頭,破壞力至關驚人;二是有可能引起雪崩,一枚不起眼的小石子兒,頂多只能撞動幾塊差很少大小的石頭;但只要有足夠數量的石頭翻滾起來,用不了多久,大塊大塊的岩石也會鬆動下滑。因而乎,這一顆小小的石子兒,就能引起一場雪崩。這個道理不言自明,比如就是水滴石穿、蝴蝶效應,說的都是一個小因素的變化,卻每每有着無比強大的力量,以致於最後改變總體結構、產生意想不到的結果。如今,把這個原理適用於商業和技術領域,它一樣能獲得相似的效果—商業和技術自己具備必定的結構和體系,當人們適當地拆散其結構,並予以從新組合,便能釋放出猶如雪崩般巨大的能量。雪崩把舊有的產業體系打得粉碎,甚至,有時候乾脆讓整個產業消失。在雪崩的巨大壓力下,商業與技術之間固有的聯繫被完全中斷,不得不接受新的改造和整合,其最終將引爆一系列創新的革命,這就是「雪崩效應」。 以上來自百度百科。spring
從上面能夠看到,形成雪崩效應極可能就是由於一個特別小的緣由,好比一個石子。而後讓咱們在看一下下圖:apache
圖中每一個字母表明瞭一個微服務,剪頭表明服務的調用。
假設1: 服務G因爲某種緣由癱瘓了,能夠看出來影響的是服務M沒法調用服務G,可能說某種意義上,影響的只是單服務,光看圖可能沒那麼大影響。 假設2: 服務B癱瘓了,從圖中可以發現上半區的全部服務都要癱瘓。 假設3: 最壞的可能,服務A癱瘓了,服務A的癱瘓致使B,C,D所有癱瘓,連鎖反應形成全部服務都死了,形成整個系統的癱瘓。springboot
爲了避免讓這樣的事情發生,springcloud中提供了Hystrix熔斷器,即在失敗率達到閾值時(默認爲5秒內20次失敗),自動調用回調方法,使請求快速返回。bash
舉一個通俗的例子,你們都能遇到這樣的狀況,家裏的用電量太高的時候,會出現「跳閘」,爲何出現跳閘,就是由於長期用電量太高,會出現超載,長期這樣就會升溫,引發火災等很差的連鎖反應。app
下面介紹一下ribbon整合斷路器:maven
新建一個項目springcloud_hystric_ribbon,項目在springboot_ribbon上作了簡單的修改,pom文件中加入hystrix,pom文件代碼以下:spring-boot
<?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
@LoadBalanced
RestTemplate 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/,而後在看一下儀表盤,以下圖所示:
源碼下載 :大老楊碼雲
我的網站:dalaoyang.cn