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