浑身尖刺的服务可用性守护者——hystrix熔断器实践记录
netflix公司的产品hystrix(长满刺的豪猪),在高可用目标下具有一定熔断、限流、降级的作用。
这里主要写一些自己在使用时的问题解决思路,原理请自行理解,包括线程池与信号量模式等。
注意三个参数的默认值:
1、commandGroup 默认为getClass().getSimpleName();
2、commandKey 默认为getClass().getSimpleName()(继承HystrixCommand方式)/ 方法名(注解方式),可与commandGroup相同;
3、threadPoolKey 默认与commandGroup相同,即一个group共用线程池。这个key也可以单独定义,原因是属于相同逻辑功能的“组”,其中每个命令占用的资源彼此之间可能需要隔离。
hystrix在普通java项目中有两种应用方式,首先引入依赖
<dependency>
<groupId>com.netflix.hystrix</groupId>
<artifactId>hystrix-core</artifactId>
<version>1.5.12</version>
</dependency>
一、写一个类继承HystrixCommand,组合需要熔断的方法所在的接口或实现类,重写run()和getFallback(),
run()中写业务调用原方法的逻辑,getFallback()中可以通过getFailedExecutionException()处理方法执行异常。
在构造函数中通过super(Setter.xxx)配置参数。
附:设置参数示例
super(Setter
.withGroupKey(
HystrixCommandGroupKey.Factory.asKey(xxxWithCircuitBreaker.class.getName()))
.andThreadPoolKey(
HystrixThreadPoolKey.Factory.asKey(xxxWithCircuitBreaker.class.getName()))
.andThreadPoolPropertiesDefaults(HystrixThreadPoolProperties.Setter().withCoreSize(5))// 服务线程池数量
.andCommandPropertiesDefaults(HystrixCommandProperties.Setter().withExecutionTimeoutEnabled(true)
.withExecutionTimeoutInMilliseconds(1000)// 超时时间
.withCircuitBreakerRequestVolumeThreshold(5)// 设置在一个滚动窗口中,打开断路器的最少请求数
.withCircuitBreakerErrorThresholdPercentage(60)// 熔断器关闭到打开的百分比阈值
.withCircuitBreakerSleepWindowInMilliseconds(5000)// 熔断器打开到关闭的时间窗长度
));
外部使用hystrixCommand.execute();调用。
注意:getFailedExecutionException()不包括超出withExecutionTimeoutInMilliseconds设置的时间时抛出的异常以及在熔断状态下调用方法时抛出的异常。
通过阅读源码发现HystrixCommand这个方式可以做更多扩展,比如通过getExecutionException()方法获取方法执行中的所有异常,这里是自己在测试过程中简单的异常处理逻辑:
Exception e = (Exception) getExecutionException();
if (e instanceof HystrixTimeoutException) {
logger.error("方法执行超时");
} else if (e instanceof RuntimeException) {
// 大部分原因是发生熔断阻断了方法请求
logger.error(e.getMessage());
} else if (null != getFailedExecutionException())
logger.error("方法执行异常", getFailedExecutionException());
二、@HystrixCommand注解方式
要额外引入一个依赖。
<dependency>
<groupId>com.netflix.hystrix</groupId>
<artifactId>hystrix-javanica</artifactId>
<version>1.5.12</version>
</dependency>
spring配置文件中加入aop:
xmlns:aop="http://www.springframework.org/schema/aop"
。。。
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd
。。。
<aop:aspectj-autoproxy/>
<bean id="hystrixAspect"
class="com.netflix.hystrix.contrib.javanica.aop.aspectj.HystrixCommandAspect"></bean>
hystrix使用Netflix Archaius作为配置中心(这个东西可以动态变更配置),默认配置文件在resources下,名字为config.properties。
如果需要指定配置文件位置,实践下来可以在项目启动过程中添加archaius所需的系统属性,如在spring监听器中添加。
例:// 通过archaius配置hystrix全局参数
System.setProperty("archaius.configurationSource.additionalUrls", "classpath:/properties/hystrix.properties");
当然hystrix配置有四个优先级,这里是全局配置,如果没记错的话,配置文件中针对某commandKey的配置 优先于 方法注解中的配置 优先于 配置文件中全局配置。
hystrix.properties示例内容(简单测试):
hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds=100 注:timeoutInMilliseconds单位ms,可以设置到1,不知实际是否能精确到1ms,简单测试没啥问题。
hystrix.command.default.circuitBreaker.requestVolumeThreshold=5
hystrix.command.default.execution.isolation.strategy=THREAD
这样在需要熔断的方法中只需指定相应fallback方法即可。
@HystrixCommand(fallbackMethod = "fallback1")
注解这里比继承HystrixCommand类的方式灵活的一点是可以在fallback方法中继续指定下一个fallback方法。
但不便的一点是只能从getFailedExecutionException()查看异常,其已经作为fallback方法的Throwable e参数了。
注意:
1、如果进入fallback,Hystrix会默认打印出getFailedExecutionException()的异常堆栈信息,比如超时就不会打印。
2、原则上fallback不允许抛出异常,但注解方式可以做到。Hystrix会打印如下两行加以提示。
13:40:34.035 [hystrix-BulkIndexServiceImpl-1] ERROR c.n.h.contrib.javanica.command.GenericCommand - failed to process fallback is the method: 'fallback1'.
13:40:34.038 [hystrix-BulkIndexServiceImpl-1] DEBUG com.netflix.hystrix.AbstractCommand - HystrixCommand execution COMMAND_EXCEPTION and fallback failed.
3、注解可以通过定义参数成员ignoreExceptions = {CustomException.class}来定义无需进入fallback方法的异常(直接抛出,Hystrix算作成功执行,不会触发熔断),但是如果超时还是会进fallback。
*4、个别情况下会发生run()方法和fallback()方法都成功执行完成,比如在测试时使用Thread.sleep() catch了InterruptedException,run()并未因超时而成功打断,在业务代码中应当注意try-catch问题,如果简单的catch Exception而catch之后仍有代码,则这些代码即时超时也会被执行。
附:注解配置示例
@HystrixCommand(groupKey = "hello", commandKey = "hello-service", threadPoolKey = "hello-pool", threadPoolProperties = {
@HystrixProperty(name = "coreSize", value = "5") }, commandProperties = {
@HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds", value = "1000"),
@HystrixProperty(name = "execution.isolation.strategy", value = "THREAD"),
@HystrixProperty(name = "circuitBreaker.requestVolumeThreshold", value = "5"),
@HystrixProperty(name = "circuitBreaker.sleepWindowInMilliseconds", value = "5000")
}, fallbackMethod = "fallback1")
下篇mycat,欢迎交流指教。
浑身尖刺的服务可用性守护者——hystrix熔断器实践记录的更多相关文章
- Spring cloud微服务 Hystrix熔断器学习教程
以下demo代码:https://github.com/wades2/HystrixtDemo 官网定义:Hystrix是一个延迟容错库.在分布式环境中,许多服务依赖项中的一些不可避免地会失败.Hys ...
- Spring-Cloud之Hystrix熔断器-5
一.在分布式系统中,服务与服务之间的依赖错综复杂,一种不可避免的情况就是某些服务会出现故障,导致依赖于它们的其他服务出现远程调度的线程阻塞 Hystrix是Netflix 公司开源的一个项目,它提供了 ...
- Spring Boot + Spring Cloud 实现权限管理系统 后端篇(二十):服务熔断(Hystrix、Turbine)
在线演示 演示地址:http://139.196.87.48:9002/kitty 用户名:admin 密码:admin 雪崩效应 在微服务架构中,由于服务众多,通常会涉及多个服务层级的调用,而一旦基 ...
- 服务容错保护断路器Hystrix之五:配置
接着<服务容错保护断路器Hystrix之二:Hystrix工作流程解析>中的<2.8.关于配置>再列举重要的配置如下 一.hystrix在生产中的建议 1.保持timeout的 ...
- 服务容错保护断路器Hystrix之三:断路器监控(Hystrix Dashboard)-单体监控
turbine:英 [ˈtɜ:baɪn] 美 [ˈtɜ:rbaɪn] n.汽轮机;涡轮机;透平机 一.Hystrix Dashboard简介 在微服务架构中为了保证程序的可用性,防止程序出错导致网络阻 ...
- springcloud(八)-Hystrix熔断器
雪崩效应 在微服务架构中通常会有多个服务层调用,基础服务的故障可能会导致级联故障,进而造成整个系统不可用的情况,这种现象被称为服务雪崩效应.服务雪崩效应是一种因“服务提供者”的不可用导致“服务消费者” ...
- Spring Cloud(四):服务容错保护 Hystrix【Finchley 版】
Spring Cloud(四):服务容错保护 Hystrix[Finchley 版] 发表于 2018-04-15 | 更新于 2018-05-07 | 分布式系统中经常会出现某个基础服务不可用 ...
- SpringCloud学习(6)——Hystrix熔断器
分布式系统面临的问题 复杂的分布式体系结构中的应用程序有数十个依赖关系, 每个依赖关系在某些时刻不可避免的失败. 服务雪崩效应 多个微服务调用的时候, 假设微服务A调用微服务B和微服务C, 微服务B和 ...
- Spring Cloud Hystrix 熔断器(五)
序言 感觉hystrix很精彩,文档讲的也很好,这篇总结到哪里是哪里吧 写Hystrix之前,我们先简单的说说熔断器,和限流,这样你看完之后,就可以很容易理解Hystrix 熔断器 熔断器模式源于Ma ...
随机推荐
- 正则表达式(RegExp)
前言:先来了解一下基础知识.再细说正则表达式~ 转义字符 ---- \ 转义字符会将与之相邻的字符转换含义. 例如说,希望在一个字符串中输出 “ 号,那么就可以使用在双引号前加入 \ ,这样就能 ...
- 单点登录(Single Sign On)解决方案
单点登录(Single Sign On)解决方案 需求 多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统. A 网站和 B 网站是同一家公司的关联服务.现在要求,用户只要在其中一个网 ...
- 右键没有新建word选项
两类解决办法 一. 1. 新建一个txt文本,并插入如下内容: Windows Registry Editor Version 5.00 [HKEY_CLASSES_ROOT\.doc] @=&quo ...
- Java第三次作业第四题
4. [问题描述]读取一个文本文件in.txt,然后将这个文件的内容,反序写到另一个文件out.txt中. [输入形式]从文件in.txt中读信息. [输出形式]反序内容写入out.txt文件中. [ ...
- 控制执行流程之break和continue
1.在任何迭代语句的主体部分,都可以用break和continue来控制程序执行流程. 2.注意: break:用于强行退出循环, 不执行循环中剩余的语句:continue:停止当前的循环,执行下一次 ...
- 新手学习FFmpeg - 调用API完成两个视频的任意合并
本次尝试在视频A中的任意位置插入视频B. 在上一篇中,我们通过调整PTS可以实现视频的加减速.这只是对同一个视频的调转,本次我们尝试对多个视频进行合并处理. Concat如何运行 ffmpeg提供了一 ...
- 基于Docker搭建大数据集群(六)Hive搭建
基于Docker搭建大数据集群(六)Hive搭建 前言 之前搭建的都是1.x版本,这次搭建的是hive3.1.2版本的..还是有一点细节不一样的 Hive现在解析引擎可以选择spark,我是用spar ...
- C# https证书通信Post/Get(解决做ssl通道时遇到“请求被中止: 未能创建 SSL/TLS 安全通道”问题)
public static string HttpPost(string url, string param = null) { HttpWebRequest request; //如果是发送HTTP ...
- 大数据处理中的Lambda架构和Kappa架构
首先我们来看一个典型的互联网大数据平台的架构,如下图所示: 在这张架构图中,大数据平台里面向用户的在线业务处理组件用褐色标示出来,这部分是属于互联网在线应用的部分,其他蓝色的部分属于大数据相关组件,使 ...
- 2018年蓝桥杯java b组第五题
标题:快速排序 以下代码可以从数组a[]中找出第k小的元素. 它使用了类似快速排序中的分治算法,期望时间复杂度是O(N)的. 请仔细阅读分析源码,填写划线部分缺失的内容. 我在使用(a, l, r, ...