上一篇文章提到我们最近开了个新项目,目的是将新的业务放到新项目中,老项目单独维护,再逐步迁移老项目到新项目里。但就在前端时间生产环境发生了一个事故,事故开始的异常是我们的业务发现前端h5页面办理很慢,这台服务器跑了三个省的办理业务,同事在寻找问题的时候一口老血差点吐出来,所有的项目日志打在一个文件里,里面乱的程度无法用语言形容,因为太忙了的原因,这个事情被安了一个网络不好的头衔不了了之了,但是最气的是周五晚上下班后越来越多的业务反应,大家没有带装备,只能在群里猜测分析各种原因,不得已周六大家来到公司寻找这个问题,看了近几天的日志发现是项目里一个统计的接口被频繁调用导致我们的cpu跟内存跑满了,抛开程序效率问题与sql效率的问题,发现是同一个ip一直在请求我们,一天刷了8万多请求,这就不继续吐槽了。程序完全没有做任何容错措施,先不说限流,就对于接口调用超时的情况我们就可以用到我们要说的hystrix。他的代码托管在github上:

  来自:https://github.com/Netflix/Hystrix/wiki

  简单的说他可以帮我们完成程序在出错或者延迟的情况下对程序熔断降级,假设我们老项目有这种机制,我们内存跟cpu跑满的情况下,我就可以熔断,将主逻辑降级,由我们辅逻辑来快速返回前端,这样c端用户体验感就没有那么差,我们也不会那么狼狈的去找问题。springcloud已经帮我们集成好了,我们只需要添加少量的注解跟配置就可以使用了。

  一、使用

  上一片文章最后我们用feign搭建好了一个项目,在pom文件添加配置:

  

  改造之前写过的controller:

  

  我们发送20个请求,等前15个发送完成我们休息6秒,前15个请求我们演示熔断器打开并降级的过程,后5个演示当服务端恢复正常的熔断器关闭的情况:

  继续改造service,feign集成了hystrix,hystrix使用是通过方法来完成降级逻辑的,使用feign是通过接口的方式调用的,所以使用起来需要在

@FeignClient注解添加参数:
  
  fallback标注了降级方法的类,创建降级类
  
  配置文件添加配置
  feign集成hystrix在spring cloud早期的版本是默认开启的,如果使用了feign就默认开启了断路器,所以后来的版本断路器功能就默认关闭,
下面介绍几个重要的参数配置:
  1.hystrix.command.default.circuitBreaker.requestVolumeThreshold:用来设置快照时间窗内的请求下线,默认为20,在一个快照
时间窗内的收到请求没有达到这个数量即使都失败也不会触发熔断
  2.hystrix.command.default.circuitBreaker.sleepWindowInMilliseconds:用来是设置断路器半开状态的时间(断路器在半开状态
允许发送一条请求,如果请求成功断路器关闭,失败则继续断开等待下一次半开状态)默认5000毫秒
  3.hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds:用来设置请求超时时间
  4.hystrix.command.default.circuitBreaker.errorThresholdPercentage:用来设置错误率,默认值50,在一个快照时间窗内超过了
请求下线,失败率超过50%,断路器打开
  上面写的配置为全局默认的配置,配置的优先级从低到高分别是:全局默认配值,全局属性配置,实例默认值,实例配置属性,列举一个隔离策略配置

  实例属性配置需要将default改成你的就可以了,除此之外还有很多配置,分享一个链接:https://www.cnblogs.com/520playboy/p/8074347.html,spring cloud微服务实战这本书里有更详细的配置详解  
   ribbon.OkToRetryOnAllOperations:对所有操作请求都进行重试
  ribbon.MaxAutoRetriesNextServer:切换实例的重试次数
  ribbon.MaxAutoRetries:对当前实例的重试次数
  除了上面的配置我们还需要添加一个配置,目的是关闭feign的重试机制,原因是不想让接口超时触发重试机制。feign是通过整合ribbon来完成负载均衡,默认重试测试时5次,可以看feign包下的Retryer类,里面
的default方法。继续,我们修改上篇文章的服务提供者的方法:

  代码完成:我们来访问接口:http://localhost:8886/add
  客户端控制台:
  
  服务端控制台:
  
  通过两端的打印信息可以看出来前总共调用20次,15次调用后等待了6秒继续调用五次,服务端收到请求15次从入参能看出来第11次到第15次没有请求到服务端,这个过程就演示了熔断器的整个过程,我们通过配置文件
设置请求下限为10,而服务端的前10次请求都会调用超时,所以客户端前10次请求都会触发降级方法,最终熔断,使得我们的请求快速返回,第16到第20次的时候由于线程休息了6秒,此时断路器的半开时间早已经达到,所
以第16次请求的时候hystrix会放行一个请求,发现没有超时,熔断器关闭,后面的16-20请求就反会正常结果,程序又切回主逻辑。
  演示一下ribbon使用hystrix,使用上一篇文章创建的项目,添加pom文件,创建一个service把逻辑放到service中:
  
  
  在需要熔断的方法添加@HystrixCommand注解,标注降级方法,修改controller方法,访问:http://localhost:8884/add
  
  二、工作流程
  通过上面的例子我们简单分析一下hystrix流程,我们先引用一张HystrixCircuitBreaker官方的流程图:
  

   第一步:HystrixCommand调用allowRequest方法判断请求是否允许通过,如果熔断器强制打开不允许放行,如果熔断器强制关闭允许放行,circuitBreaker.forceOpen配置优先级比circuitBreaker.forceClosed优先级高

  第二步:调用isopen方法判断熔断器是否打开,如果打开则判断circuitBreaker.sleepWindowInMilliseconds进入半开模式的时间,如果距离上一次打开时间超过设置时间,将进入半开模式,放行一个请求,走第一步

  第三步:熔断器未打开,判断一个请求窗内的请求下线circuitBreaker.requestVolumeThreshold,小于放行,否则判断一个时间窗内的错误率小于circuitBreaker.errorThresholdPercentage,则放行,大于则打开熔断器,走第二部

  三、浅谈源码
  我们从feign包下找到HystrixFeign类,里面有几个方法,第一个创建HystrixInvocationHandler:

  第二个方法初始化HystrixCommand的setterFactory工厂

  

  HystrixInvocationHandler类里调用invoke(太长就不截图了)方法重写了降级方法,通过代理模式将hystrix包装feign。通过toSetters方法给方法设置配置项

  setterFactory里通过create方法生成配置项

  

  groupKey是接口名称,还有一个commandKey,继续往下:

  

  通过接口名跟方法名属性名拼接生成commandKey,文章上面写到几个属性的配置以hystrix.command.default.circuitBreaker.requestVolumeThreshold为例,我们这样配置是设置了全局默认属性配置,通过上面的分析我们可以改成这样配置hystrix.command.AddService.circuitBreaker.requestVolumeThreshold,这就是上面提到的事例默认值配置,对应我们刚刚写的类:

  

  我们再来看看hystrix的配置类HystrixCommandProperties,它包含了大量配:

  通过片段能看出来传入一个前缀,然后拼接key加上后面的字符串然后为属性赋值,这个key就是我们前面讲到的configKey,没有配置采用默认key。

  文章前端时间就写了,由于来了一个比较急的工作,忙的连着几个通宵所以一直没有发布,写的时候也有遗漏,还请大家多多指教。

springcloud使用之断路器hystrix的更多相关文章

  1. 「 从0到1学习微服务SpringCloud 」13 断路器Hystrix

    背景与功能 在微服务架构中,很多情况下,各个服务之间是相互依赖,一个服务可能会调用了好几个其他服务,假设其中有一个服务故障,便会产生级联故障,最终导致整个系统崩溃无法使用(这称为雪崩效应),Sprin ...

  2. SpringCloud学习系列之三----- 断路器(Hystrix)和断路器监控(Dashboard)

    前言 本篇主要介绍的是SpringCloud中的断路器(Hystrix)和断路器指标看板(Dashboard)的相关使用知识. SpringCloud Hystrix Hystrix 介绍 Netfl ...

  3. SpringCloud IDEA 教学 (四) 断路器(Hystrix)

    写在开始 在SpringCloud项目中,服务之间相互调用(RPC Remote Procedure Call —远程过程调用),处于调用链路底层的服务产生不可用情况时,请求会产生堆积使得服务器线程阻 ...

  4. SpringCloud断路器(Hystrix)和服务降级案列

    断路器(Hystrix) 为什么需要 Hystrix? 在微服务架构中,我们将业务拆分成一个个的服务,服务与服务之间可以相互调用(RPC).为了保证其高可用,单个服务又必须集群部署.由于网络原因或者自 ...

  5. springcloud费话之断路器(hystrix in feign)

    目录: springcloud费话之Eureka基础 springcloud费话之Eureka集群 springcloud费话之Eureka服务访问(restTemplate) springcloud ...

  6. SpringCloud笔记六:Hystrix

    目录 Hystrix是什么? Hystrix服务熔断 新建Hystrix项目 修改yml Maven的pom.xml添加hystrix引用 修改Controller Hystrix服务降级 修改api ...

  7. 【Spring Cloud笔记】 断路器-hystrix

    在微服务架构中,一个微服务的超时失败可能导致瀑布式连锁反映,Spring Cloud Netflix 的断路器Hystrix通过自主反馈,防止了这种情况发生.下面介绍简单的断路器使用方法. [step ...

  8. spring cloud学习(五)断路器 Hystrix

    断路器 Hystrix 断路器模式 (云计算设计模式) 断路器模式源于Martin Fowler的Circuit Breaker一文. 在分布式环境中,其中的应用程序执行访问远程资源和服务的操作,有可 ...

  9. 004声明式服务调用Feign & 断路器Hystrix

    1.POM配置 和普通Spring Boot工程相比,添加了Eureka Client.Feign.Hystrix依赖和Spring Cloud依赖管理 <dependencies> &l ...

随机推荐

  1. 使用overnightjs typescript 注解开发expressjs 应用

    overnightjs 提供了基于注解的expressjs应用开发,包含了比较全的express 开发支持,使用简单,以下是一个简单的试用 项目准备 项目使用pkg 进行了打包处理 初始化 yarn ...

  2. artillery强大灵活的负载测试套件

    artillery是基于nodejs 编写的负载测试套件支持http&&socket.io&&websockets&&kinesis&& ...

  3. 5.学习springmvc响应json数据

    一.配置不过滤静态资源文件:用来访问webapp中js,css,images文件 1.修改springmvc.xml <!--配置前端控制器,用于设置哪些资源不拦截--> <mvc: ...

  4. vue中computed和watch的区别,以及适用场景

    computed:通过属性计算而得来的属性 1.computed内部的函数在调用时不加(). 2.computed是依赖vm中data的属性变化而变化的,也就是说,当data中的属性发生改变的时候,当 ...

  5. bzoj1176: [Balkan2007]Mokia cdq

    链接 bzoj 思路 cdq入门题,拆成4个矩阵,然后cdq. 代码 /************************************************************** P ...

  6. 5098: [BZOJ1098][POI2007]办公楼biu

    5098: [BZOJ1098][POI2007]办公楼biu 没有数据结构就很棒 一个看上去非常玄学的代码 const int N=1e5+10,M=2e6+10; int n,m; int fa[ ...

  7. 对IT战略的认识

    提到战略,我不由想起了战术这个名词.按照我的理解,战术属于短期内的计划,是战略的组成部分,是实施次战略的短期工作计划或行动步骤:而战略是用来帮助我们赢取目标的行动计划(例如为获得更多的潜在客户而制定的 ...

  8. 个人收集的Android开源项目

    1. KnowWeather 下载:GitHub 一款 Android 开源天气 App ,包含天气信息.详情.生活指数等,通知栏,桌面小部件,定时更新天气等等,应用没有任何广告,支持县级.区级城市的 ...

  9. 移除 WordPress 自动加载的 jQuery,使用自定义 jQuery 版本

    WordPress 使用的 jQuery 版本由于需要考虑到很多安全稳定的因素,所以一般不会使用最新版本的 jQuery, 可以通过以下方式移除 WordPress 自定加载的 jQuery,并加载自 ...

  10. WebRTC搭建前端视频聊天室——信令篇

    这篇文章讲述了WebRTC中所涉及的信令交换以及聊天室中的信令交换,主要内容来自WebRTC in the real world: STUN, TURN and signaling,我在这里提取出的一 ...