微服务中的雪崩效应
扇入:代表该微服务被调用的次数,扇入大,说明该模块复用性好
扇出:该微服务调用其他微服务的个数,扇出大,说明业务逻辑复杂
下游商品微服务响应时间过长,大量请求阻塞,大量线程不会释放,会导致服务器
资源耗尽,最终导致上游服务甚至整个系统瘫痪。这就是雪崩效应
服务雪崩的形成可以分为三个阶段:
1.服务提供者不可用
2.重试加大请求流量
3.服务调用者不可用
微服务中解决雪崩效应的三种技术手段:
服务熔断:
当扇出链路的某个微服务不可用或者响应太长时间时,熔断该节点微服务的调用,进行服务的降级,快速返回错误的响应信息。当检测到该节点微服务调用正常后,回复调用链路。
注意:
服务熔断重点在“断”,即切断对下游服务的调用
服务熔断和服务降级往往是一起使用的,Hystrix就是这样
服务降级:
就是整体资源不够用了,先将一些不关紧的服务停掉(调用我的时候,给你返回一个预留的值,也叫**兜底数据**),等度过难关高峰过去,在把那些服务打开。
服务降级一般是从整体考虑,就是当某个服务熔断之后,服务器将不再会调用,此刻客服端可以自己准备一个本地的fallback回调,在返回一个缺省值,这样做,虽然服务水平下降,但是好歹可用,比直接挂掉强。
服务限流:
有些场景不可以用服务降级,比如秒杀业务的核心功能,这个时候可以用服务限流
1.限制并发数(比如数据库连接池、线程池)
2.限制瞬时并发数(如nginx限制瞬时并发数)
3.限制时间窗口内的平均速率(如Guava的RateLimiter、nginx的limit_req模块,限制每秒的平均速率)
4.限制远程接口调用速率,限制MQ的消费速率等
Hystrix主要通过以下几点实现延迟和容错
包裹请求:使用HystrixCommand包裹对依赖的调用逻辑(@HystrixCommand添加Hystrix控制)
跳闸机制:当某服务的错误率超过一定的阈值时,Hystrix可以跳闸,停止请求该服务一段时间
资源隔离:Hystrix为每个依赖都维护了一个小型的线程池(舱壁模式)。如果该线程池已满,发往该依赖的请求就立即被拦截,而不是排队等待,从而加速失败判定
监控:Hystrix可以近乎实时地监控运行指标和配置的变化,例如成功、失败、超时、以及被拒绝的请求等
回退机制:当请求失败、超时、被拒绝或者当断路器打开时,执行回退逻辑。回退逻辑由开发人员自行提供,例如返回一个缺省值。
自我修复:**断路器打开一段时间后,会进入“半开”状态(探测服务是否可用,如还是不可用,再次回退打开状态)
Hystrix舱壁模式(线程隔离策略)
如果不进行任何设置,所有熔断方法使用一个Hystrix线程池(10个),那么这样会导致问题,不是扇出链路微服务不可用导致的,而是我们的线程机制导致的,如果方法A的请求把10个线程都调用了,方法B的请求都没法访问,因为没有线程可用了,并不是服务不可用
为了避免问题服务请求过多导致正常服务无法访问,Hystrix 不是采用增加线程数,而是单独的为每一个控制方法创建一个线程池的方式,这种模式叫做“舱壁模式”,也是线程隔离的手段。
Hystrix的高级应用
**
1.当调用出现问题时,开启一个时间窗口
2.在这个时间窗内,统计调用次数是否达到最小请求数?
如果没有达到,则重置统计信息,回到第一步
如果达到,则统计失败的请求数占所有请求的百分比,是否达到阈值?
如果达到,则跳闸(不再请求对应服务)
如果没有达到,则重置统计信息,回到第一步
3.如果跳闸,则会开启一个活动窗口(默认5s),每隔5s,Hystrix会让一个请求通过,到达那个问题服务,看是否调用成功,如果成功,重置断路器回到第一步,如果失败,回到第三步
配置在yml文件里
# 配置熔断策略:
hystrix:
command:
default:
circuitBreaker:
# 强制打开熔断器,如果该属性设置为true,强制断路器进入打开状态,将会拒绝所有的请求。 默认false关闭的
forceOpen: false
# 触发熔断错误比例阈值,默认值50%
errorThresholdPercentage: 50
# 熔断后休眠时长,默认值5秒
sleepWindowInMilliseconds: 3000 # 熔断触发最小请求次数,默认值是20
requestVolumeThreshold: 2
execution:
isolation:
thread: # 熔断超时设置,默认为1秒
timeoutInMilliseconds: 2000
基于springboot的健康检查观察跳闸状态(自动投递微服务暴露健康检查细节)
# springboot中暴露健康检查等断点接口
management:
endpoints:
web:
exposure:
include: "*" # 暴露健康接口的细节
endpoint:
health:
show-details: always