熔斷器---Hystrix

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

相關文章
相關標籤/搜索