Hystrix 的执行模型设计上采用了命令模式,将对外部资源的调用逻辑和 fallback 逻辑封装成一个命令对象(HystrixCommand / HystrixObservableCommand),交由 Hystrix 执行。

引入需要的包

com.netflix.hystrix

hystrix-core

1.5.18

com.netflix.hystrix

hystrix-javanica

1.5.18

使用方式一:Java原生编码方式

我们可以通过Hystrix原生编码的方式来对访问的接口进行控制

步骤1:创建针对某个接口的命令对象

/**

* 定义某个接口调用的指令类

* */

public class IhrTokenRequestCommand extends HystrixCommand> {

public IhrTokenRequestCommand(){

//配置本接口配置参数

super(Setter.withGroupKey(HystrixCommandGroupKey.Factory.asKey("ThreadPoolTestGroup")) //服务分组

.andCommandKey(HystrixCommandKey.Factory.asKey("testCommandKey"))

.andThreadPoolKey(HystrixThreadPoolKey.Factory.asKey("ThreadPoolTest"))

.andCommandPropertiesDefaults(HystrixCommandProperties.Setter()

.withExecutionTimeoutInMilliseconds(5000)) //超时时长,默认1000

.andThreadPoolPropertiesDefaults( // 配置线程池

HystrixThreadPoolProperties.Setter()

.withCoreSize(50)) // 配置线程池里的线程数

.andCommandPropertiesDefaults( // 配置熔断器

HystrixCommandProperties.Setter()

.withCircuitBreakerEnabled(true) //是否开启熔断机制,默认为true。

.withCircuitBreakerRequestVolumeThreshold(20) //在熔断开关闭合情况下,在进行失败率判断之前,一个采样周期内必须进行至少N个请求才能进行采样统计,目的是有足够的采样使得失败率计算正确,默认为20。

.withCircuitBreakerSleepWindowInMilliseconds(3) // 熔断后的重试时间窗口,且在该时间窗口内只允许一次重试。即在熔断开关打开后,在该时间窗口允许有一次重试,如果重试成功,则将重置Health采样统计并闭合熔断开关实现快速恢复,否则熔断开关还是打开状态,执行快速失败。

.withCircuitBreakerErrorThresholdPercentage(50) //如果在一个采样时间窗口内,失败率超过该配置,则自动打开熔断开关实现降级处理,即快速失败。默认配置下采样周期为10s,失败率为50%。

)

);

}

//实际执行的代码,可主动抛出HystrixTimeoutException、HystrixRuntimeException等异常

@Override

protected MResult run() throws Exception {

return null;

}

//降级方法

@Override

protected MResult getFallback() {

MResult result = new MResult(ResponseCodeEnum.ERROR) ;

return result;

}

}

步骤2:创建实例并执行

MResult result = new IhrTokenRequestCommand().execute();

注意,每次调用都需要创建一个实例

使用方式二:使用Spring的AOP进行控制

通过Spring的AOP,我们可以用更加优雅的方式来控制对接口的访问

步骤1:添加所需切面的配置

在Spring的配置文件中添加以下配置

也可以通过JavaConfig的方式来配置

@Configuration

public class HystrixAspectConfiguration {

@Bean

public HystrixCommandAspect hystrixAspect() {

return new HystrixCommandAspect();

}

}

步骤2:在方法上添加注解

public class HystrixResourceApi {

@HystrixCommand(commandProperties = {

@HystrixProperty(name = "circuitBreaker.errorThresholdPercentage", value = "50")

},fallbackMethod = "fallbackForGetUser")

public String getUserById(String id) {

throw new RuntimeException("getUserById command failed");

}

/**

* fallback 方法,原方法被降级的时候调用

* */

String fallbackForGetUser(String id) {

return "unknown";

}

}

接着,在需要的地方通过依赖注入的方式来正常的使用该方法即可。

HystrixCommandProperties配置说明

参数

说明

withFallbackEnabled

是否启用降级处理,如果启用了,则在超时或异常时调用getFallback进行降级处理,默认开启。

withFallbackIsolationSemaphoreMaxConcurrentRequests

fallback方法的信号量配置,配置getFallback方法并发请求的信号量,如果请求超过了并发信号量限制,则不再尝试调用getFallback方法,而是快速失败,默认信号量为10。

withExecutionIsolationThreadInterruptOnFutureCancel

当隔离策略为THREAD时,当执行线程执行超时时,是否进行中断处理,即Future#cancel(true)处理,默认为false

withExecutionIsolationThreadInterruptOnTimeout

当隔离策略为THREAD时,当执行线程执行超时时,是否进行中断处理,默认为true。

withExecutionTimeoutEnabled

是否启用执行超时机制,默认为true

withExecutionTimeoutInMilliseconds

执行超时时间,默认为1000毫秒,如果命令是线程隔离,且配置了executionIsolationThreadInterruptOnTimeout=true,则执行线程将执行中断处理。如果命令是信号量隔离,则进行终止操作,因为信号量隔离与主线程是在一个线程中执行,其不会中断线程处理,所以要根据实际情况来决定是否采用信号量隔离,尤其涉及网络访问的情况。

withCircuitBreakerEnabled

是否开启熔断机制,默认为true。

withCircuitBreakerForceClosed

是否强制关闭熔断开关,如果强制关闭了熔断开关,则请求不会被降级,一些特殊场景可以动态配置该开关,默认为false。

withCircuitBreakerForceOpen

是否强制打开熔断开关,如果强制打开可熔断开关,则请求强制降级调用getFallback处理,可以通过动态配置来打开该开关实现一些特殊需求,默认为false。

withCircuitBreakerErrorThresholdPercentage

如果在一个采样时间窗口内,失败率超过该配置,则自动打开熔断开关实现降级处理,即快速失败。默认配置下采样周期为10s,失败率为50%。

withCircuitBreakerRequestVolumeThreshold

在熔断开关闭合情况下,在进行失败率判断之前,一个采样周期内必须进行至少N个请求才能进行采样统计,目的是有足够的采样使得失败率计算正确,默认为20。

withCircuitBreakerSleepWindowInMilliseconds

熔断后的重试时间窗口,且在该时间窗口内只允许一次重试。即在熔断开关打开后,在该时间窗口允许有一次重试,如果重试成功,则将重置Health采样统计并闭合熔断开关实现快速恢复,否则熔断开关还是打开状态,执行快速失败。熔断后将降级调用getFallback进行处理(fallbackEnabled=true),通过Command如下方法可以判断是否熔断了。

isCircuitBreakerOpen

熔断开关是否打开了,通过“circuitBreakerForceOpen().get()

(!circuitBreakerForceClosed().get() && circuitBreaker.isOpen())”判断。

isResponseShortCircuited

isCircuitBreakerOpen=true,且调用getFallback时返回true。

java 熔断_Hystrix进行熔断降级相关推荐

  1. java 熔断_Hystrix服务熔断

    ## 熔断原理 熔断器,页脚断路器,其英文单词为:Circuit Breaker. 熔断机制的原理很简单,像家里的电路熔断器,如果电路发生短路能立刻熔断电路,避免发生火灾.在分布式系统中应用这一模式之 ...

  2. Spring Cloud Alibaba 实战 | 第十二篇: 微服务整合Sentinel的流控、熔断降级,赋能拥有降级功能的Feign新技能熔断,实现熔断降级双剑合璧(JMeter模拟测试)

    文章目录 一. Sentinel概念 1. 什么是Sentinel? 2. Sentinel功能特性 3. Sentinel VS Hystrix 二. Docker部署Sentinel Dashbo ...

  3. 「微服务系列 13」熔断限流隔离降级

    我们知道微服务分布式依赖关系错综复杂,比方说前端的请求转化为后端调用的服务请求,一个前端请求会转为成很多个后端调用的服务请求,那么这个时候后台的服务出现不稳定或者延迟,如果没有好的限流熔断措施,可能会 ...

  4. 什么是服务熔断,什么是服务降级?

    什么是服务熔断? 熔断这一概念来源于电子工程中的断路器(Circuit Breaker).在互联网系统中,当下游服务因访问压力过大而响应变慢或失败,上游服务为了保护系统整体的可用性,可以暂时切断对下游 ...

  5. SpringCloud微服务的熔断机制和熔断的意义?

    什么是微服务的熔断机制 在2017年2月1日,GitLab公司的运维人员就出现过这样的事故.当时运维人员在进行数据库维护时,通过执行rm -rf命令,删除了约300GB生产环境数据.由于数据备份失效, ...

  6. 【服务熔断】服务熔断完整说明

    文章目录 1.创始人文档 2.熔断机制 3.原理总结 4.断路器打开之后 5.服务监控hystrixDashboard a.七色 b.一圈 c.一线 d.单个图说明 e.多个图说明 1.创始人文档 大 ...

  7. java熔断_Hystrix熔断机制原理剖析

    一.前言 在分布式系统架构中多个系统之间通常是通过远程RPC调用进行通信,也就是 A 系统调用 B 系统服务,B 系统调用 C 系统的服务.当尾部应用 C 发生故障而系统 B 没有服务降级时候可能会导 ...

  8. java服务降级与服务熔断区别_服务降级和服务熔断

    服务熔断 在微服务架构中,微服务之间的数据交互通过远程调用完成,微服务A调用微服务B和微服务C,微服务B和微服务C又调用其它的微服务,此时如果链路上某个微服务的调用响应时间过长或者不可用,那么对微服务 ...

  9. java 熔断机制_熔断机制及容错框架(Hystrix)的简单使用

    说道熔断大家肯定会想到最近美股连续的几次熔断,那么在系统中的熔断又是指什么呢? 熔断是一种系统保护机制.美股熔断是对股市极端情况下的一种保护.举个生活中的例子,比如保险器,当电流过大时保险器里面的保险 ...

最新文章

  1. vue 保存全局变量_Vue+Typescript起手式
  2. mysql子查询批量找id最大的
  3. 跳转路径时资源路径加/和不加/的区别
  4. boost::mp11::mp_transform_q相关用法的测试程序
  5. mono for android 使用Tab 控件
  6. vue项目中z-index不起作用(将vue实例挂在到window上面)
  7. Linux网络编程 | socket选项设定 及 网络信息API
  8. 从 C# 1.0 到 C# 9.0,历代 C# 语言特性一览
  9. php put怎么接收文件,php,restful_PHP PUT方式传文件的话,如何获取文件内容呢 ?,php,restful,http - phpStudy...
  10. 点击编辑按钮,前端table表格行内指定td可修改。(table是动态生成的)
  11. 强化学习算法TRPO之共轭梯度优化
  12. 已经更CSS《一篇文章让你从HTML零基础入门前端开发》12.22
  13. 给深度学习新手做项目的10个建议
  14. 夜神模拟器的安装和使用
  15. 如何查询某论文是否被EI/SCI检索
  16. JTS Geometry
  17. 论文笔记:DLWL: Improving Detection for Lowshot classes with Weakly Labelled data
  18. 详细介绍idea实现javaweb项目登入注册(华东交通大学教务处信息管理系统)、模糊查询...
  19. 【实施】项目实施工程中的确认事项
  20. 12306铁道部订票网站性能分析

热门文章

  1. 计算机 网络属性打不开,w10网络设置属性打不开怎么办_win10网络设置属性无法打开如何修复...
  2. 2022新款校园同学跑腿小程序源码+有安装教程
  3. CreatorPrimer | 物理小游戏(开篇)
  4. 目标检测YOLO实战应用案例100讲-小麦麦穗的目标检测与杂草分类识别研究
  5. cmu计算机系硕士项目,留学研究生热门专业计算机专业介绍
  6. 【Android TV 开发】-->Leanback 中的 HorizontalGridView
  7. java二维码编码生成并转换成流传入前端页面
  8. 请关闭该文件夹或文件,然后重试 怎么处理?
  9. 开源数据库的国际化思考与实践
  10. 用 cors 解决:Access to XMLHttpRequest at ‘http://localhost:5500/get‘ from blocked by CORS policy 等的跨域问题