在以前的文章中,我们介绍过使用Gauva实现限流的功能,现在我们来了解一下如何在服务框架中实现熔断和降级的方法。

简介Hystrix

大型系统架构的演进基本上都是这样一个方向:从单体应用到分布式架构。这个演进过程离不开一个字“拆”,我们会把一个系统拆成很多子系统,子系统之间一定会存在依赖,有的是强依赖(比如Http调用),有的是弱依赖(比如,使用消息中间件)。“拆”的主要意义之一就是一个子系统挂了不影响其他的服务正常运行,而对于那么我们拆出来强依赖的服务如果挂了,还是会影响整个系统,所以我们光“拆”是没有达到效果的。

Hystrix源于Netflix,该库可以对那些在访问远程系统、服务、第三方库或者其他方法调用时所产生的延迟或者故障提供更强大的容错能力。说白了就是提供了一种简洁、灵活和强大的框架去处理依赖异常,一个服务挂了不影响其他的服务正常运行,也是微服务概念中熔断,降级的具体框架实现。

它主要的功能如下:

1.对第三方组件进行访问(特别是网络访问)时出现的延迟或者的异常进行保护和控制。

2.在复杂的分布式系统中,停止级联故障。

3.快速失败,快速恢复。

4.可以优雅的降级。

5.可以提供近实时的监控、告警和操作控制。

典型场景:雪崩效应

Hystrix典型的场景就是处理复杂的分布式调用过程中依赖服务延迟或者异常的场景。下图是一张服务依赖图,用户的请求依赖于跨网络的A、H、I、P四个其他的服务。

如果各个服务运行的都很好,那么不会有问题。在大型系统中,随着服务越来越多,网络或者性能问题引起的超时,逻辑的异常带来的不可访问,都是必然会出现的情况。

如上图,一个用户请求的时候,其中的一个依赖服务I出现了延迟,那么整个的这个用户请求将被阻塞。

随着大量流量的增加,一个单一的后端依赖会成为潜在风险,可能导致整个环境的软硬件资源出现问题。不单单这个服务会挂掉,这些问题还有可能,影响环境中的消息队列、线程等其他资源,从而导致系统上的级联故障。最终出现下图的情况。

网络连接失败或降级,服务和服务器失败或变慢,新的库或服务部署改变行为或性能特征,客户端库有bug等等,所有这些都有可能会造成上述的情况,这就需要我们要隔离和管理这些故障和延迟,以便一个失败的依赖项不能影响整个应用程序或系统。而Hystrix正是解决这类问题的。

Hystrix怎样解决这些问题

1.Hystrix使用命令模式HystrixCommand(Command)包装依赖调用逻辑,每个命令在单独线程中/信号授权下执行。

2.可配置依赖调用超时时间,超时时间一般设为比99.5%平均时间略高即可.当调用超时时,直接返回或执行fallback逻辑。

3.为每个依赖提供一个小的线程池(或信号),如果线程池已满调用将被立即拒绝,默认不采用排队.加速失败判定时间。

4.依赖调用结果分:成功,失败(抛出异常),超时,线程拒绝,短路。 请求失败(异常,拒绝,超时,短路)时执行fallback(降级)逻辑。

5.提供熔断器组件,可以自动运行或手动调用,停止当前依赖一段时间(10秒),熔断器默认错误率阈值为50%,超过将自动运行。

6.提供近实时依赖的统计和监控

Hystrix把每个潜在的依赖性进行包装,把每一个依赖项都与另一个依赖项隔离开来,当潜在的问题发生时能限制它的资源,并在调用发生异常时能够决定如何应答给调用方,从而快速的恢复处理,不影响下面的调用。如下图,Hystrix对依赖I配置了5个线程。当调用依赖I的时候,Hystrix配置了两种策略,异常和超时,那么只要有一样触发,或者线程被占满,就可以马上进入我们预设的异常处理逻辑。

示例程序HelloWorld

下面我们用一个简单的例子来展示怎样使用Hystrix来处理上面的场景。一个接口调用超过5秒钟或者出现异常的时候,走另外的降级逻辑。

1.pom文件,引用jar包

<dependency><groupId>com.netflix.hystrix</groupId><artifactId>hystrix-core</artifactId><version>1.5.12</version></dependency>

2.使用Hystrix的命令基类HystrixCommand封装调用逻辑,在执行方法体中,我模拟了3种调用结果:分别是正常调用、调用超时(5s)、和接口中出现异常。

import com.netflix.hystrix.HystrixCommand;
import com.netflix.hystrix.HystrixCommandGroupKey;
import com.netflix.hystrix.HystrixCommandProperties;import java.util.concurrent.TimeUnit;/*** 使用HystrixCommand封装执行方法。继承Hystrix命令基类,泛型参数即调用方法的返回参数*/
public class HelloWorldCommand extends HystrixCommand<String>
{private final String name;/*** 定义构造函数,参数即被包装方法的输入参数* @param name*/public HelloWorldCommand(String name){//定义命令组 和 方法调用超时时间super(Setter.withGroupKey(HystrixCommandGroupKey.Factory.asKey("HelloWorldGroup")).andCommandPropertiesDefaults(HystrixCommandProperties.Setter().withExecutionTimeoutInMilliseconds(5000)));this.name = name;}/*** 封装业务逻辑的方法体,在这里执行真正的业务逻辑。* @return* @throws Exception*/@Overrideprotected String run() throws Exception{//例子中,模拟执行超时if (name.equals("TimeoutCommand")){TimeUnit.SECONDS.sleep(6);}//例子中,模拟出现异常if (name.equals("ExceptionCommand")){throw new Exception("ExceptionCommand");}//例子中,模拟正常返回return "Hello " + name + "!";}/*** 降级方法定义,即,run方法中出现异常后应该执行的方法。包括例子中的超时。* @return*/@Overrideprotected String getFallback(){return "Command failed!";}
}

3.调用方法

public class HelloWorld
{public static void main(String[] args){SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");String s = new HelloWorldCommand("Nick").execute();System.out.println(sdf.format(new Date()) + "->" + s);s = new HelloWorldCommand("TimeoutCommand").execute();System.out.println(sdf.format(new Date()) + "->" + s);s = new HelloWorldCommand("ExceptionCommand").execute();System.out.println(sdf.format(new Date()) + "->" + s);}
}

调用方法模拟了3中不同的结果:正常调用、调用超时(5s)、和接口中出现异常。结果如下:

2017-12-24 17:58:18->Hello Nick!
2017-12-24 17:58:23->Command failed!
2017-12-24 17:58:23->Command failed!

转载于:https://www.cnblogs.com/haoxinyue/p/8098797.html

Hystrix入门与分析(一):初识Hystrix相关推荐

  1. Hystrix使用与分析

    Hystrix 使用与分析 转载于:https://www.cnblogs.com/gotodsp/p/7611717.html

  2. Spring Cloud 源码学习之 Hystrix 入门

    欢迎访问陈同学博客原文 Hystrix 功能非常多,本文仅对 Hystrix 源码做入门学习.为便于阅读,文中源码有较大删减,仅保留入门学习必要的源码,降低其他逻辑的干扰. 从 Hystrix 名字说 ...

  3. Hystrix入门指南

    Introduction 1.Where does the name come from? hystrix对应的中文名字是"豪猪",豪猪周身长满了刺,能保护自己不受天敌的伤害,代表 ...

  4. Spring Boot+Spring Cloud基础入门(五)断路器——Hystrix

    Hystrix Hystrix翻译成中文是"豪猪",豪猪周身长满了刺,能保护自己不受天敌的伤害,代表了一种防御机制,这与Hystrix本身的功能不谋而合,因此Netflix团队将该 ...

  5. Linux零基础入门(一)初识Linux

    Linux零基础入门(一)初识Linux 前言 操作系统概述 一 操作系统概述 1 硬件和软件 2 操作系统 二 初识Linux 1 Linux的诞生 2 Linux内核 3 Linux发行版 三 虚 ...

  6. 入门量化分析(金融)的一些建议

    本文转载自:宁哥的小站 » 给要入门量化分析的人一些建议(转) 针对你数学.物理较好以及有一定C基础的情况,我的建议(也是对所有想要入门量化分析的人)的建议是: 一. 数学 继续打好数学基础,学一学集 ...

  7. zemax场曲畸变图_zemax初学入门像差分析各种图像(上)

    原标题:zemax初学入门像差分析各种图像(上) 各种像差图表 初级球差大的点列图 由于外圈的蓝光大,而红光和青光比较集中,由两个情况引起. 一. 蓝光的球差比较大 二. 轴向色差比较大 初级球差大的 ...

  8. 零基础入门转录组分析——第五章(表达定量)

    零基础入门转录组分析--第五章(表达定量) 目录 零基础入门转录组分析--第五章(表达定量) 1. 序列比对结果的复查 2. 表达定量 3. 提取有效信息 4. 合并多个样本定量结果 5. 进一步修改 ...

  9. web前端高级React - React从入门到进阶之初识React

    第一部分:React入门 系列文章目录 第一章:React从入门到进阶之初识React 第一章:React从入门到进阶之JSX简介 第三章:React从入门到进阶之元素渲染 第四章:React从入门到 ...

最新文章

  1. 通过网易的在线捐款捐了10元钱
  2. 利用yarn capacity scheduler在EMR集群上实现大集群的多租户的集群资源隔离和quota限制...
  3. git 忽略__pycache___容易被忽略的 Python 命令行参数
  4. MongoDB和Elasticsearch的各使用场景对比
  5. opencv ret, binary = cv2.threshold(src, 180, 255, )二值化的类型
  6. 坚果pro2刷Nitrogen OS安卓pie纯正原生
  7. 拼多多出现重大BUG,几小时内损失超千万,但处理方式让用户怒了
  8. 巨头集体跨界,老玩家悄然出圈,谁在争夺6亿电竞用户?
  9. 移动支付服务Dwolla宣布10美元以下交易不收费
  10. 关于c语言杨辉三角编写的改进
  11. 解决Error: Assertion failed (chunk.m_size <= 0xFFFF)和Set OPENCV_ENABLE_NONFREE CMake option问题
  12. 如何快速提升文章阅读量?
  13. android气泡样式图片,Android实现三角形气泡效果方式汇总
  14. nDPI – 快速入门指南
  15. Cacti监控mysql数据库服务器实现过程
  16. 人生如梦游戏间,RPG游戏开源开发讲座 JAVA篇 4 ——一步莲华
  17. 电商“助推”论文代写、期刊代发 谁评学术端与不端?
  18. centos8.5 Vsftpd 搭建FTP服务器
  19. 专题二:欧拉视频放大(基于相位)---原理解析
  20. PDF | 利用Adobe acrobat pro 对PDF进行拆分

热门文章

  1. linux 串口 dma,STM32 USART串口DMA 接收和发送流程详解
  2. 消息中间件→产生原因、JMS与AMQP、主流消息中间件、基本概念、ActiveMQ、集群、实际场景问题解决方案、集成rabbitMQ与kafka
  3. 第二章 HTML5存储 Web存储
  4. jquery显示与隐藏效果
  5. python模板怎么写,Python模板
  6. Python入门--os.walk
  7. 组合数学-容斥原理-求指定区间内与n互素的数的个数
  8. 设计模式—抽象工厂模式(思维导图)
  9. [leetcode] 1335. 工作计划的最低难度
  10. bzoj 3632: 外太空旅行(随机)