现在的位置: 首页 > 综合 > 正文

什么是 Hystrix之熔断和降级

2020年02月12日 综合 ⁄ 共 1470字 ⁄ 字号 评论关闭

  什么是 Hystrix之熔断和降级?

  在分布式环境中,不可避免地会有许多服务依赖项中的某些失败。Hystrix 是一个库,可通过添加等待时间容限和容错逻辑来帮助您控制这些分布式服务之间的交互。Hystrix 通过隔离服务之间的访问点,停止服务之间的级联故障并提供后备选项来实现此目的,所有这些都可以提高系统的整体弹性。

  总体来说 Hystrix 就是一个能进行熔断和降级的库,通过使用它能提高整个系统的弹性。

  那么什么是熔断和降级呢?再举个例子,此时我们整个微服务系统是这样的。服务 A 调用了服务 B,服务 B 再调用了服务 C,但是因为某些原因,服务 C 顶不住了,这个时候大量请求会在服务 C 阻塞。

  服务 C 阻塞了还好,毕竟只是一个系统崩溃了。但是请注意这个时候因为服务 C 不能返回响应,那么服务 B 调用服务 C 的的请求就会阻塞,同理服务 B 阻塞了,那么服务 A 也会阻塞崩溃。

  请注意,为什么阻塞会崩溃。因为这些请求会消耗占用系统的线程、IO 等资源,消耗完你这个系统服务器不就崩了么。

  这就叫服务雪崩。妈耶,上面两个熔断和降级你都没给我解释清楚,你现在又给我扯什么服务雪崩?

  所谓熔断就是服务雪崩的一种有效解决方案。当指定时间窗内的请求失败率达到设定阈值时,系统将通过 断路器 直接将此请求链路断开。

  也就是我们上面服务 B 调用服务 C 在指定时间窗内,调用的失败率到达了一定的值,那么 Hystrix 则会自动将服务 B 与 C 之间的请求都断了,以免导致服务雪崩现象。

  其实这里所讲的 熔断 就是指的 Hystrix 中的 断路器模式 ,你可以使用简单的 @HystrixCommand 注解来标注某个方法,这样 Hystrix 就会使用 断路器 来“包装”这个方法,每当调用时间超过指定时间时(默认为1000ms),断路器将会中断对这个方法的调用。

  当然你可以对这个注解的很多属性进行设置,比如设置超时时间,像这样:

  @HystrixCommand(

  commandProperties = {@HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds",value = "1200")}

  )

  public List getXxxx() {

  // ...省略代码逻辑

  }

  但是,我查阅了一些博客,发现他们都将熔断和降级的概念混淆了,以我的理解,降级是为了更好的用户体验,当一个方法调用异常时,通过执行另一种代码逻辑来给用户友好的回复。这也就对应着 Hystrix 的 后备处理 模式。你可以通过设置 fallbackMethod 来给一个方法设置备用的代码逻辑。比如这个时候有一个热点新闻出现了,我们会推荐给用户查看详情,然后用户会通过 ID 去查询新闻的详情,但是因为这条新闻太火了(比如最近什么*易对吧),大量用户同时访问可能会导致系统崩溃,那么我们就进行 服务降级 ,一些请求会做一些降级处理比如当前人数太多请稍后查看等等。

  // 指定了后备方法调用

  @HystrixCommand(fallbackMethod = "getHystrixNews")

  @GetMapping("/get/news")

  public News getNews(@PathVariable("id") int id) {

  // 调用新闻系统的获取新闻 API 代码逻辑省略

  }

  //

  public News getHystrixNews(@PathVariable("id") int id) {

  // 做服务降级

  // 返回当前人数太多,请稍后查看

  }

抱歉!评论已关闭.