zoukankan      html  css  js  c++  java
  • 熔断器 Hystrix

    什么是Hystrix

    在分布式系统中,服务与服务之间的依赖错综复杂, 一种不可避免的情况就是某些服务会 出现故障,导致依赖于它们的其他服务出现远程调度的线程阻塞。 Hystrix 是 Netflix 公司开 源的一个项目,它提供了熔断器功能,能够阻止分布式系统中出现联动故障。 Hystrix 是通过 隔离服务的访问点阻止联动故障的,并提供了故障的解决方案,从而提高了整个分布式系统 的弹性。

    为了防止雪崩效应,因而产生了熔断器模型。 Hystrix 是在业界表现非常好的一个熔断器 模型实现的开源组件

    Hystrix的设计原则

    总的来说, Hystrix 的设计原则如下:

    1、防止单个服务的故障耗尽整个服务的 Servlet 容器(例如 Tomcat)的线程资源。

    2、快速失败机制,如果某个服务出现了故障,则调用该服务的请求快速失败,而不是线程等待。

    3、提供回退(fallback)方案,在请求发生故障时,提供设定好的回退方案。

    4、使用熔断机制,防止故障扩散到其他服务。

    5、提供熔断器的监控组件 Hystrix Dashboard,可以实时监控熔断器的状态。

    Hystrix的工作机制

    首先,当服务的某个 API 接口的失败次数 在一定时间内小于设定的阀值时,熔断器处于关闭状态,该 API 接口正常提供服务。当该 API 接口处理请求的失败次数大于设定的阀值时, Hystrix 判定该 API 接口出现了故障,打开 熔断器,这时请求该 API 接口会执行快速失败的逻辑(即 fallback 回退的逻辑),不执行业 务逻辑,请求的线程不会处于阻塞状态。处于打开状态的熔断器, 一段时间后会处于半打开状态,并将一定数量的请求执行正常逻辑。剩余的请求会执行快速失败,若执行正常逻辑的 请求失败了,则熔断器继续打开: 若成功了 ,则将熔断器关闭。这样熔断器就具有了自我修 复的能力。

    然后在 Spring Boot 的启动类 EurekaRibbonClientApplication 加上@EnableHystrix 注解开启 Hystrix 的熔断器功能

     修改 RibbonService 的代码, 在 hiO方法上加@HystrixCommand 注解。有了@HystrixCommand 注解, hi()方法就启用 Hystrix 熔断器的功能, 其中 , fallbackMethod 为处理回退(fallback)逻 辑的方法。在本例中, 直接返回了一个字符串。在熔断器打开的状态下,会执行 fallback 逻辑。 fall back 的逻辑最好是返回一些静态的字符串,不需要处理复杂的逻辑,也不需要远程调度其 他服务,这样方便执行快速失败,释放线程资源。 如果一定要在 fallback 逻辑中远程调度其他 服务,最好在远程调度其他服务时,也加上熔断器。案例代码如下:

    当熔断器打开了,之后的请求会直接执行 fallbackMethod 的逻辑。这样做的好处就是通过快速失败,请求能够得到及时处理,线程不再 阻塞。

    在Feign上使用熔断器
    由于 Feign 的起步依赖中已经引入了 Hystrix 的依赖,所以在 Feign 中使用 Hystrix 不需要 引入任何的依赖。 只需要在 eureka-feign”client 工程的配置文件 application.yml 中配置开启 Hystrix 的功能,配置文件 application.yml 中加以下配置:

    然后修改 eureka-feign-client 工程中的 EurekaClientFeign 代码,在@FeignClient 注解的 fall back 配置加上快速失败的处理类。该处理类是作为 Feign 熔断器的逻辑处理类,必须实现 被@FeignClient 修饰的接口。 例如案例中的 HiHystrix 类实现了接口 EurekaClientFeign, 最后 需要以 Spring Bean 的形式注入 IoC 容器中 。 代码如下:

     HiHystrix 作为熔断器的逻辑处理类, 需要实现 EurekaClientFeign 接口,井需要在接口方 法 sayHiFromCientEureka()里写处理熔断的具体逻辑,同时还雨’要在 HiHystrix 类上加 @Component 注解,注入 IoC 容器中。代码如下:




  • 相关阅读:
    JProfiler_SN_8_x key
    java格式化百分比
    获取每月第一天最后一天 java
    java 获取昨天日期
    eclipse git提交代码
    SIT与UAT的分别
    Spring <context:annotation-config/> 说明
    Hibernate日期映射类型
    Oracle查询备注信息
    Log4J入门
  • 原文地址:https://www.cnblogs.com/zpp1234/p/13399875.html
Copyright © 2011-2022 走看看