zoukankan      html  css  js  c++  java
  • Hystrix的介绍和简单使用

    这周在看项目的相关代码时,接触到了Hystrix,因此查询了相关资料学习了下。

    一、什么是Hystrix

      Hystrix是Netflix针对微服务分布式系统的熔断保护中间件,当我们的客户端连接远程的微服务时,有两种情况需要考虑:首先,如果远程系统当机了我们怎么办?

    其次,我们如何管理对远程微服务的调用性能,以保证每个微服务以最小延迟最快性能响应?

      Hystrix是一个有关延迟和失败容错的开源库包,用来设计隔离访问远程系统端点或微服务等,防止级联爆炸式的失败,也就是由一个小问题引起接二连三扩大的

    疯狂的错误爆炸直至整个系统瘫痪,能够让复杂的分布式系统更加灵活具有弹性。

      例如,在一个大中型系统中,通常系统很多依赖(HTTP,hession,Netty,Dubbo等),如下图:

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

    为50的依赖 I出现不可用,但是其他依赖仍然可用.

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


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

      例如:一个依赖30个SOA服务的系统,每个服务99.99%可用。  99.99%的30次方 ≈ 99.7%  。0.3% 意味着一亿次请求 会有 3,000,00次失败  。换算成时间大约每月

    有2个小时服务不稳定。随着服务依赖数量的变多,服务不稳定的概率会成指数性提高。

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

    二、如何使用Hystrix

    Hystrix Github上有一个全面的文档介绍如何使用Hystrix。这很简单,只要使用Hystrix库创建类并调用服务。首先需要在Maven项目中引入如下依赖:

    <!-- 依赖版本 -->
    <hystrix.version>1.3.16</hystrix.version>
    <hystrix-metrics-event-stream.version>1.1.2</hystrix-metrics-event-stream.version>

    <dependency>
      <groupId>com.netflix.hystrix</groupId>
      <artifactId>hystrix-core</artifactId>
      <version>${hystrix.version}</version>
    </dependency>
    <dependency>
      <groupId>com.netflix.hystrix</groupId>
      <artifactId>hystrix-metrics-event-stream</artifactId>
      <version>${hystrix-metrics-event-stream.version}</version>
    </dependency>
    <!-- 仓库地址 -->
    <repository>
      <id>nexus</id>
      <name>local private nexus</name>
      <url>http://maven.oschina.net/content/groups/public/</url>
      <releases>
        <enabled>true</enabled>
      </releases>
      <snapshots>
        <enabled>false</enabled>
      </snapshots>
    </repository>

    然后使用命令模式封装依赖逻辑,具体Java代码如下:

    public class CommandHelloWorld extends HystrixCommand<String> {

      private final String name;

      public CommandHelloWorld(String name) {
        super(HystrixCommandGroupKey.Factory.asKey("ExampleGroup"));
        this.name = name;
      }

      @Override
      protected String run() {
      return "Hello " + name + "!";
      }
    }

    同时,我们还可以通过使用Fallback() 提供降级策略,例如:

    public class HelloWorldCommand extends HystrixCommand<String> {
      private final String name;
      public HelloWorldCommand(String name) {
        super(Setter.withGroupKey(HystrixCommandGroupKey.Factory.asKey("HelloWorldGroup"))
        /* 配置依赖超时时间,500毫秒*/
        .andCommandPropertiesDefaults(HystrixCommandProperties.Setter().withExecutionIsolationThreadTimeoutInMilliseconds(500)));
        this.name = name;
      }
      @Override
      protected String getFallback() {
        return "exeucute Falled";
      }
      @Override
      protected String run() throws Exception {
        //sleep 1 秒,调用会超时
        TimeUnit.MILLISECONDS.sleep(1000);
        return "Hello " + name +" thread:" + Thread.currentThread().getName();
      }
      public static void main(String[] args) throws Exception{
        HelloWorldCommand command = new HelloWorldCommand("test-Fallback");
        String result = command.execute();
      }
    }

    /* 运行结果:getFallback() 调用运行
    getFallback executed
    */

    Reference: https://github.com/Netflix/Hystrix/wiki/Getting-Started

  • 相关阅读:
    【BUG】android.content.res.Resources$NotFoundException: File res/drawable-xxhdpi/toolbar_line.png from
    关于 折半查找 while 条件 &lt; , &lt;=
    Unity3D——加入剑痕效果(PocketRPG Trail插件)
    用外部物理路由器时使用Neutron dhcp-agent提供的metadata服务(by quqi99)
    项目经理之项目经理注意事项
    让你提前认识软件开发(37):研发流程初探
    1.RunLoop是什么?
    列表类型内置方法
    字符串类型内置方法
    数字类型内置方法
  • 原文地址:https://www.cnblogs.com/junjiang3/p/8372087.html
Copyright © 2011-2022 走看看