6.1、什么是Hystrix

在分布式系统中、服务与服务之间的依赖错综复杂,一种不可避免的情况就是某些服务
出现故障,导致依赖于它们的其他服务出现远程调度的线程阻塞。
 
Hystrix是Netflix 公司开源的一个项目,它提供了熔断器功能
能够阻止分布式系统中出现联动故障
 
Hystrix 是通过隔离服务的访问点阻止联动故障的,并提供了故障的解决方案,从而提高了
整个分布式系统的弹性

6.2、Hystrix解决了什么问题

在复杂的分布式系统中,可能有几十个服务相互依赖,这些服务由于某些原因:
机房的不可靠性、网络服务商的不可靠性 ,导致某个服务不可用等
 
如果系统不隔离该不可用的服务,可能会导致整个系统不可用
 
对于依赖 30 个服务的应用程序,每个服务的正常运行时间为 99.99%
对于单个服务来说, 99.99% 的可用是非常完美的
 
99.9930 = 99.7% 的可正常运行时间和 0.3% 的不可用时间,那么 10 亿次请求中有 3000000
次失败,实际的情况可能比这更糟糕。
 
如果不设计整个系统的韧性,即使所有依赖关系表现良好,单个服务只有 0.01% 的不可用,
由于整个系统的服务相互依赖,最终对整个系统的影响是非常大的
 
在微服务系统中,一个用户请求可能需要调用几个服务才能完成
 
在所有的服务都处于可用状态时, 一个用户请求需要调用A、H 、I 、P服务

6.3、Hystrix的设计原则

设计原则如下:

6.4、Hystrix的工作机制

如图:

首先,当服务的某个 API 接口的失败次数
在一定时间内小于设定的阀值时,熔断器处于关闭状态,该 API 接口正常提供服务
 
当该API 接口处理请求的失败次数大于设定的阀值时, Hystrix 判定该 API 接口出
现了故障,打开熔断器,这时请求该 API 接口会执行快速失败的逻辑(即 fall back
回退的逻辑),不执行业务逻辑,请求的线程不会处于阻塞状态。
 
处于打开状态的熔断器,一段时间后会处于半打开状态,并将 定数量的请求执行正常逻辑。
 
剩余的请求会执行快速失败,若执行正常逻辑的请求失败了,则熔断器继续打开,若成功了 ,
则将熔断器关闭。这样熔断器就具有了自我修复的能力。

搭建工程

新建工程:aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFMAAAAWCAYAAAC8J6DfAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAIPSURBVFhH7Za9bsIwEID7XFH52yrUDVGkLoDUARq2MuNsVacOydSdSH2F8BJ9o2tscuFsLsEFkxLJw6c2F+cOf7kz3N33BuBxg5fpEC/TIV6mQ7xMh3iZDqmU+R5/aYiPT3ievbBr6wjGEWyzDLI0glG3z665FkF3BbGsnSWwbKC2tUxktlix66u4lsyRSHNJKWzG1TldyAy6jzBdC4iiqESIkN3Ln2WewsxzLZnLREqql+kClPlK6gTjUEmlMUmzMsMEdrudYism+QedwCbVpZixgDwjicO+EkljWbI61Mn/34tOYNEJtc7E5+QaVavIXfeiOZkqPpzDm9GhDcpM1d9SQLFBOa7yWsrV1hNB+IzkpMyiDifzMPbyRdkdAZUySXwvdt2gTOw0bUP5dSlh3x0oV0rDzkHRFHPMzToqxpyZXKdjTo7blElGyRSBY7ksR1zvJNx4XY6yTjHCKsbJLGqY+aqol7mG6fAQP1sm9wyHjUzsllgcC6H3lYDi3tkyjc7kup5SKTP/EhLrOTyQl3GRzN73DwvNYyWz2PQ2P+84yRQqk8ZsZOrXx6I5OJlKZD7W2JUXj7lcw4mU0Dw2MjGmxJB1pkztXpHXVuai81SON3Yjns80rwnK1H5nGh3ZmExbzG/1NlIp0wZOpIRbWwf3e7ON/LtM8+zj1rSFm5FZd261hYtkenS8TGcM4BcKag06NYf+VAAAAABJRU5ErkJggg==" alt="" />

pom依赖:

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency> <dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>

RibbonConfig.java

@Configuration
public class RibbonConfig {
@Bean
@LoadBalanced
RestTemplate restTemplate(){
return new RestTemplate();
}
}

hystrixService.java

@Service
public class hystrixService {
@Autowired
RestTemplate restTemplate; public String port(){
return restTemplate.getForObject("http://CLINET/port",String.class);
}
}

hystrixController.java

@RestController
public class hystrixController { @Autowired
hystrixService hystrixService; @GetMapping("/hi")
public String hi(){
return hystrixService.port();
} }
主配置类:
@EnableDiscoveryClient
@SpringBootApplication
public class HystrixApplication {
public static void main(String[] args) {
SpringApplication.run(HystrixApplication.class, args);
}
}
测试时可以成功访问两个client

6.5、在RestTemplate和Ribbon 上使用熔断器

1、首先引入相关的依赖

<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>

2、主配置类加上@EnzbleHystrix注解开启Hystrix的熔断功能

@EnableDiscoveryClient
@SpringBootApplication
@EnableHystrix
public class HystrixApplication { public static void main(String[] args) {
SpringApplication.run(HystrixApplication.class, args);
}
}
修改hystrixService.java中的方法port()方法
@HystrixCommand注解,port()方法就启用 Hystrix 熔断器的功能
fallbackMethod属性为处理回退逻辑的方法
在熔断器打开的状态下,会执行 fallback 逻辑。
fallback 的逻辑最好是返回一些静态的字符串,不需要处理复杂的逻辑,也不需要远程调度其
他服务,这样方便执行快速失败,释放线程资源

hystrixService.java

@Service
public class hystrixService {
@Autowired
RestTemplate restTemplate; @HystrixCommand(fallbackMethod = "isError")
public String port(){
return restTemplate.getForObject("http://CLINET/port",String.class);
} public String isError(){
return "request is error!";
} }
在测试中:
关闭服务提供者

观察浏览器会显示:

6.6、在Feign上使用熔断器

Feign 的起步依赖中已经引入了 Hystrix 的依赖
所以在 Feign 中使用 Hystrix 不需要引入任何的依赖
使用之前的工程:
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAI4AAAAXCAYAAADdlHeDAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAALLSURBVGhD7ZuxbtswEIbzYAUKr+47JEuXAnHRrJkKFAaM7q6XTp68OHFqwwbkR+nDsD5JR52OdySlKnbg3PANFo93P48/RWXIzYePI2cYXbn59PXZGUZXzDhGL8w4Ri/MOEYvzDhGL7xxfv7etPjx69l9/h5OeEuMH3duVRSuWG7F8T48LAt3PB5dUezdw+RJjAHGk61bQO1E3Gvg113XvoQW1TjIl+kmmPRWGNo4d/NDaZr3bhzoQ1Ec3PRRz5U0Tgqa7NwMbRx82yxm5zVCV7hxpJj/AfpwEePgCcDTu5q/VM/ZRo8nL266bhpAxyvx7ROVyuevmfXO3d5vytw4J9UInOvjTznuYrWFU456yvl+DVVdHw95Z/sgnwavD3m5cUQtKd2KjqAPdW85gxuHC0bgFGcbZ33wjfl2/ycr37hugrbh5RhpLEcyzm2sNtssbd2hcaq1NeO6JnENGcbRtLR0KzouZxzcQDRHvUhwdLZxyNshL9++bpz+VqGnXxoHsGl4VUVr881SjBsYx//GteuaeH3/3PdJMU6Wbl1HTq8GNw79wKTAIpqNThiHNConH32G8zB3a45vVtU8+gzmcONEa7PNwlh85WM+XhONpY2X+etnmBP1ICnjZOlWdEi/JbKNQyfFkBqI+AUHpzJtnGi+5c6bhG5612ZADM+h1lY2C7U341XNnA3j8JxIrnGius9pnNHTXxHMAaAwEI7wBdKx1rhgnGg+Es+bic1rz+tmnJy1cC1N3OkbglwBPr6DccT6wloDLTm6E8ah9agmZHDjAGETK9HlWH3/AotZ+qqK5ePx/oSexulHNTRpmnGKuHEAtTbbrDKWrG0137a+HXI2TCKon2EccR6Pjeigc89qHKMxEd3Ma8IbJwfJNIAU+97Ak4wnHJG+M64BM85ASMbhfw1dE2YcoxedjGMYiBnH6IX9l4PRg5H7B71blzEUVFIoAAAAAElFTkSuQmCC" alt="" />

地址:https://www.cnblogs.com/Mrchengs/p/10646137.html

新建一个类:

portHystrix.java

需要实现接口中的方法

@Component
public class portHystrix implements EurekaClientFeign {
@Override
public String port() {
return "request is wrong!!";
}
}
portHystrix作为容器的逻辑处理类,需要实现EurekaClientFeign接口
并在接口中实现方法作为处理熔断逻辑的方法

EurekaClientFeign.java

@FeignClient(value = "CLINET",configuration = feignconfig.class,
fallback = portHystrix.class)
public interface EurekaClientFeign {
@GetMapping("/port")
String port();
}
在@FeignClient 注解的fallback 配置加上快速失败的处理类
该 理类是作为 Feign 熔断器的逻辑处理类
必须实现被@FeignClient 修饰的接口。

配置文件中:

spring.application.name=feign
server.port=
eureka.client.service-url.defaultZone=http://localhost:8762/eureka/

#开启Hystrix的功能
feign.hystrix.enabled=true

正常开启:

此时可以进行访问!!!

6.7、使用Hystrix Dashboard监控熔断器的状态

微服务架构中 ,为了保证服务实例的可用性,防止服务实例出现故障导致线程阻塞
出现了熔断器模型。
 
烙断器的状况反映了一个程序的可用性和健壮性,它是一个重要指标
 
Hystrix Dashboard 是监控 Hystrix 的熔断器状况的一个组件,提供了数据监控和 友好的图形化
展示界面。

6.7.1、在RestTemplate中使用Hystrix Dashboard

添加所需要的依赖:

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency> <dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix-dashboard</artifactId>
</dependency>
在主配置类中:
开启Hystrix Dashboard 的功能
@EnableCircuitBreaker
@EnableHystrixDashboard
@EnableDiscoveryClient
@SpringBootApplication
@EnableHystrix
public class HystrixApplication { public static void main(String[] args) {
SpringApplication.run(HystrixApplication.class, args);
} @Bean
public ServletRegistrationBean getServlet(){
HystrixMetricsStreamServlet streamServlet = new HystrixMetricsStreamServlet();
ServletRegistrationBean registrationBean = new ServletRegistrationBean(streamServlet);
registrationBean.setLoadOnStartup(1);
registrationBean.addUrlMappings("/actuator/hystrix.stream");
registrationBean.setName("HystrixMetricsStreamServlet");
return registrationBean;
}
}

坑位......

此时把服务提供者和注册中心均开启:

浏览器上输入:
会一直进行刷新

当访问:

在观察:
数据指标图:会一直刷新

浏览器访问:

此时发现:

在该页面显示了熔断器的各种数据指标

6.7.2、Feign 中使用 Hystrix Dashboard

1、pom文件

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</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-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix-dashboard</artifactId>
</dependency>

主配置类:

@EnableHystrix
@EnableHystrixDashboard
@EnableFeignClients(basePackages = "com.cr.eurekafeignclient.feign")
@EnableDiscoveryClient
@SpringBootApplication
public class EurekaFeignClientApplication { public static void main(String[] args) {
SpringApplication.run(EurekaFeignClientApplication.class, args);
} @Bean
public ServletRegistrationBean getServlet(){
HystrixMetricsStreamServlet streamServlet = new HystrixMetricsStreamServlet();
ServletRegistrationBean registrationBean = new ServletRegistrationBean(streamServlet);
registrationBean.setLoadOnStartup(1);
registrationBean.addUrlMappings("/actuator/hystrix.stream");
registrationBean.setName("HystrixMetricsStreamServlet");
return registrationBean;
}
}

其余的测试都和之前相似

6、Spring Cloud -熔断器Hystrix的更多相关文章

  1. Spring Cloud 熔断器

    目录 Spring Cloud 熔断器 Hystrix ribbon中使用hystrix feign中使用hystrix Spring Cloud 熔断器 在微服务架构中,根据业务来拆分成一个个的服务 ...

  2. Spring Cloud中Hystrix、Ribbon及Feign的熔断关系是什么?

    导读 今天和大家聊一聊在Spring Cloud微服务框架实践中,比较核心但是又很容易把人搞得稀里糊涂的一个问题,那就是在Spring Cloud中Hystrix.Ribbon以及Feign它们三者之 ...

  3. Spring Cloud中Hystrix 线程隔离导致ThreadLocal数据丢失问题分析

    最近spring boot项目中由于使用了spring cloud 的hystrix 导致了threadLocal中数据丢失,其实具体也没有使用hystrix,但是显示的把他打开了,导致了此问题. 导 ...

  4. Spring Cloud断路器Hystrix

    在微服务架构中,存在着那么多的服务单元,若一个单元出现故障,就会因依赖关系形成故障蔓延,最终导致整个系统的瘫痪,这样的架构相较传统架构就更加的不稳定.为了解决这样的问题,因此产生了断路器模式. 什么是 ...

  5. Spring Cloud之Hystrix服务保护框架

    服务保护利器 微服务高可用技术 大型复杂的分布式系统中,高可用相关的技术架构非常重要. 高可用架构非常重要的一个环节,就是如何将分布式系统中的各个服务打造成高可用的服务,从而足以应对分布式系统环境中的 ...

  6. Spring Cloud 之 Hystrix.

    一.概述  在微服务架构中,我们将系统拆分成了很多服务单元,各单元的应用间通过服务注册与订阅的方式互相依赖.由于每个单元都在不同的进程中运行,依赖通过远程调用的方式执行,这样就有可能因为网络原因或是依 ...

  7. Spring Cloud 学习--Hystrix应用

    上一篇介绍了Hystrix基本功能和单独使用的方式,今天继续学习如何将Hystrix融入SpringCloud组件中去. 在Ribbon上使用熔断器 在 pom.xml 文件中引入 hystrix 的 ...

  8. 笔记:Spring Cloud Feign Hystrix 配置

    在 Spring Cloud Feign 中,除了引入了用户客户端负载均衡的 Spring Cloud Ribbon 之外,还引入了服务保护与容错的工具 Hystrix,默认情况下,Spring Cl ...

  9. 架构师系列文:通过Spring Cloud组件Hystrix合并请求

    在前文里,我们讲述了通过Hystrix进行容错处理的方式,这里我们将讲述通过Hystrix合并请求的方式 哪怕一个URL请求调用的功能再简单,Web应用服务都至少会开启一个线程来提供服务,换句话说,有 ...

随机推荐

  1. 一、hive安装(内置数据库derby)

    hive是一个数据仓库工具,建立在hadoop之上,它的存在是为了让大数据的查询和分析更加的方便.hive提供简单的sql查询功能,并最终转换为mapreduce任务执行. 一.环境 JDK1.8+官 ...

  2. Java基础(3)——变量

    从这篇文章起开始正式进入正题啦,本文将较为简单的介绍一下变量以及常量.变量,顾名思义,就是可以变的量,常量那么久相反了,常常不变的量就叫常量._(¦3」∠) 变量 在 Java 中,任何一个变量都得有 ...

  3. LeetCode刷题第一天

    1 . 两数之和 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标. 你可以假设每种输入只会对应一个答案.但是,你不能重复利用 ...

  4. Java基础——面向对象

    Hello 大家好,我又来啦,今天我们来说说Java的面向对象. 还记得之前去面试几家公司的实习生职位,大部分面试官都问过我有关面向对象 的问题,不知道以后还会不会问,估计是不会了吧...(:3[▓▓ ...

  5. webpack打包踩坑之TypeError: Cannot read property 'bindings' of null

    file loader介绍:https://www.webpackjs.com/loaders/file-loader/ babel loader介绍:https://webpack.js.org/l ...

  6. 洛谷P5057 [CQOI2006]简单题(线段树)

    题意 题目链接 Sol 紫色的线段树板子题??... #include<iostream> #include<cstdio> #include<cmath> usi ...

  7. eclipse 断点调试快捷键

    (1)Ctrl+M --切换窗口的大小(2)Ctrl+Q --跳到最后一次的编辑处(3)F2 --当鼠标放在一个标记处出现Tooltip时候按F2则把鼠标移开时Tooltip还会显示即Show Too ...

  8. 微信小程序-05-详解介绍.js 逻辑层文件

    上一篇介绍了关于.json 的配置文件,本篇介绍关于.js 逻辑层文件 微信小程序-05-详解介绍.js 逻辑层文件 宝典官方文档: https://developers.weixin.qq.com/ ...

  9. centos下运行python3.6+Django+mysql项目

    文件准备: Django项目 myslq安装 关闭防火墙 用xshell拖拽到centos上 安装文件: 安装python3.6(3.7有问题) sh install_py36.sh 关闭防火墙 sh ...

  10. 我的C语言连接Mysql之路

    1.安装好mysql     2.要实现C连接数据库,需要安装数据库连接器(即MySQL Connector/C)    MySQL Connector/C是一个C语言的client库,这个库是为了实 ...