分布式服务防雪崩熔断器(Hystrix),实现服务降级

Hystrix是什么?

hystrix对应的中文名字是“豪猪”,豪猪周身长满了刺,能保护本身不受天敌的伤害,表明了一种防护机制,这与hystrix自己的功能不谋而合,所以Netflix团队将该框架命名为Hystrix,并使用了对应的卡通形象作做为logo。html

在一个分布式系统里,许多依赖不可避免的会调用失败,好比超时、异常等,如何可以保证在一个依赖出问题的状况下,不会致使总体服务失败,这个就是Hystrix须要作的事情。java

Hystrix提供了熔断、隔离、Fallback、cache、监控等功能,可以在一个、或多个依赖同时出现问题时保证系统依然可用。segmentfault

 

为何须要Hystrix?

在大中型分布式系统中,一般系统不少依赖(HTTP,hession,Netty,Dubbo等),以下图:服务器

 

 

在高并发访问下,这些依赖的稳定性与否对系统的影响很是大,可是依赖有不少不可控问题:如网络链接缓慢,资源繁忙,暂时不可用,服务脱机等。网络

以下图:QPS为50的依赖 I 出现不可用,可是其余依赖仍然可用。架构

当依赖I 阻塞时,大多数服务器的线程池就出现阻塞(BLOCK),影响整个线上服务的稳定性.以下图:并发

 

在复杂的分布式架构的应用程序有不少的依赖,都会不可避免地在某些时候失败。高并发的依赖失败时若是没有隔离措施,当前应用服务就有被拖垮的风险框架

例如:一个依赖30个SOA服务的系统,每一个服务99.99%可用。 分布式

99.99%的30次方 ≈ 99.7% ide

0.3% 意味着一亿次请求 会有 3,000,00次失败

换算成时间大约每个月有2个小时服务不稳定.

随着服务依赖数量的变多,服务不稳定的几率会成指数性提升.

解决问题方案:对依赖作隔离,Hystrix就是处理依赖隔离的框架,同时也是能够帮咱们作依赖服务的治理和监控。

 

Hystrix如何解决依赖隔离?

Hystrix使用命令模式HystrixCommand(Command)包装依赖调用逻辑,每一个命令在单独线程中/信号受权下执行。

可配置依赖调用超时时间,超时时间通常设为比99.5%平均时间略高便可.当调用超时时,直接返回或执行fallback逻辑。

为每一个依赖提供一个小的线程池(或信号),若是线程池已满调用将被当即拒绝,默认不采用排队.加速失败断定时间。

依赖调用结果分:成功,失败(抛出异常),超时,线程拒绝,短路。 请求失败(异常,拒绝,超时,短路)时执行fallback(降级)逻辑。

提供熔断器组件,能够自动运行或手动调用,中止当前依赖一段时间(10秒),熔断器默认错误率阈值为50%,超过将自动运行。

提供近实时依赖的统计和监控。

Hystrix依赖的隔离架构,以下图:

 

Hystrix应用实战
Maven:

<dependency>
    <groupId>com.netflix.hystrix</groupId>
    <artifactId>hystrix-core</artifactId>
    <version>1.5.13</version>
</dependency>

源码太多,不一一贴上来,这里只展现主要的测试源码。

public static void main(String[] args) {
    System.out.println(test("javastack"));
}

private static String test(String name) {
    HystrixUtil.HystrixReqConfig hc = HystrixUtil.HystrixReqConfig.withGroupKey("TestGroup").withTimeout(3)
            .withUnit(TimeUnit.SECONDS).withPassNum(64);

    String result = HystrixUtil.getExcuteResult(new HystrixCallableService<String>() {

        @Override
        public String execute() {
            try {
                Thread.sleep(5000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            return "success " + name;
        }

        @Override
        public String fallback() {
            return "fallback " + name;
        }

    }, hc);

    return result;
}

 项目中的实际使用案例:

 

参考:

https://www.cnblogs.com/li3807/p/8780980.html

https://www.jianshu.com/p/3e11ac385c73?from=timeline

https://segmentfault.com/a/1190000012845088

https://www.colabug.com/2804676.html

https://blog.csdn.net/chengqiuming/article/details/81412510

https://blog.csdn.net/an88411980/article/details/80552973

https://hot66hot.iteye.com/blog/2155036

相关文章
相关标签/搜索