Hystrix的介绍和简单使用

Stella981
• 阅读 553

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

一、什么是Hystrix

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

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

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

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

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

Hystrix的介绍和简单使用

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

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

Hystrix的介绍和简单使用

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

Hystrix的介绍和简单使用

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

  例如:一个依赖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>

  com.netflix.hystrix   hystrix-core   ${hystrix.version}   com.netflix.hystrix   hystrix-metrics-event-stream   ${hystrix-metrics-event-stream.version}   nexus   local private nexus   http://maven.oschina.net/content/groups/public/        true           false   

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

public class CommandHelloWorld extends HystrixCommand {

  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 {
  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

点赞
收藏
评论区
推荐文章
blmius blmius
2年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Stella981 Stella981
2年前
Spring Cloud Alibaba:Sentinel实现熔断与限流
一、什么是SentinelSentinel,中文翻译为哨兵,是为微服务提供流量控制、熔断降级的功能,它和Hystrix提供的功能一样,可以有效的解决微服务调用产生的“雪崩效应”,为微服务系统提供了稳定性的解决方案。随着Hystrix进入了维护期,不再提供新功能,Sentinel是一个不错的替代方案。通常情况下,Hystrix采用线程池对服务的调用
Stella981 Stella981
2年前
Hystrix——让你的服务更稳一点
摘要:1、为什么要用Hystrix在分布式服务环境下,服务之间的调用关系变得错综复杂,你是否担心依赖的服务延迟导致自己的服务也被拖跨呢?是否在苦苦思考如何优雅的对依赖服务进行异步调用呢?是否希望当流量高峰时自动进行...
Stella981 Stella981
2年前
Hystrix实现ThreadLocal上下文的传递 转
springcloud微服务中,服务间传输全局类参数,如session信息等。一、问题背景Hystrix有2个隔离策略:THREAD以及SEMAPHORE,当隔离策略为THREAD时,是没办法拿到ThreadLocal中的值的。Hystrix提供了基于信号量和线程两种隔离模式,通过在Hystrix基础章节中已经验证过,通过
Easter79 Easter79
2年前
Twitter的分布式自增ID算法snowflake (Java版)
概述分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的。有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成。而twitter的snowflake解决了这种需求,最初Twitter把存储系统从MySQL迁移
Easter79 Easter79
2年前
SpringCloud系列十五:使用Hystrix实现容错
1\.回顾上文讲解了容错的重要性,以及容错需要实现的功能。本文来讲解使用Hystrix实现容错。2\.Hystrix简介Hystrix是Netflix开源的一个延迟和容错库,用于隔离访问远程系统、服务或第三方库,防止级联失败,从而提高系统的可用性与容错性。Hystrix主要通过以下几点实现延迟和容错:
Easter79 Easter79
2年前
Spring集成Hystrix实现依赖隔离
Hystrix(https://www.oschina.net/action/GoToLink?urlhttps%3A%2F%2Fgithub.com%2FNetflix%2FHystrix)是Netflix针对微服务分布式系统的熔断保护中间件,当我们的客户端连接远程的微服务时,有两种情况需要考虑:首先,如果远程系统当机了我们怎么办?其次,我们如何管理
Easter79 Easter79
2年前
SpringCloud 进阶之Hystrix(断路器)
1\.Hystrix断路器Hystrix是一个用于处理分布式系统的延迟和容错的开源库,在分布式系统里,许多依赖不可避免的会调用失败,比如超时,异常等,Hystrix能够保证在一个依赖出问题的情况下,不会导致整体服务失败,避免级联故障,以提高分布式系统的弹性;"断路器"本身是一种开关装置,当某个服务单元发生故障之后,通过断
暗箭伤人 暗箭伤人
7个月前
【www.ithunter.club】 20230922下午
不容易的2023年,我们一起努力【www.ithunter.club】(2023092208:00:00.8872062023092216:00:00.887206)1.人事招聘专员数名(可选远程或入职)2.招聘向坐标东京Yahoo、Shift、L