微服务中的雪崩效应
    image.png
    扇入:代表该微服务被调用的次数,扇入大,说明该模块复用性好
    扇出:该微服务调用其他微服务的个数,扇出大,说明业务逻辑复杂

    下游商品微服务响应时间过长,大量请求阻塞,大量线程不会释放,会导致服务器
    资源耗尽,最终导致上游服务甚至整个系统瘫痪。这就是雪崩效应

    服务雪崩的形成可以分为三个阶段:
    1.服务提供者不可用
    2.重试加大请求流量
    3.服务调用者不可用
    image.png
    微服务中解决雪崩效应的三种技术手段:
    服务熔断:
    当扇出链路的某个微服务不可用或者响应太长时间时,熔断该节点微服务的调用,进行服务的降级,快速返回错误的响应信息。当检测到该节点微服务调用正常后,回复调用链路。
    注意:
    服务熔断重点在“断”,即切断对下游服务的调用
    服务熔断和服务降级往往是一起使用的,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的高级应用
    image.png**
    1.当调用出现问题时,开启一个时间窗口
    2.在这个时间窗内,统计调用次数是否达到最小请求数?
    如果没有达到,则重置统计信息,回到第一步
    如果达到,则统计失败的请求数占所有请求的百分比,是否达到阈值?
    如果达到,则跳闸(不再请求对应服务)
    如果没有达到,则重置统计信息,回到第一步
    3.如果跳闸,则会开启一个活动窗口(默认5s),每隔5s,Hystrix会让一个请求通过,到达那个问题服务,看是否调用成功,如果成功,重置断路器回到第一步,如果失败,回到第三步
    配置在yml文件里

    1. # 配置熔断策略:
    2. hystrix:
    3. command:
    4. default:
    5. circuitBreaker:
    6. # 强制打开熔断器,如果该属性设置为true,强制断路器进入打开状态,将会拒绝所有的请求。 默认false关闭的
    7. forceOpen: false
    8. # 触发熔断错误比例阈值,默认值50%
    9. errorThresholdPercentage: 50
    10. # 熔断后休眠时长,默认值5秒
    11. sleepWindowInMilliseconds: 3000 # 熔断触发最小请求次数,默认值是20
    12. requestVolumeThreshold: 2
    13. execution:
    14. isolation:
    15. thread: # 熔断超时设置,默认为1秒
    16. timeoutInMilliseconds: 2000

    基于springboot的健康检查观察跳闸状态(自动投递微服务暴露健康检查细节)

    1. # springboot中暴露健康检查等断点接口
    2. management:
    3. endpoints:
    4. web:
    5. exposure:
    6. include: "*" # 暴露健康接口的细节
    7. endpoint:
    8. health:
    9. show-details: always