GitHub地址:https://github.com/leebingbin/SpringCloud.MovieTicketing
Spring Cloud版——电影售票系统<四>使用Hystrix实现微服务的容错处理
截至在上篇博客《Spring Cloud版——电影售票系统<三>使用Feign实现声明式REST调用》为止,已用Eureka实现了微服务的注册与实现,Ribbon实现了客户端侧的负载均衡,Feign实现了声明式的API调用。那么如何使用Hystrix实现微服务的容错。
一、雪崩效应
微服务架构的应用系统通常包含多个服务层。微服务之间通过网络进行通信,从而支撑起整个应用系统。因此,微服务之间难免存在依赖关系(永远记住一句话:任何微服务都并非百分之百可用,而网络往往又是脆弱的,因此难免有些请求会失败)。假如,淘宝天猫网站在“双十一”发生了过载。过多的并发请求,导致用户支付的请求延迟很久都没有响应,在等待很长时间后最终失败。支付失败又导致用户重新刷新页面并再次尝试支付,那么进一步增加了服务器的负载,最终可能就会导致整个系统都崩溃了。
也就是说,雪崩效应描述的是提供者不可用导致消费者不可用,并将不可用逐渐放大的过程。即常把“基础服务故障”导致“级联故障”的现象称为雪崩效应。
二、如何容错
要想防止雪崩效应,必须有一个强大的容错机制。该容错机制需要实现以下两点:
1、为网络请求设置超时,让资源尽快释放;
2、使用断路器(熔断机制 )模式,断路器状态转化图如下:
断路器状态转化的逻辑,大致如下:
1)正常情况下,断路器关闭,可正常请求依赖的服务;
2)当一段时间内,请求失败率达到一定阈值(例如错误率达到50%,或100次/分钟等),断路器就会打开。此时,不会再去请求依赖的服务;
3)断路器打开一段时间后,会自动进入“半开”状态。此时,断路器可允许一个请求访问依赖的服务。如果该请求能够调用成功,则关闭断路器,否则继续保持打开状态。
综上,一般可以通过以上两点机制保护应用,从而防止雪崩效应并提升应用的可用性。
三、使用Hystrix实现容错
Hystrix是一个实现了超时机制和断路器模式的工具类库。Hystrix是由Netflix开源的一个延迟和容错库,用于隔离访问远程系统、服务或者第三方库,防止级联失败,从而提升系统的可用性与容错性。Hystrix主要通过以下几点实现延迟和容错:
* 包裹请求:使用HystrixCommand(或HystrixObservableCommand) 包裹对依赖的调用逻辑,每个命令在独立线程中执行。这使用到了设计模式中的“命令模式”。
* 跳闸机制:当某服务的错误率超过一定阈值时,Hystrix可以自动或者手动跳闸,停止请求该服务一段时间。
* 资源隔离:Hystrix为每个依赖都维护了一个小型的线程池(或者信号量)。如果该线程池已满,发往该依赖的请求就被立即拒绝,而不是排队等候,从而加速失败判定。
* 监控:Hystrix可以近乎实时地监控运行指标和配置的变化,例如成功、失败、超时、以及被拒绝的请求等。
* 回退机制:当请求失败、超时、被拒绝、或当断路器打开时,执行回退逻辑。回退逻辑可由开发人员自行提供,例如返回一个缺省值。
* 自我修复:断路器打开一段时间后,会自动进入“半开”状态。断路器打开、关闭、半开的逻辑转化。
本文为博主原创文章,转载请注明出处!
https://my.oschina.net/u/3375733/blog/