Spring Cloud学习(3) - Hystrix服务熔断与降级

一、什么是熔断?为什么要熔断?

熔断就是类似一个保险丝一样的功能,当Hystrix判定下游服务不可用的时候,发生该服务的调用时,直接返回失败。

熔断对微服务来说是必须的,因为在Java中,每个HTTP请求都会开启一个新的线程,当下游服无法正常调用的时候,线程通常会阻塞,一直到Timeout结束,在并发量较大的时候,上游服务所在服务器很可能就会由于阻塞的线程将机器的资源耗尽,导致上游的服务一起挂掉

二、服务降级又是什么,和熔断有啥区别?

服务降级是从整个系统的负荷的角度进行考虑,在高负荷的情况下,通过关闭一些非核心接口的业务逻辑,返回一个提前准备好信息(Fallback),为核心接口腾出资源,保证核心功能的正常运行。这样做在一段时间内使部分非核心业务无法进行,来保证整个系统的稳定性和可用性。

熔断与降级的区别:

相同点

  1. 目标一致,从可用性和可靠性出发,防止系统的范围崩溃;
  2. 用户体验相似,用户会发现部分功能暂时不可用;

不同点

  1. 触发原因:熔断一般是谋个下游服务服务故障触发的;降级是由于整个系统的高负荷,针对性阻断非核心接口;
  2. 管理的目标层次:熔断是框架级的,每个微服务都需要的;降级一般是根据业务的重要性进行层级划分,从外围服务开始降级;
  3. 人工干预:熔断一般是服务交由框架策略自动触发和恢复的;降级可以通过开关预置,配置中心等手段实现自动,但是有些场景下会进行手动干预降级:比如大型活动的流量到来之前,提前关闭一些非核心功能;
  4. 粒度:熔断一般是整个服务不可用;降级会根据业务需求,做到接口级别的降级,比如单个服务保留订单查询,降级订单创建;

三、Hystrix是如何判断服务是可用的?

上文中我们说到熔断一般是交由框架断路器配置,自动判断进行熔断的。

Spring Cloud一般是使用Hystrix作为断路器,它一共有三种状态:

  1. 关闭:起始状态,所有请求都可以通过,当错误请求达到一定的阈值时,状态转换为打开
  2. 打开:请求直接短路,返回失败响应信息,经过一段时间后,状态转换为半开
  3. 半开:该状态下,如果下次请求成功,则状态转换为关闭,反之转换为打开

状态转化的判定配置主要有以下三个:

hystrix:
  command:
    default:
      circuitBreaker:
        # hystrix打开多长时间之后尝试恢复(转为半开), 默认5s
        sleepWindowInMilliseconds: 5
        # 配置时间窗口内达到此数量的失败后,打开hystrix
        requestVolumeThreshold: 20
        # 失败率达到百分比之后,打开hystrix
        errorThresholdPercentage: 50
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章