资讯专栏INFORMATION COLUMN

Hystrix使用

harryhappy / 3008人阅读

1. Hystrix是谁?

Hystrix源于Netflix API团队在2011年启动的弹性工程工作,而目前它在Netflix每天处理着数百亿的隔离线程以及数千亿的隔离信号调用。该库旨在通过控制那些访问远程系统、服务和第三方库的节点,从而对延迟和故障提供更强大的容错能力。Hystrix具备拥有回退机制和断路器功能的线程和信号隔离,请求缓存和请求打包,以及监控和配置等功能。
目前托管在github上。

2. 为什么需要Hystrix?

在大中型分布式系统中,通常系统很多依赖(HTTP,Dubbo等),如果一个应用不能对来自依赖的故障进行有效处理,那该应用本身就处在被拖垮的风险中。在一个高流量的网站中,某个单一的后端一旦发生延迟,将会在数秒内导致所有应用资源被耗尽。

例如:一个依赖30个服务的系统,每个服务99.99%可用。
此系统的失败率为1-99.99%的30次方 ≈ 0.3%
意味着一亿次请求 会有 3,000,00次失败
随着服务依赖数量的变多,服务不稳定的概率会成指数性提高.

Hystrix把服务调用统称为依赖调用, Hystrix通过命令模式封装依赖调用,每一个依赖调用封装在HystrixCommand中,每个命令在Hystrix的线程池中运行。另外可以对其配置分组名、线程组,使得不同的依赖可以分类在不同的线程组,隔离不同模块的依赖,也可根据负载情况,配置不同组的线程数。Hystrix还提供一种熔断器(CircuitBreaker)的机制,Hystrix可以通过设定的条件判断该封装的依赖调用是否可以正确调用,如果在一定时间内调用失败次数过多,则会熔断自身,使得相同的调用无法执行,待冷却之后重新再试。

3. 如何使用?

1.pom.xml中加入依赖

  
     com.netflix.hystrix  
     hystrix-core  
     ${hystrix.version}  
  

2.继承HystrixCommand,在run()方法中完成对依赖的调用:

public class CustomeCommand extends HystrixCommand {  
  
    protected CustomeCommand(String input) {  
    //设置HystrixCommand的属性
        super(Setter.withGroupKey(HystrixCommandGroupKey.Factory.asKey("CustomeGroup"))  
                .andCommandKey(HystrixCommandKey.Factory.asKey("CustomeKey"))  
                .andThreadPoolKey(HystrixThreadPoolKey.Factory.asKey("CustomeThreadPool"))  
                .andCommandPropertiesDefaults(HystrixCommandProperties.Setter()  
                        .withExecutionIsolationStrategy(HystrixCommandProperties.ExecutionIsolationStrategy.THREAD))  
                .andThreadPoolPropertiesDefaults(HystrixThreadPoolProperties.Setter()  
                        .withCoreSize(10))  
        );  
   
    }  
  
    @Override  
    protected String run() throws Exception {
    //访问真正的服务  
        return "hello World!";  
    }    
    //服务降级
    @Override  
    protected String getFallback() {  
        return "exeucute Falled";  
    }  
    //请求缓存  
    @Override  
    protected String getCacheKey() {  
        //  
    }  
}  
HystxixCommand支持如下的配置:

GroupKey:该命令属于哪一个组,可以帮助我们更好的组织命令。
CommandKey:该命令的名称
ThreadPoolKey:该命令所属线程池的名称,同样配置的命令会共享同一线程池,若不配置,会默认使用GroupKey作为线程池名称。
CommandProperties:该命令的一些设置,包括断路器的配置,隔离策略,降级设置,以及一些监控指标等。
ThreadPoolProerties:关于线程池的配置,包括线程池大小,排队队列的大小等。

3.调用HystrixCommand

        CustomeCommand command = new CustomeCommand();  
        String result = command.execute();  
HystrixCommand提供了3种执行方式:

同步执行:即一旦开始执行该命令,当前线程就得阻塞着直到该命令返回结果,然后才能继续执行下面的逻辑。当调用命令的execute()方法即为同步执行(内部使用queue().get() )。
异步执行:命令开始执行会返回一个Future的对象,不阻塞后面的逻辑,开发者自己根据需要去获取结果。当调用HystrixCommand的queue()方法即为异步执行。

        CustomeCommand command = new CustomeCommand();  
        Future result = command.queue();  
        while (!result.isDone()){  
            System.out.println("Do other things ..."); 
            } 

响应式执行:命令开始执行会返回一个Observable 对象,开发者可以给给Obeservable对象注册上Observer或者Action1对象,响应式地处理命令执行过程中的不同阶段。当调用HystrixCommand的observe()方法,或使用Observable的工厂方法(just(),from())即为响应式执行,这个功能的实现是基于Netflix的另一个开源项目RxJava

        CustomeCommand command = new CustomeCommand();  
        Observable result = command.observe();
        result.subscribe(new Action1() {
            @Override
            public void call(String str) {
                logger.info("Command called. Result is:{}", str);
            }
        });

        CustomeCommand command = new CustomeCommand();
        Observable result = command.observe();
        result.subscribe(new Observer() {
            @Override
            public void onCompleted() {
                logger.info("Command Completed");
            }

            @Override
            public void onError(Throwable e) {
                logger.error("Command failed", e);
            }

            @Override
            public void onNext(String args) {
                logger.info("Command finish,result is {}", args);
            }
        });
    }
4. Hystrix监控

Hystrix还提供给我们一个监控功能Hystrix-dashboard,可以直接使用其开源项目进行配置,就能实时的观察我们的服务调用情况。

1.构建dashboard项目
Shell代码 收藏代码
$ git clone https://github.com/Netflix/Hy...
$ cd Hystrix/hystrix-dashboard
$ ../gradlew jettyRun

打开路径:http://localhost:7979/hystrix...

2.配置服务状态上报

    
  HystrixMetricsStreamServlet    
  HystrixMetricsStreamServlet    
  com.netflix.hystrix.contrib.metrics.eventstream.HystrixMetricsStreamServlet  
  
      
  HystrixMetricsStreamServlet    
  /hystrix.stream  
  

3.添加stream
在hystrix-dashboard中按照说明添加自己的 http://hystrix-app:port/hystr... ,然后监视
4.如果是集群,通过turbine进行监视

5. 参考资料

https://github.com/Netflix/Hy...
http://ningandjiao.iteye.com/...
http://fobject.iteye.com/blog...

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/70329.html

相关文章

  • Hystrix基础入门和特性讲解

    摘要:断路器本身是一种开关装置,用于在电路上保护线路过载,当线路中有电器发生短路时,断路器能够及时的切断故障电路,防止发生过载发热甚至起火等严重后果。具备拥有回退机制和断路器功能的线程和信号隔离,请求缓存和请求打包,以及监控和配置等功能。 转载请注明出处 http://www.paraller.com 代码机制:熔断 & Fallback & 资源隔离 熔断 概念: 在微服务架构中,我们将系...

    dkzwm 评论0 收藏0
  • Spring Cloud 参考文档(断路器:Hystrix客户端)

    摘要:以下示例显示了具有断路器的最小服务器由名为的库提供,在连接到断路器的代理中自动包装带有该注解的,断路器计算何时打开和关闭电路以及在发生故障时应采取的措施。上一篇服务发现下一篇超时和客户端 断路器:Hystrix客户端 Netflix创建了一个名为Hystrix的库,用于实现断路器模式,在微服务架构中,通常有多层服务调用,如以下示例所示: 较低级别的服务中的服务故障可能导致级联故障一直到...

    novo 评论0 收藏0
  • SpringCloud(第 015 篇)电影Ribbon微服务集成Hystrix增加隔离策略控制指标

    摘要:传播安全上下文或使用,通过增加的属性,来增加相关的配置来达到执行隔离策略,控制线程数或者控制并发请求数来达到熔断降级的作用。 SpringCloud(第 015 篇)电影Ribbon微服务集成Hystrix增加隔离策略控制线程数或请求数来达到熔断降级的作用 - 一、大致介绍 1、本章节介绍关于Hystrix的2种隔离方式(Thread Pool 和 Semaphores); 2、Thr...

    RobinQu 评论0 收藏0
  • Spring Cloud 参考文档(Hystrix超时和Ribbon客户端)

    摘要:要运行仪表板,请使用注解主类,然后访问并将仪表板指向客户端应用程序中的单个实例的端点。连接到使用的端点时,必须信任服务器使用的证书,如果证书不受信任,则必须将证书导入,以便仪表板成功连接到流端点。 Hystrix超时和Ribbon客户端 使用包装Ribbon客户端的Hystrix命令时,要确保将Hystrix超时配置为长于配置的Ribbon超时,包括可能进行的任何可能的重试,例如,如果...

    pf_miles 评论0 收藏0
  • Hystrix 停止开发。。。Spring Cloud 何去何从?

    摘要:栈长得到消息,停止开发了。。。是一个轻量级的容错组件,其灵感来自于,主要为和函数式编程设计的看到这里,栈长表示学不动了。。。上面说了,官方推荐替代的开源组件,这个栈长也没有用过,查了下,资料也比较稀少。 showImg(https://segmentfault.com/img/remote/1460000017201104?w=1600&h=1066); 栈长得到消息,Hystrix ...

    陆斌 评论0 收藏0

发表评论

0条评论

harryhappy

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<