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 容器中。代码如下:




  • 相关阅读:
    mysql报错:java.sql.SQLException: The server time zone value 'Öйú±ê׼ʱ¼ä' is unrecognized or represents more than one time zone.
    MD5登陆密码的生成
    15. 3Sum、16. 3Sum Closest和18. 4Sum
    11. Container With Most Water
    8. String to Integer (atoi)
    6. ZigZag Conversion
    5. Longest Palindromic Substring
    几种非线性激活函数介绍
    AI初探1
    AI初探
  • 原文地址:https://www.cnblogs.com/zpp1234/p/13399875.html
Copyright © 2011-2022 走看看