Spring Cloud Hystrix 学习(二)熔断与降级
今天来看下Hystrix的熔断与降级。
首先什么是降级?当请求超时、资源不足等情况发生时进行服务降级处理,不调用真实服务逻辑,而是使用快速失败(fallback)方式直接返回一个托底数据,保证服务链条的完整,避免服务雪崩。需要注意的是,服务降级是在客户端层面实现的。接下来通过代码进行一个实践:
首先需要添加Hystrix的依赖:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
application.yml:
server:
port: 10090 spring:
application:
name: spring-cloud-hystrix-test eureka:
client:
service-url:
defaultZone: http://127.0.0.1:9090/eureka
fetch-registry: true
register-with-eureka: true
controller层代码实现:
@RestController
public class TestController { @Autowired
TestService service; @GetMapping("/hystrix/test")
public String helloHystrix() {
return service.test();
}
}
service层代码实现:
@Service
public class TestService { @Autowired
private RestTemplate restTemplate; @Autowired
private DiscoveryClient discoveryClient; @HystrixCommand(fallbackMethod = "myFallback")
public String test() { ServiceInstance instance = discoveryClient.getInstances("spring-cloud-service-provider").get(0);
String url = "http://" + instance.getHost() + ":" + instance.getPort() + "/test";
return restTemplate.getForObject(url, String.class);
} public String myFallback() {
return "fallback";
}
}
这里我们指定了myFallback()作为Fallback方法,我们通过浏览器访问一下这个服务试试看:

调用成功,因为现在我们的服务端并没有出现超时等需要进行降级处理的异常。为了验证降级我们对客户端以及服务端的代码进行微调。
客户端上增加了Hystrix属性中timeout的设置,调整为3秒钟未取到服务端的返回,视为超时:
@HystrixCommand(fallbackMethod = "myFallback", commandProperties = {
@HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds", value = "3000")
})
public String test() {
ServiceInstance instance = discoveryClient.getInstances("spring-cloud-service-provider").get(0);
String url = "http://" + instance.getHost() + ":" + instance.getPort() + "/test";
return restTemplate.getForObject(url, String.class);
}
服务端则是增加一个4秒中的sleep:
@RequestMapping(value = "/test", method = RequestMethod.GET)
public String test() throws InterruptedException {
Thread.sleep(4000);
return "Hello world!";
}
再次进行验证:

这次可以看到成功触发了降级。
再来看一下什么是熔断。当一定时间内,异常请求比例(请求超时、网络故障、服务异常等)达到阈值时,启动熔断器,熔断器一旦启动,则会停止调用具体服务逻辑,通过fallback快速返回托底数据,保证服务链的完整。看上去和降级差不多?不过熔断是在服务端实现,目的是当服务端的某个服务出现异常后为了不影响其他客户端的请求而做出的及时回应。
关于熔断,我们还有必要了解一下熔断机制的三个状态:关闭,开启和半开。最开始是关闭状态,这个时候所有请求都可以通过;如果错误请求达到一定的阈值,就会变成开启状态,此时所有请求短路,直接返回失败的响应;一段时间后,断路器会变成半开状态,如果下一个请求成功了,就关闭断路器,反之就开启断路器。
来看一下具体的代码实现:
@RestController
public class ServiceController { @RequestMapping(value = "/test", method = RequestMethod.GET)
@HystrixCommand(fallbackMethod = "myFallback",
commandProperties = {
@HystrixProperty(name = HystrixPropertiesManager.CIRCUIT_BREAKER_REQUEST_VOLUME_THRESHOLD, value="1"),
@HystrixProperty(name=HystrixPropertiesManager.CIRCUIT_BREAKER_SLEEP_WINDOW_IN_MILLISECONDS, value="5000")
})
public String test() throws Exception { System.out.println("test() called...");
throw new Exception("test exception");
} private String myFallback() {
return "fallback";
}
}
这里设置了熔断的一个阈值,也就是10秒内异常请求数达到1次就进行熔断,同时在5秒钟后恢复请求状态。
启动两个浏览器进行验证:

可以看到由于服务端直接抛出异常,两次调用均调用了托底服务,但是服务端却只记录了一次调用,因为第一次调用抛出异常后已经进入熔断状态:

同时由于设置了5秒后恢复请求,我们在5秒后再次尝试调用,服务端又会重新记录正常调用时的信息:

参考资料:
https://www.cnblogs.com/yb-ken/p/15068392.html
https://www.cnblogs.com/hellxz/p/8889017.html
https://www.cnblogs.com/bamboocloud/articles/10275090.html
https://www.jianshu.com/p/01efebbfc269
https://blog.csdn.net/wangchengming1/article/details/93191815
https://blog.csdn.net/tongtong_use/article/details/78611225
Spring Cloud Hystrix 学习(二)熔断与降级的更多相关文章
- spring cloud: Hystrix(二):简单使用@HystrixCommand的commandProperties配置@HistrixProperty隔离策略
spring cloud: Hystrix(二):简单使用@HystrixCommand的commandProperties配置@HistrixProperty隔离策略 某电子商务网站在一个黑色星期五 ...
- spring cloud深入学习(六)-----熔断监控Hystrix Dashboard和Turbine
Hystrix-dashboard是一款针对Hystrix进行实时监控的工具,通过Hystrix Dashboard我们可以在直观地看到各Hystrix Command的请求响应时间, 请求成功率等数 ...
- spring cloud深入学习(二)-----服务注册中心spring cloud eureka
服务治理 主要用来实现各个微服务实例的自动化注册与发现,为啥需要这玩意呢?在一开始比如A系统调用B服务,可能通过手工维护B服务的实例,并且还得采用负载均衡等方式,这些全部都得需要手工维护,等后面系统越 ...
- Spring Cloud Hystrix 学习(一)
在学习Hystrix之前,首先引入一个问题场景,服务雪崩.如下图所示: 可以看到,三个入口服务A.B.C最终都会请求到服务T.当服务T的请求过载,打满CPU都无法匹配请求的频率时,同步调用的上级服务就 ...
- Spring Cloud Hystrix 学习(三)请求合并
什么是请求合并?我们先来看两张图: 上方的两张图中,第二张可以看出服务端只执行了一次响应,这就是请求合并.客户端新增的请求合并模块,内部存在一个等待的时间窗口,将一定时间段内满足条件的请求进行合并,以 ...
- Spring Cloud学习 之 Spring Cloud Hystrix(基础知识铺垫)
Spring Boot版本:2.1.4.RELEASE Spring Cloud版本:Greenwich.SR1 文章目录 前述: 快速入门: 命令模式: RxJava: 前述: 在微服务架构中, ...
- 《Spring Cloud》学习(二) 负载均衡!
第二章 负载均衡 负载均衡是对系统的高可用.网络压力的缓解和处理能力扩容的重要手段之一.Spring Cloud Ribbon是一个基于 HTTP 和 TCP 的客户端负载均衡工具,它基于Netfli ...
- spring cloud(学习笔记)高可用注册中心(Eureka)的实现(二)
绪论 前几天我用一种方式实现了spring cloud的高可用,达到两个注册中心,详情见spring cloud(学习笔记)高可用注册中心(Eureka)的实现(一),今天我意外发现,注册中心可以无限 ...
- Spring Cloud Hystrix理解与实践(一):搭建简单监控集群
前言 在分布式架构中,所谓的断路器模式是指当某个服务发生故障之后,通过断路器的故障监控,向调用方返回一个错误响应,这样就不会使得线程因调用故障服务被长时间占用不释放,避免故障的继续蔓延.Spring ...
随机推荐
- WPF MVVM模式下路由事件
一,路由事件下三种路由策略: 1 冒泡:由事件源向上传递一直到根元素.2直接:只有事件源才有机会响应事件.3隧道:从元素树的根部调用事件处理程序并依次向下深入直到事件源.一般情况下,WPF提供的输入事 ...
- MySQL学习07(规范化数据库设计)
规范化数据库设计 当数据库比较复杂时我们需要设计数据库 糟糕的数据库设计 : 数据冗余,存储空间浪费 数据更新和插入的异常 程序性能差 良好的数据库设计 : 节省数据的存储空间 能够保证数据的完整性 ...
- 联合迭代器与生成器,enumerate() 内置函数真香!
花下猫语:Python 中很多内置函数的作用都非常大,比如说 enumerate() 和 zip(),它们使得我们在作迭代操作时极为顺手.这是一篇很多年前的 PEP,提议在 Python 2.3 版本 ...
- input 限制 上传文件类型
参考:input file控件限制上传文件类型 HTML <input> 标签的 accept 属性 网页上添加一个input file HTML控件: <input id=&quo ...
- 第一次上传代码到gitee
初始化 git init 添加文件到本地仓库 git add . 提交文件到本地仓库 git remote add origin 仓库地址 拉去远程仓库代码 git pull origin maste ...
- 查看linux系统是物理机还是虚拟机
物理机,返回机器型号 [root@laocalhost ~]# dmidecode -s system-product-name S910-X31E 虚拟机 [root@dev01-188 ~]# d ...
- C# KeyValuePair<TKey,TValue> 与 Dictionary<TKey,TValue> 区别
KeyValuePair<TKey,TValue> 可以设置.查询的一对键值 是struct Dictionary<TKey,TValue> 可以设置.查询的多对键值的集合 总 ...
- UWP AppConnection.
https://www.cnblogs.com/manupstairs/p/14582794.html
- WPF---依赖属性(二)
一.概要 我们将会通过一个简单的综合例子来阐述下依赖属性的变化. 场景:我们在一个文本框中输入一个数字,然后对应的panel中会出现对应的椭圆,椭圆的个数与输入的文本相同. 我们在MainWindow ...
- tar.gz 文件解压
tar.gz 文件解压 解压缩 file.tar.gz 的过程中出现如下所示问题: tar: 它似乎不像是一个 tar 归档文件 tar: 跳转到下一个头 tar: 由于前次错误,将以上次的错误状态退 ...