今天来看下Hystrix的熔断与降级。

首先什么是降级?当请求超时、资源不足等情况发生时进行服务降级处理,不调用真实服务逻辑,而是使用快速失败(fallback)方式直接返回一个托底数据,保证服务链条的完整,避免服务雪崩。需要注意的是,服务降级是在客户端层面实现的。接下来通过代码进行一个实践:

首先需要添加Hystrix的依赖:

  1. <dependency>
  2. <groupId>org.springframework.cloud</groupId>
  3. <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
  4. </dependency>

application.yml:

  1. server:
  2. port: 10090
  3.  
  4. spring:
  5. application:
  6. name: spring-cloud-hystrix-test
  7.  
  8. eureka:
  9. client:
  10. service-url:
  11. defaultZone: http://127.0.0.1:9090/eureka
  12. fetch-registry: true
  13. register-with-eureka: true

controller层代码实现:

  1. @RestController
  2. public class TestController {
  3.  
  4. @Autowired
  5. TestService service;
  6.  
  7. @GetMapping("/hystrix/test")
  8. public String helloHystrix() {
  9. return service.test();
  10. }
  11. }

service层代码实现:

  1. @Service
  2. public class TestService {
  3.  
  4. @Autowired
  5. private RestTemplate restTemplate;
  6.  
  7. @Autowired
  8. private DiscoveryClient discoveryClient;
  9.  
  10. @HystrixCommand(fallbackMethod = "myFallback")
  11. public String test() {
  12.  
  13. ServiceInstance instance = discoveryClient.getInstances("spring-cloud-service-provider").get(0);
  14. String url = "http://" + instance.getHost() + ":" + instance.getPort() + "/test";
  15. return restTemplate.getForObject(url, String.class);
  16. }
  17.  
  18. public String myFallback() {
  19. return "fallback";
  20. }
  21. }

这里我们指定了myFallback()作为Fallback方法,我们通过浏览器访问一下这个服务试试看:

调用成功,因为现在我们的服务端并没有出现超时等需要进行降级处理的异常。为了验证降级我们对客户端以及服务端的代码进行微调。

客户端上增加了Hystrix属性中timeout的设置,调整为3秒钟未取到服务端的返回,视为超时:

  1. @HystrixCommand(fallbackMethod = "myFallback", commandProperties = {
  2. @HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds", value = "3000")
  3. })
  4. public String test() {

  5. ServiceInstance instance = discoveryClient.getInstances("spring-cloud-service-provider").get(0);
  6. String url = "http://" + instance.getHost() + ":" + instance.getPort() + "/test";
  7. return restTemplate.getForObject(url, String.class);
  8. }

服务端则是增加一个4秒中的sleep:

  1. @RequestMapping(value = "/test", method = RequestMethod.GET)
  2. public String test() throws InterruptedException {

  3. Thread.sleep(4000);
  4. return "Hello world!";
  5. }

再次进行验证:

这次可以看到成功触发了降级。

再来看一下什么是熔断。当一定时间内,异常请求比例(请求超时、网络故障、服务异常等)达到阈值时,启动熔断器,熔断器一旦启动,则会停止调用具体服务逻辑,通过fallback快速返回托底数据,保证服务链的完整。看上去和降级差不多?不过熔断是在服务端实现,目的是当服务端的某个服务出现异常后为了不影响其他客户端的请求而做出的及时回应。

关于熔断,我们还有必要了解一下熔断机制的三个状态:关闭,开启和半开。最开始是关闭状态,这个时候所有请求都可以通过;如果错误请求达到一定的阈值,就会变成开启状态,此时所有请求短路,直接返回失败的响应;一段时间后,断路器会变成半开状态,如果下一个请求成功了,就关闭断路器,反之就开启断路器。

来看一下具体的代码实现:

  1. @RestController
  2. public class ServiceController {
  3.  
  4. @RequestMapping(value = "/test", method = RequestMethod.GET)
  5. @HystrixCommand(fallbackMethod = "myFallback",
  6. commandProperties = {
  7. @HystrixProperty(name = HystrixPropertiesManager.CIRCUIT_BREAKER_REQUEST_VOLUME_THRESHOLD, value="1"),
  8. @HystrixProperty(name=HystrixPropertiesManager.CIRCUIT_BREAKER_SLEEP_WINDOW_IN_MILLISECONDS, value="5000")
  9. })
  10. public String test() throws Exception {
  11.  
  12. System.out.println("test() called...");
  13. throw new Exception("test exception");
  14. }
  15.  
  16. private String myFallback() {
  17. return "fallback";
  18. }
  19. }

这里设置了熔断的一个阈值,也就是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 学习(二)熔断与降级的更多相关文章

  1. spring cloud: Hystrix(二):简单使用@HystrixCommand的commandProperties配置@HistrixProperty隔离策略

    spring cloud: Hystrix(二):简单使用@HystrixCommand的commandProperties配置@HistrixProperty隔离策略 某电子商务网站在一个黑色星期五 ...

  2. spring cloud深入学习(六)-----熔断监控Hystrix Dashboard和Turbine

    Hystrix-dashboard是一款针对Hystrix进行实时监控的工具,通过Hystrix Dashboard我们可以在直观地看到各Hystrix Command的请求响应时间, 请求成功率等数 ...

  3. spring cloud深入学习(二)-----服务注册中心spring cloud eureka

    服务治理 主要用来实现各个微服务实例的自动化注册与发现,为啥需要这玩意呢?在一开始比如A系统调用B服务,可能通过手工维护B服务的实例,并且还得采用负载均衡等方式,这些全部都得需要手工维护,等后面系统越 ...

  4. Spring Cloud Hystrix 学习(一)

    在学习Hystrix之前,首先引入一个问题场景,服务雪崩.如下图所示: 可以看到,三个入口服务A.B.C最终都会请求到服务T.当服务T的请求过载,打满CPU都无法匹配请求的频率时,同步调用的上级服务就 ...

  5. Spring Cloud Hystrix 学习(三)请求合并

    什么是请求合并?我们先来看两张图: 上方的两张图中,第二张可以看出服务端只执行了一次响应,这就是请求合并.客户端新增的请求合并模块,内部存在一个等待的时间窗口,将一定时间段内满足条件的请求进行合并,以 ...

  6. Spring Cloud学习 之 Spring Cloud Hystrix(基础知识铺垫)

    Spring Boot版本:2.1.4.RELEASE Spring Cloud版本:Greenwich.SR1 文章目录 前述: 快速入门: 命令模式: RxJava: 前述: ​ 在微服务架构中, ...

  7. 《Spring Cloud》学习(二) 负载均衡!

    第二章 负载均衡 负载均衡是对系统的高可用.网络压力的缓解和处理能力扩容的重要手段之一.Spring Cloud Ribbon是一个基于 HTTP 和 TCP 的客户端负载均衡工具,它基于Netfli ...

  8. spring cloud(学习笔记)高可用注册中心(Eureka)的实现(二)

    绪论 前几天我用一种方式实现了spring cloud的高可用,达到两个注册中心,详情见spring cloud(学习笔记)高可用注册中心(Eureka)的实现(一),今天我意外发现,注册中心可以无限 ...

  9. Spring Cloud Hystrix理解与实践(一):搭建简单监控集群

    前言 在分布式架构中,所谓的断路器模式是指当某个服务发生故障之后,通过断路器的故障监控,向调用方返回一个错误响应,这样就不会使得线程因调用故障服务被长时间占用不释放,避免故障的继续蔓延.Spring ...

随机推荐

  1. Vue系列-02-axios

    vue.js和aixos.js # https://blog-static.cnblogs.com/files/lichengguo/vue.js # 下载该文件,保存的路径为代码同级目录 js/vu ...

  2. 计算机网络:基于iptalbes的SANT和DNAT|docker的服务器发布项目--超详细一看就会

     项目说明: 模拟企业让内网服务器可以上网,同时发布内网的服务器 1.实验环 我们需要准备三台linux系统,一台作为路由器机route,其它为客户机client-1.client-2 主机改名 ho ...

  3. Redis实现分布式锁那件事

    今天我们来聊一聊分布式锁的那些事. 相信大家对锁已经不陌生了,我们在多线程环境中,如果需要对同一个资源进行操作,为了避免数据不一致,我们需要在操作共享资源之前进行加锁操作.在计算机科学中,锁(lock ...

  4. CF上部分树形DP练习题

    本次 5 道题均来自Codeforce 关于树形DP的算法讲解:Here 791D. Bear and Tree Jumps 如果小熊每次能跳跃的距离为1,那么问题变为求树上任意两点之间距离之和. 对 ...

  5. MATLAB—M函数文件

    文章目录 一.M文件 1.脚本文件和函数文件的区别 二.M函数文件 1.创建方法 2.文件形式 2.函数形参及注释 3.函数的调用 4.函数变量 5.主函数.子函数 三.函数句柄 一.M文件 首先,要 ...

  6. 简略图解:输入 url 到出现页面,浏览器做了什么?

    应该有很多前端开发人员都思考过这么一个问题:从输入 URL 到页面加载完成,中间都做发生了什么? 这个问题涉及的面非常广,每个涉及的点又很深入.从触屏/键盘如何到 CPU?CPU 如何到系统内核?如何 ...

  7. NOIP 模拟 $15\; \text{影子}$

    题解 \(by\;zj\varphi\) 一道并查集的题 对于它路径上点权,我们可以转化一下:对于一个点,它在哪些路径上是最小的点权 那么我们排个序,从大到小加入点,每回加入时,将这个点与它所相连的且 ...

  8. NOIP 模拟 6 辣鸡

    题解 难得啊,本来能 \(AC\) 的一道题,注释没删,挂了五分,难受 此题暴力很好想,就是直接 \(n^2\) 枚举不同的矩阵组合,记录块内答案和跨块的答案 出题人不会告诉你,这题只要输出块内答案就 ...

  9. 安装 iperf和服务器之间测速

    安装 # https://downloads.es.net/pub/iperf/iperf-3.1.3.tar.gz wget https://iperf.fr/download/source/ipe ...

  10. SpringMVC之@ControllerAdvice

    @ControllerAdvice ,很多初学者可能都没有听说过这个注解,实际上,这是一个非常有用的注解,顾名思义,这是一个增强的 Controller.使用这个 Controller ,可以实现三个 ...