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,欢迎交流指教。

转载于:https://www.cnblogs.com/feixuefubing/p/10169940.html

浑身尖刺的服务可用性守护者——hystrix熔断器实践记录相关推荐

  1. SpringCloud微服务架构之,Hystrix 熔断器,Gateway 网关

    Hystrix 概述 Hystix 是 Netflix 开源的一个延迟和容错库,用于隔离访问远程服务.第三方库,防止出现级联失败(雪崩). pom依耐 <!-- hystrix -->&l ...

  2. Eureka注册服务中心,Feign服务调用,Hystrix熔断器的一些详细配置介绍

    1.eureka管理机制 心跳检测 客户端会在每30秒发送信息刷新服务端注册信息,表示续约,若在指定默认90秒钟没有向服务器发送信息,则从注册表中剔除 控制发送心跳间隔 eureka.instance ...

  3. 学习springcloud的Hystrix(熔断器)。记录其中遇见的问题(参考纯洁的微笑)

    2019独角兽企业重金招聘Python工程师标准>>> 服务中心,注册服务,调用服务完成以后.多个服务关联性调用,有时候,出现服务链式调用,如果上层奔溃,大批量的请求整个下层全部奔溃 ...

  4. Spring Cloud 之 Ribbon,Spring RestTemplate 调用服务使用Hystrix熔断器

    在服务调用中增加Hystrix熔断器,是在单个服务出现故障的时候快速失败,也可以提供回退方案,避免因为线程等待耗尽整个服务的线程资源:Hystrix DashBoard监控组件,可以实时监控熔断器的状 ...

  5. Spring cloud微服务 Hystrix熔断器

    以下demo代码:https://github.com/wades2/HystrixtDemo 官网定义:Hystrix是一个延迟容错库.在分布式环境中,许多服务依赖项中的一些不可避免地会失败.Hys ...

  6. 微服务(四) 【手摸手带你搭建Spring Cloud】 Hystrix 熔断器 什么是熔断器? 什么是Hystrix?为什么要熔断器 Hystrix用来做什么? 作用是什么?

    上一章我们讲了负载均衡 文章目录 前言 一.Hystrix是什么? 二.Hystrix的作用是什么?Hystrix具体要保护什么? 2.1什么是微服务-雪崩效应 2.1服务熔断原理 三.实践 前言 一 ...

  7. 微服务高可用之熔断器实现原理与 Golang 实践

    I.内容提要 在微服务架构中,经常会碰到服务超时或通讯失败的问题,由于服务间层层依赖,很可能由于某个服务出现问题,不合理的重试和超时设置,导致问题层层传递引发雪崩现象,而限流和熔断是解决这个问题重要的 ...

  8. 一文带你了解Ribbon负载均衡和Hystrix熔断器

    文章目录 1. Ribbon负载均衡 1.1 关于负载均衡 1.2 Ribbon高级应用 1.3 Ribbon负载均衡策略 1.4 Ribbon核心源码剖析 2. Hystrix熔断器 2.1 微服务 ...

  9. Ribbon 负载均衡 和 Hystrix熔断器

    1 Ribbon负载均衡 1.1 关于负载均衡 负载均衡一般分为服务器端负载均衡和客户端负载均衡 所谓服务器端负载均衡,比如Nginx.F5这些,请求到达服务器之后由这些负载均衡器根据一定的算法将请求 ...

最新文章

  1. anglar ajax执行2次的原因,angular2 router’解决问题被执行两次
  2. 流畅的python第一章_《流畅的Python》第一章学习笔记
  3. 正确的修改web项目的名字
  4. centos下mysql 命令,CentOS下mysql 常用命令
  5. 虚拟机打不开,提示“此主机不支持虚拟化实际模式”的解决方法。
  6. 还在被网络上各种关于单片机行业的收入搞的眼花缭乱而烦恼吗
  7. 两台200smart以太网通讯_S7-200 SMART PLC之间如何实现以太网通信?(附接线图)
  8. 算法:Number of Islands(岛屿的个数)
  9. mod java 求余_java中求余%与取模floorMod的区别
  10. C#编程(二十三)----------实现继承
  11. linux多线程如何分配到多核上,Linux多线程编程 多核编程
  12. ad软件画pcb方法总结_AD软件中导入BRD的PCB文件总结分享,,,,
  13. SQL省市区三级表 脚本
  14. ElementUI 中 栅格布局 混乱问题
  15. 创建可引导的 macOS High Sierra 安装 U 盘
  16. 301代码php代码在哪里加,301转向设置及代码及方法详解
  17. 聊聊互联网广告前世今生,你想不想要流量?反正我想!
  18. 生日礼物codeGift
  19. EGE相关:控制台窗口的设置
  20. 迅雷显示服务器未连接,迅雷看看网络连接不上怎么回事 迅雷看看连接不上网络的解决方法...

热门文章

  1. 懒汉延迟加载设计模式反射注解
  2. TCP/IP英文缩写汇总
  3. HTM+CSS实现立方体图片旋转展示效果
  4. 小白学 Python 爬虫(26):为啥上海二手房你都买不起
  5. linux 加载 native 方法 失败
  6. eccv 2018 image caption generation论文导读
  7. CheatMaker教学进阶之一 - 基地址与指针
  8. 计算机管理找不到新安装的系统,我的电脑开机显示找不到启动设备,请在硬盘上安装操作系统怎么办?开...
  9. ABP 依赖注入(1)
  10. 【论文】 Skeletonization of Ribbon-Like Shapes Based on Regularity and Singularity Analyses