SpringCloud微服务架构剖析(五)服务保护


微服务中的服务保护主要分为熔断、降级和限流三种方式。其中熔断和降级功能由Hystrix提供。

一、熔断和降级(Hystrix)

1.1 短路器的诞生

在微服务架构中,存在着许多的服务单元,若其中一个单元出现故障,就很容易以为依赖关系而引发故障的蔓延,最终导致整个系统瘫痪,这样的架构相较传统的架构更加不稳定,为了解决这样的问题,断路器等一系列的服务保护机制就产生了。

1.2 Hystrix介绍

Spring Cloud Hystrix实现了断路器、线程隔离等一系列服务保护功能。它是基于Netflix的开源框架Hystrix实现的,该框架的目标在于通过控制那些访问远程系统、服务和第三方库的节点,从而对延迟和故障提供更强大的容错能力,Hystrix具备服务降级、服务熔断、线程和信号量隔离、请求缓存、请求合并以及服务监控等强大功能。

1.3 Hystrix的工作流程

1.3.1 创建HystrixCommand或 HystrixObservableCommand

HystrixCommand:用在依赖的服务返回单个操作结果的时候
HystrixObservableCommand:用在依赖的服务返回多个操作结果的时候

  • 通过命令模式将来自客户端的请求封装成一个对象,从而让我们可以使用不同的请求对客户端进行参数化,它可以实现行为请求者和行为实现者之间的解耦。
1.3.2 执行命令

Hystrix在执行时会根据创建的Command对象以及具体的情况来选择一个命令模式执行方式来执行。

①其中 HystrixCommand实现了下面两个执行方式:
execute():同步执行,从依赖的服务返回一个单一的结果对象,或是在发生错误时抛出异常。
queue() :异步执行,直接返回一个Future对象,其中包含了服务执行结果时要返回的单一结果对象。
R value=command.execute();
Future< R > fValue=command.queue();

② 而HystrixObservableCommand实现了另外两种执行方式
observe():返回Observable对象,他代表了操作的对个结果,他是一个Hot Observable
toObservable():同样会返回Observable对象,也代表了操作的多个结果,但它返回的是一个Cold Observable。
Observable< R > ohValue=command.observe();
Observable< R >ocVALUE=command.toObservable()

1.3.3 结果是否被缓存

若当前命令的请求缓存是被启用的,并且该命令缓存命中,那么缓存的结果会立即以Observable对象的形式返回

1.3.4 断路器是否打开

在命令结果没有缓存命中的时候,Hystrix在执行前要检查断路器是否为打开状态。
①如果断路器是打开的,那么Hystrix不会执行命令,而是跳转到fallback处理逻辑(对应1.3.8)
②如果断路器是关闭的,那么Hystrix跳到1.3.5,检查是否有可用资源来执行命令。

1.3.5 线程池/请求队列/信号量是否占满

若线程池/请求队列/信号量已经占满(这里的线程池是每个依赖服务专有的线程池),那么Hystrix不会执行命令,而是跳转到fallback处理逻辑(对应1.3.8)

1.3.6 HystrixObservableCommand.construct()或者HystrixCommand.run()

Hystrix会根据我们编写的方法来决定采用什么样的方式去请求依赖服务。
HystrixCommand.run():返回一个单一的结果,或抛出异常
HystrixObservableCommand.construct():返回一个Observable对象来发射多个结果,或通过onError发送错误通知

若run()或.construct()方法执行时超过了命令设置的超时阈值,则会抛出TimoutException,这种情况下Hystrix会转接到fallbask处理逻辑(1.3.8)。

1.2.7 计算断路器的健康度

Hystrix会将“成功”、“失败”、“超时”、“拒绝”等信息报告给断路器,而断路器会维护一组数据来统计这些数据。
断路器会使用这些统计数据来决定是否要将断路器打开,来对某个依赖服务的请求进行“熔断/短路”,直到恢复期结束。若恢复期结束后,根据统计数据判断结果还是未达到健康指标,就再次“熔断/短路”。

1.2.8 fallback处理(服务降级)

当命令执行失败时,Hystrix就会进入fallback尝试回退处理,这个操作被称为“服务降级”。引起服务器降级的原因如下:
①在1.2.4中,当前命令处于“熔断/短路“状态,断路器打开的时候。
②在1.2.5中当前命令的线程池/请求队列或信号量被占满的时候。
③在1.2.6中执行HystrixObservableCommand.construct()或者HystrixCommand.run()抛出异常的时候

1.2.9返回成功的响应

对于Hystrix命令的响应总是Observable的形式来返回,但是它可以被转换成你需要的使用方式来进行命令调用。

2.服务限流(Sentinel)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值