微服务学习笔记8

32 阅读3分钟

Netflix Ribbon

实现负载均衡的两个主要方式,即服务器端负载均衡和客户端负载均衡。Spring Cloud Netflix Ribbon就是一个基于HTTP和TCP协议的客户端负载均衡工具,基于Netflix Ribbon实现。

Ribbon提供了常用的几种负载均衡策略,包括RoundRobinRule、RandomRule这样不依赖于服务器运行状况的静态策略,也有AvailabilityFilteringRule、WeightedResponseTimeRule等多种基于收集到的服务器运行状况进行决策的动态策略。

Hystrix

一款针对分布式系统的延迟和容错库,可用来隔离分布式服务故障,确保系统可用性。

针对服务隔离,Hystrix组件提供了两种解决方案,即线程池(Thread Pool)隔离和信号量(Semaphore)隔离。

线程池的主要缺点就是它增加了计算的开销,每个业务请求(被包装成命令)在执行的时候,会涉及请求排队,调度和上下文切换。对于不依赖网络访问的服务(如只依赖内存缓存),就不适合用线程池隔离技术,而是推荐采用信号量隔离。

线程池隔离和信号量隔离的主要区别在于线程池方式下业务请求线程和执行依赖服务的线程不是同一个线程,而信号量方式下业务请求线程和执行依赖服务的线程是同一个线程。

Hystrix服务降级和熔断

Hystrix在服务调用失败(异常、拒绝、超时、短路)时都会执行fallback逻辑。

Command会调用run()方法,如果run()方法超时或者抛出异常并且启用了降级处理机制,则调用getFallback()方法进行降级。

Hystrix提供了熔断实现,熔断后会自动降级处理。

Command首先调用Hystrix CircuitBreaker的allowRequest判断是否熔断了,如果没有熔断,则执行run()方法正常处理,如果熔断了,则直接调用降级方法getFallback()方法降级处理。

熔断器有三个状态,其中打开和半打开会导致触发熔断机制。

在Hystrix中异常、超时、线程池拒绝、信号量拒绝数量总和就是失败总数,通过失败总数与访问总数之间的对比决定失败率,当该失败率超过失败率阀值时就会触发熔断器的打开状态。当熔断处于打开状态后,不能一直熔断下去,需要在一个时间窗口后进行重试,这种状态就是半打开。Hystrix允许在一定的窗口时间内进行一次重试,重试成功则闭合熔断开关,否则熔断开关还是处于打开状态。

Hystrix使用线程池存储当前请求以及对请求作处理。通过设置任务返回处理超时时间,并将堆积的请求放入线程池队列。可以应对突发流量,流量洪峰来临时,处理不完的请求可将数据存储到线程池队里慢慢处理。 Hystrix还支持使用信号量进行服务隔离。当使用信号量时,使用原子计数器来记录当前运行线程数,请求到来时先判断计数器的数值,若超过设置的最大线程数则丢弃该类型的新请求,若不超过则执行计数器+1,请求返回时执行计数器-1。信号量隔离无法应对突发流量。