在一个电商网站中,我们可能会将系统拆分成用户、订单、库存、积分.评论等一系列服务模块。用户创建一个订单的时候,客户端将调用订单服务的创建订单接口,此时创建订单接口又会向库存服务来请求出货(判断是否有足够库存来出货)。此时若库存服务因自身处理逻辑等原因造成响应缓慢,会直接导致创建订单服务的线程被挂起,以等待库存服务的响应,在漫长的等待之后用户会因为请求库存失败而得到创建订单失败的结果。如果在高并发情况之下,因这些挂起的线程在等待库存服务的响应而未能释放,使得后续到来的创建订单请求被阻塞,最终导致订单服务也不可用。在微服务架构中,如果一个服务出现故障,就很容易因依赖关系而引发故障的蔓延,最终导致整个系统的瘫痪,即引起雪崩效应
常见雪崩效应原因:
- 硬件故障:如服务器宕机,机房断电,光纤被挖断等。
- 流量激增:如异常流量,重试加大流量等。
- 缓存穿透:一般发生在应用重启,所有缓存失效时,以及短时间内大量缓存失效时。大量的缓存不命中,使请求直击后端服务,造成服务提供者超负荷运行,引起服务不可用。
- 程序BUG: 如程序逻辑导致内存泄漏,JVM长时间FullGC等。
- 同步等待: 服务间采用同步调用模式,同步等待造成的资源耗尽。
Hystrix设计原则:
- 防止任何单独依赖项耗尽所有资源 (例如用户线程)
- 过载立即切断并快速失败,防止排队
- 在可行的情况下提供备用,以保护用户免受故障的影响
- 使用隔离技术(例如隔板,泳道和断路器模式)来限制任何一种依赖关系的影响。
- 通过近实时指标,监控和警报确保故障被及时发现
- 通过在Hvstrix的大多数方面中以低延迟传播配置的更改来优化恢复时间,并支持动态属性配置,这使您可以通过低延迟反馈回路进行实时操作修改。
- 防止整个依赖客户端执行失败,而不仅仅是网络通信失败。
Hystrix原理:
- 将对外部系统 (或“依赖项”)的所有调用包装在通常在单独线程中执行的HystrixCommand或HystrixObservableCommand对象中 (这使用了命令模式)
- 超时呼叫: 超过您定义的闻值的调用。有一个默认值,但是对于大多数依赖项,您可以通过“属性”自定义设置这些超时,以便它们略高于每个依赖项的99.5%的性能。
- 为每个依赖项维护一个小的线程池 (或信号灯);如果已满,发往该依赖项的请求将立即被拒绝,而不是排队。
- 记录请求成功,失败 (客户端抛出异常),超时和线程拒绝。。
- 如果某个服务的错误百分比超过闯值,则使断路器跳闸,以在一段时间内手动或自动停止所有对特定服务的请求。
- 当请求失败,被拒绝,超时或短路时执行回退 (服务降级) 逻辑
- 几乎实时监控指标和配置更改。
Hystrix在Fegin中的使用(也可以在Ribbon中使用):
1.Feign在整合到Spring Cloud时已经自带了hystrix模块,所以不需要额外的依赖和配置;
2.在yml中开启Fegin的容错功能
3.定义FallBack的降级处理(实现之前定义服务调用的Fegin接口)例如:
4.在服务调用定义接口Fegin上添加FallBack,例如:
5.修改业务逻辑,当降级之后进行返回处理
Hystrix Dashboard调用监控:
在微服务调用的时候Hystrix 可以实现服务的调用状况监控,这样我们可以知道调用服务成功的、失败的、超时的、出现错误等情况,默认的Hvstrix监控信息非常的不耐看,所以这里我们使用Dashboard进行查看调用情况;
1.在服务的提供者上添加hystrix和actuator依赖:
2.开启熔断器并在类上添加相应注解
3.注入监控对象
@Bean
public ServletRegistrationBean getServlet(){
ServletRegistrationBean registrationBean = new ServletRegistrationBean(new HystrixMetricsStreamServlet());
registrationBean.setLoadOnStartup(1);
registrationBean.addUrlMappings("/actuator/hystrix.stream");
registrationBean.setName("HystrixMetricsStreamServlet");
return registrationBean;
}
4.测试
以上很明显直接查看hystrix监控信息,我们很难看懂信息描述,所以我们搭建下dashboard查看监控; 因为以后每个服务都需要监控,所有我们创建一个新的Hystrix模块
5.新建module“hystrix”,并配置dashboard信息,查看监控信息
实心圆的颜色的变化代表了实例的健康程度,它的健康程度从 绿色>黄色>橙色>红色 递减该
实心圆除了颜色的变化之外,它的大小也会根据实例的请求流量发生变化,流量越大实心圆就越大,所以通过该实心圆的展示,就可以在大量实例中快速的发现故障实例和高压力实例。