详解SpringCloud微服务架构之Hystrix断路器
作者:Bob_F 发布时间:2022-03-05 05:28:56
一:什么是Hystrix
在分布式环境中,许多服务依赖项中的一些将不可避免地失败。Hystrix是一个库,通过添加延迟容差和容错逻辑来帮助您控制这些分布式服务之间的交互。Hystrix通过隔离服务之间的访问点,停止其间的级联故障以及提供回退选项,从而提高系统的整体弹性。
Hystrix旨在执行以下操作
1:对通过第三方客户端库访问(通常通过网络)的依赖关系提供保护并控制延迟和故障。
2:隔离复杂分布式系统中的级联故障。
3:快速发现故障,尽快恢复。
4:回退,尽可能优雅地降级。
5:启用近实时监控,警报和操作控制。
二:为什么需要Hystrix?
大型分布式系统中,一个客户端或者服务依赖外部服务,如果一个服务宕了,那么由于我们设置了服务调用系统超时时间,势必会影响相应时间,在高并发的情况下大多数服务器的线程池就出现阻塞(BLOCK),影响整个线上服务的稳定性。
(图片官方图片)
当一切都健康时,请求可以看起来像这样
当许多后端服务系统中的一个宕掉时,整个用户请求:
如果多个客户端调用同一个异常服务的时候,出现的情况是:
三:Hystrix解决什么问题?
分布式架构中的应用程序具有几十个依赖关系,每个依赖关系在某个时刻将不可避免的出现异常。如果应用程序不与这些外部故障隔离,则可能出现线程池阻塞,引起系统雪崩。
例如,对于依赖30个服务的应用程序,每个服务的正常运行时间为99.99%,您可以:
99.99%的30次方 = 99.7%正常运行时间
0.3%的10亿次请求= 3,000,000次故障
2+小时宕机/月,即使所有依赖关系正常运行时间。
当使用Hystrix进行熔断后,每个依赖关系彼此隔离了,限制了当发生延迟时的阻塞。
四:Hystrix结合Feign使用
创建一个工程eureka_feign_hystrix_client
pom.xml文件内容
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-feign</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Brixton.SR5</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
创建启动文件
FeignHystrixApplication
@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients
public class FeignHystrixApplication {
public static void main(String[] args) {
SpringApplication.run(FeignHystrixApplication.class, args);
}
}
UserClient类
@FeignClient(value = "biz-service-0",fallback = UserClientHystrix.class)
public interface UserClient {
@RequestMapping(method = RequestMethod.GET, value = "/getuser")
public User getuserinfo();
@RequestMapping(method = RequestMethod.GET, value = "/getuser")
public String getuserinfostr();
@RequestMapping(method = RequestMethod.GET, value = "/info")
public String info();
}创建熔断类UserClientHystrix
@Service
public class UserClientHystrix implements UserClient {
@Override
public User getuserinfo() {
throw new NullPointerException(" User getuserinfo() 服务不可用。。");
}
@Override
public String getuserinfostr() {
return " UserClientHystrix getuserinfostr() is fallback 服务不可用。。";
}
@Override
public String info() {
return " UserClientHystrix info() is fallback 服务不可用。。";
}
}
当网络出现异常的时候或直接跳转到这里实现类里面
创建action类
UserController
@Autowired
UserClient userClient;
@RequestMapping(value = "/getuserinfo", method = RequestMethod.GET)
public User getuserinfo() {
return userClient.getuserinfo();
}
@RequestMapping(value = "/getuserinfostr", method = RequestMethod.GET)
public String getuserinfostr() {
return userClient.getuserinfostr();
}
@RequestMapping(value = "/info", method = RequestMethod.GET)
public String info() {
return userClient.info();
}
先启动:eureka_register_service(注册中心)工程
然后运行我们写好的FeignHystrixApplication
这个时候我们明显发现没有运行biz-service-0 服务,那么我们 打开 http://127.0.0.1:8005/getuserinfostr
出现
UserClientHystrix getuserinfostr() is fallback 服务不可用。。
这个就是我们自定义的熔断返回结果
如果不用熔断 页面会出现这个
Whitelabel Error Page
This application has no explicit mapping for /error, so you are seeing this as a fallback.
Wed Mar 22 14:32:21 CST 2017
There was an unexpected error (type=Internal Server Error, status=500).
getuserinfo failed and fallback failed.
代码地址:https://github.com/zhp8341/SpringCloudDemo
本人也看了一些Hystrix相关原理,由于没有全部看完所以暂时没有写上去,本文是结合Feign使用和学习。
有兴起的可以看下官方的Hystrix很详细,就是看起来有点费劲,
来源:http://www.cnblogs.com/xiaojunbo/p/7094438.html
猜你喜欢
- 有人问我,怎么判断一个点是不是在多边形内,本来想着把这个多边形分成一个又一个三角形,如图, 然后判断这个点是不是在某个三角形中,如
- @Autowired注解在抽象类中失效最近在工作中遇到这个问题,在抽象类中使用Autowired这个注解,注入mybatis的dao时,总是
- Spring课程工程构建 在IDEA 工作空间里面创建Spring文件夹。打开IDEA,file–>Open&am
- 本文实例为大家介绍了Java九大内置对象,供大家参考,具体内容如下1、Request对象该对象封装了用户提交的信息,通过调用该对象相应的方法
- graylog配置springboot配置依赖compile group: 'de.siegmar', name: '
- 学过Spring的小伙伴对于IOC一定不陌生,IOC:控制反转(Inversion of Control,英文缩写为IoC)是一个重要的面向
- 前言通过深入分析Spring源码,我们知道Spring框架包括大致六大模块, 如Web模块,数据库访问技术模块,面向切面模块,基础设施模块,
- Spring Web MVC是一种基于Java的实现了Web MVC设计模式的请求驱动类型的轻量级Web框架,即使用了MVC架构模式的思想,
- Spring Boot 程序优化一、延迟初始化Bean一般在 SpringBoot 中都拥有很多的耗时任务,比如数据库建立连接、初始线程池的
- Mybatis是业界非常流行的持久层框架,轻量级、易用,在金融IT领域完全是领军地位,比Hibernate更受欢迎,优势非常多,也是非常值得
- 一、NIO基本简介NIO (New lO)也有人称之为java non-blocking lO是从Java 1.4版本开始引入的一个新的IO
- 如何查看 Java 的字节码文件?在 Java 中,字节码文件.class实际上是二进制文件,并不能直接查看。要想查看,我们只能通过反编译对
- 上一篇文章讲解了Spring Cloud 整合 nacos 实现服务注册与发现,nacos除了有服务注册与发现的功能,还有提供动态配置服务的
- 1、static关键字1.1 使用static关键字定义属性在讲解static定义属性操作之前,首先编写如下一道程序。现在定义一个表示中国人
- RelativePanel是在Windows 10 UWP程序中引入的一种新的布局面板,它是通过附加属性设置元素间的位置关系来对实现布局的。
- 前言在框架中经常会会用到method.invoke()方法,用来执行某个的对象的目标方法。以前写代码用到反射时,总是获取先获取Method,
- 定义:给定一种语言,定义他的文法的一种表示,并定义一个解释器,该解释器使用该表示来解释语言中句子。类型:行为类模式类图:解释器模式是一个比较
- 本文实例为大家分享了java实现webservice方式的具体代码,供大家参考,具体内容如下经过测试 jdk1.6.10以下会出现bug 建
- 目录通过Resource接口手动加载通过@Value自动转换通过ResourceLoader加载使用ResourceUtils加载资源读取资
- 目录前言I. 项目环境1. 项目依赖2. 配置II. 邮件发送1. 简单文本邮件发送2. html发送3. 添加附件4. Freemaker