Hystrix使用

使用Hystrix实现熔断

要实现熔断,首先需要在请求调用方pom文件中加入

        <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-hystrix</artifactId></dependency>

在启动类上加入@EnableCircuitBreaker注解,并在调用到另一个微服务的方法上加入一些配置

 @GetMapping("/checkHystrix/{userId}")@HystrixCommand(threadPoolKey = "checkHystrix1",threadPoolProperties = {@HystrixProperty(name = "coreSize",value = "1"),@HystrixProperty(name = "maxQueueSize",value = "20")},commandProperties = {@HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds",value="2000")})public Integer checkHystrix(@PathVariable Long userId) {String url = "http://zhao-service-resume/resume/openstate/"+userId;Integer forObject =restTemplate.getForObject(url, Integer.class);return forObject;}

将调用到的服务中加入线程休眠十秒。访问上述服务,在界面上即可发现Hystrix的超时错误

服务降级

在配置中再增加一个 fallbackMethod = "customeFallback", 配置降级兜底方法的具体形式是

    public  Integer customeFallback(Long userId){return -1;}

当某个服务熔断之后,服务器将不再被调⽤,此刻客户端可以⾃⼰准备⼀个本地的fallback回调,返回⼀个缺省值,这样做,虽然服务⽔平下降,但好⽍可⽤,⽐直接挂掉要强。但是在配置服务降级策略时,降级(兜底)⽅法必须和被降级⽅法相同的⽅法签名(相同参数列表、相同返回值) 如果参数不同会出现com.netflix.hystrix.contrib.javanica.exception.FallbackDefinitionException: fallback method wasn't found: customeFallback([class java.lang.Long]) 如果返回值不同会出现。且包装类和基本类型不能共用 Hint: Fallback method 'public int com.zp.controller.AutoDeliverController.customeFallback(java.lang.Long)' must return: class java.lang.Integer or its subclass

仓壁模式(线程池隔离模式)

如果不进⾏任何线程池设置,所有熔断⽅法使⽤⼀个Hystrix线程池(默认为10个线程),那么这样的话会导致问题,这个问题并不是扇出链路微服务不可⽤导致的,⽽是我们的线程机制导致的,如果⽅法A的请求把10个线程都⽤了,⽅法2请求处理的时候压根都、没法去访问B,因为没有线程可⽤,并不是B服务不可⽤。因此在配置Hystrix线程时,多个方法应该写多个线程池。这样能够让线程之间互不影响

  @GetMapping("/checkHystrix/{userId}")@HystrixCommand(threadPoolKey = "checkHystrix1",threadPoolProperties = {@HystrixProperty(name = "coreSize",value = "1"),@HystrixProperty(name = "maxQueueSize",value = "20")},commandProperties = {@HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds",value="2000")})public Integer checkHystrix(@PathVariable Long userId) {String url = "http://zhao-service-resume/resume/openstate/"+userId;Integer forObject =restTemplate.getForObject(url, Integer.class);return forObject;}@GetMapping("/checkHystrixFallback/{userId}")@HystrixCommand(threadPoolKey = "checkHystrix2",threadPoolProperties = {@HystrixProperty(name = "coreSize",value = "2"),@HystrixProperty(name = "maxQueueSize",value = "20")},commandProperties = {@HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds",value="2000")},fallbackMethod = "customeFallback")

通过postman发送批量请求,并通过jstack命令可以看到两个方法的线程池进行了隔离

其他属性的含义

            commandProperties = {@HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds",value="2000"),@HystrixProperty(name = "metrics.rollingStats.timeInMilliseconds",value = "8000"),@HystrixProperty(name = "circuitBreaker.requestVolumeThreshold",value = "2"),@HystrixProperty(name = "circuitBreaker.errorThresholdPercentage",value="50"),@HystrixProperty(name = "circuitBreaker.sleepWindowInMilliseconds",value="3000")}

metrics.rollingStats.timeInMilliseconds该属性是下面的熔断的统计时间窗口定义 circuitBreaker.requestVolumeThreshold该属性统计时间窗⼝内的失败的次数,达到此次数之后开启熔断操作 circuitBreaker.errorThresholdPercentage 窗口内失败的次数的百分比,达到这个百分比之后开启熔断操作 circuitBreaker.sleepWindowInMilliseconds 熔断多久间隔多久以后开始尝试是否恢复

源码简要分析

首先我们根据注解类@EnableCircuitBreaker可以找到SpringFactoryImportSelector类,该类通过泛型在spring.factories文件中找到注解了该泛型的配置类

@Overridepublic String[] selectImports(AnnotationMetadata metadata) {if (!isEnabled()) {return new String[0];}AnnotationAttributes attributes = AnnotationAttributes.fromMap(metadata.getAnnotationAttributes(this.annotationClass.getName(), true));Assert.notNull(attributes, "No " + getSimpleName() + " attributes found. Is "+ metadata.getClassName() + " annotated with @" + getSimpleName() + "?");// Find all possible auto configuration classes, filtering duplicatesList<String> factories = new ArrayList<>(new LinkedHashSet<>(SpringFactoriesLoader.loadFactoryNames(this.annotationClass, this.beanClassLoader)));if (factories.isEmpty() && !hasDefaultFactory()) {throw new IllegalStateException("Annotation @" + getSimpleName()+ " found, but there are no implementations. Did you forget to include a starter?");}if (factories.size() > 1) {// there should only ever be one DiscoveryClient, but there might be more than// one factorylog.warn("More than one implementation " + "of @" + getSimpleName()+ " (now relying on @Conditionals to pick one): " + factories);}return factories.toArray(new String[factories.size()]);}

随后在spring.factories中找到了加载的配置类

org.springframework.cloud.client.circuitbreaker.EnableCircuitBreaker=\
org.springframework.cloud.netflix.hystrix.HystrixCircuitBreakerConfiguration

配置类中配置了一个切面HystrixCommandAspect,Hystrix实现的主要功能都在这个切面中进行了执行

    public Object methodsAnnotatedWithHystrixCommand(final ProceedingJoinPoint joinPoint) throws Throwable {Method method = getMethodFromTarget(joinPoint);Validate.notNull(method, "failed to get method from joinPoint: %s", joinPoint);if (method.isAnnotationPresent(HystrixCommand.class) && method.isAnnotationPresent(HystrixCollapser.class)) {throw new IllegalStateException("method cannot be annotated with HystrixCommand and HystrixCollapser " +"annotations at the same time");}MetaHolderFactory metaHolderFactory = META_HOLDER_FACTORY_MAP.get(HystrixPointcutType.of(method));MetaHolder metaHolder = metaHolderFactory.create(joinPoint);HystrixInvokable invokable = HystrixCommandFactory.getInstance().create(metaHolder);ExecutionType executionType = metaHolder.isCollapserAnnotationPresent() ?metaHolder.getCollapserExecutionType() : metaHolder.getExecutionType();Object result;try {if (!metaHolder.isObservable()) {result = CommandExecutor.execute(invokable, executionType, metaHolder);} else {result = executeObservable(invokable, executionType, metaHolder);}} catch (HystrixBadRequestException e) {throw e.getCause();} catch (HystrixRuntimeException e) {throw hystrixRuntimeExceptionToThrowable(metaHolder, e);}return result;}

使用同步调用会走executeObservable最终进入HystrixCommand进入最终的处理逻辑

    public R execute() {try {return queue().get();} catch (Exception e) {throw Exceptions.sneakyThrow(decomposeException(e));}}

进入执行队列并异步获取 最后执行 final Futuredelegate = toObservable().toBlocking().toFuture();具体Hystrix中的熔断降级操作即在toObservable()完成

欢迎搜索关注本人的公众号【微瞰技术】,以及总结的分类面试题https://github.com/zhendiao/JavaInterview

Hystrix使用分析相关推荐

  1. Hystrix流程分析及断路器工作原理

    上一篇转载的文章主要讲了Hystrix的应用场景.基础组件概念以及从源码的角度阐述了基本应用.本篇文章主要借鉴官方文档介绍Hystrix的工作流程及断路器的原理,最后说一下与SpringCloud的简 ...

  2. Hystrix 使用

    Hystrix是Netflix开源的一款容错系统,能帮助使用者码出具备强大的容错能力和鲁棒性的程序.如果某程序或class要使用Hystrix,只需简单继承HystrixCommand/Hystrix ...

  3. 一文理解微服务架构下的系统可用性如何保证?

    从2005年Peter Rodgers博士提出微web服务,到2014年ThoughtWorks首席科学家Martin Fowler与James Lewis共同提出微服务概念至今已多年,这期间也是互联 ...

  4. spring cloud 服务发现时效配置(服务发现慢优化)

    相信很多人都会感觉到,springcloud服务发现很慢,特别是使用feign client作为通讯工具的时候,明明服务已经启动了,还要等30-90s左右才能被正常调用到.这个等待有点长! 这件事情也 ...

  5. 从源码分析Hystrix工作机制

    作者:vivo互联网服务器团队-Pu Shuai 一.Hystrix解决了什么问题? 在复杂的分布式应用中有着许多的依赖,各个依赖都难免会在某个时刻失败,如果应用不隔离各个依赖,降低外部的风险,那容易 ...

  6. Hystrix使用与分析

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

  7. 一 springcloud hystrix源码深度分析

    spring cloud hystrix原理 每周会定时更新spring cloud hystrix 对netflix公司的产品封装实现原理,在这里,你会学到实实际际的干货,如果文中有不正确的地方,还 ...

  8. Hystrix入门与分析(一):初识Hystrix

    在以前的文章中,我们介绍过使用Gauva实现限流的功能,现在我们来了解一下如何在服务框架中实现熔断和降级的方法. 简介Hystrix 大型系统架构的演进基本上都是这样一个方向:从单体应用到分布式架构. ...

  9. java断路器原理_Netflix Hystrix断路器原理分析

    断路器原理 断路器在HystrixCommand和HystrixObservableCommand执行过程中起到至关重要的作用.查看一下核心组件HystrixCircuitBreaker packag ...

  10. 用 Hystrix 构建高可用服务架构

    1 hystrix是什么 在分布式系统中,每个服务都可能会调用很多其他服务,被调用的那些服务就是依赖服务,有的时候某些依赖服务出现故障也是很正常的. Hystrix 可以让我们在分布式系统中对服务间的 ...

最新文章

  1. c# 小票打印机打条形码_C#打印小票自带条形码打印
  2. paddle深度学习框架中的FFT
  3. openresty开发系列36--openresty执行流程之6日志模块处理阶段
  4. python多级索引修改
  5. 如何进行基于Anolis OS的企业级Java应用规模化实践?|龙蜥技术
  6. vs设计窗口不见了_碳纤维的巅峰:VS沛纳海616V3
  7. 第44课 角谷猜想 动动脑 第3题 完善程序
  8. 19.内在摄像机校准——内联函数 测验,结合外在和内在校准参数,编写相同方程的其他方法,相机参数_2
  9. oracle查询结果展示,ORACLE构造查询日期展示结果
  10. webgis之相关工具
  11. 从斐波那契数列讲解算法设计的思路
  12. 移动魔百和系统升级服务器地址,【当贝市场】移动魔百盒升级后无法观看视频怎么办...
  13. 单例模式(java代码实现)
  14. 趣味python编程之经典俄罗斯方块
  15. 解决 Windows 商店 0x800704cf 网络问题
  16. ADAS自动驾驶辅助系统通讯协议「ADASIS Protocol」接口定义解析(二)详细
  17. Dynamics 365——设置视图可编辑
  18. 说说共享纸巾的那些事
  19. 详解border-radius属性
  20. HBase系列(一):HBase表结构及数据模型的理解

热门文章

  1. 中英文说明书丨CalBioreagents ACTH抗原抗体对
  2. RocketMQ 延迟消息(定时消息)4.9.3 版本优化 异步投递支持
  3. 移动端h5 下拉框 demo (原生的也太丑了把)
  4. AndroidStudio实现按钮按下时状态改变以及选择器属性及基本用法
  5. 西游记中的第一神器是什么?
  6. 网易微专业高级前端开发工程师2022
  7. 【Endnote X9服务器运行失败】
  8. VMware虚拟机中Windows11无法连接网络
  9. python基础:Python MySQL
  10. 换新电脑后怎么重装系统win7,win7安装教程