介绍

在开发应用中或多或少会依赖各种外界的服务,利用各个服务来完成自己的业务需求,现在流行的微服务架构更是离不开各个服务之间的调用,这就导致整体应用的可用性依赖于各个依赖服务的可用性。

比如一个依赖30个可靠性为99.99%的服务的应用99.99^30 = 99.7%一下子就只能达到两个9了。就算各个服务达到了可靠性,那总体来说每个月也有2个小时的不可用时间。更不用说会导致的连锁反应。

这时我们就需要一个框架来隔离各个服务之间的调用,尽可能不影响业务的流程。

netflix开发了Hystrix这个框架就是为了这个隔离各个服务间调用而创建的框架。

hello world

首先来看一个简单的Hello World例子

使用gradle导入hystrix的jar包

compile 'com.netflix.hystrix:hystrix-core:1.5.5'

之后就可以使用

//需要继承HystrixCommand,还可以继承HystrixObservableCommand只是对应接口、调用方法不同
public class CommandHelloWorld extends HystrixCommand<String> { private final String name; public CommandHelloWorld(String name) {
//父类构造方法,只需要传入一个GroupKey
super(HystrixCommandGroupKey.Factory.asKey("ExampleGroup"));
this.name = name;
}
//真实的方法,在这调用服务等,并返回结果
@Override
protected String run() {
return "Hello " + name + "!";
}
}

这样就完成了一个Command。接下来调用这个Command

@Test
public void testSynchronous() {
assertEquals("Hello World!", new CommandHelloWorld("World").execute());
assertEquals("Hello Bob!", new CommandHelloWorld("Bob").execute());
}

这里直接新建一个实例并调用execute方法。就得到了想要的结果

调用方法

以上介绍了execute方法进行调用,这里execute是同步调用,会阻塞当前线程,Hystrix提供了许多异步的方法进行调用

//同步方法
@Test
public void testSynchronousSysOut() {
System.out.println( new CommandHelloWorld("World").execute());
System.out.println( new CommandHelloWorld("Bob").execute());
}
//放入队列获得future异步调用
@Test
public void testAsynchronous2() throws Exception { Future<String> fWorld = new CommandHelloWorld("World").queue();
Future<String> fBob = new CommandHelloWorld("Bob").queue(); assertEquals("Hello World!", fWorld.get());
assertEquals("Hello Bob!", fBob.get());
}

其实以上的方法原理都一样,都是调用queue().get()方法,其中queue返回Future对象,之后对future阻塞进行取值。内部其实是调用toObservable().toBlocking().toFuture()来获得future对象的

还有一种是使用RxJava的observable接口来进行调用的,Hystrix内部底层也是使用RxJava来实现的

//使用RxJava的Observable
@Test
public void testObservable() throws Exception { Observable<String> fWorld = new CommandHelloWorld("World").observe();
Observable<String> fBob = new CommandHelloWorld("Bob").observe(); // 阻塞
assertEquals("Hello World!", fWorld.toBlocking().single());
assertEquals("Hello Bob!", fBob.toBlocking().single()); // 非阻塞
// - this is a verbose anonymous inner-class approach and doesn't do assertions
fWorld.subscribe(new Observer<String>() { @Override
public void onCompleted() {
// nothing needed here
} @Override
public void onError(Throwable e) {
e.printStackTrace();
} @Override
public void onNext(String v) {
System.out.println("onNext: " + v);
} });

fallback

以上只是简单封装了调用的接口,下面来看下Hystrix是如何应对调用的错误的

当在run方法中主动抛出异常,就会导致下面的错误信息

com.netflix.hystrix.exception.HystrixRuntimeException: CommandHelloWorld failed and no fallback available.

我们在Command中添加fallback方法

@Override
protected String run() {
throw RuntimeException("error");
//return "Hello " + name + "!";
}
@Override
protected String getFallback() {
return "Failure " + name + "!";
}

修改test方法

@Test
public void testSynchronous() {
assertEquals("Failure World!", new CommandHelloWorld("World").execute());
assertEquals("Failure Bob!", new CommandHelloWorld("Bob").execute());
}

这样运行就没有问题了,可以看到当run运行出错时,将会调用fallback,返回值也由fallback提供,当然fallback也出错那就没有办法了,所以需要尽量保证fallback不会出现异常。

其中值得注意的一点是当手动抛出HystrixBadRequestException时,Hystrix是不会调用fallback的。

总结

上面简单介绍了Hystrix的使用,其中还有很多高级功能会在之后介绍

Hystrix框架1--入门的更多相关文章

  1. Springmvc整合tiles框架简单入门示例(maven)

    Springmvc整合tiles框架简单入门示例(maven) 本教程基于Springmvc,spring mvc和maven怎么弄就不具体说了,这边就只简单说tiles框架的整合. 先贴上源码(免积 ...

  2. OkHttp框架从入门到放弃,解析图片使用Picasso裁剪,二次封装OkHttpUtils,Post提交表单数据

    OkHttp框架从入门到放弃,解析图片使用Picasso裁剪,二次封装OkHttpUtils,Post提交表单数据 我们这片博文就来聊聊这个反响很不错的OkHttp了,标题是我恶搞的,本篇将着重详细的 ...

  3. Spring.NET依赖注入框架学习--入门

    Spring.NET依赖注入框架学习--入门 在学些Spring.net框架之前,有必要先脑补一点知识,比如什么是依赖注入?IOC又是什么?控制反转又是什么意思?它们与Spring.net又有什么关系 ...

  4. 框架-spring入门总结

    框架-spring入门总结 参考: http://www.cnblogs.com/heavenyes/p/3908546.html http://www.cnblogs.com/heavenyes/p ...

  5. MvvmLight框架使用入门(四)

    本篇我们着重介绍ViewModelBase,演示Set和RaisePropertyChanged方法的使用,以及就Cleanup方法释放资源展开讨论. ICleanup 接口.实现该接口的ViewMo ...

  6. MvvmLight框架使用入门(三)

    本篇是MvvmLight框架使用入门的第三篇.从本篇开始,所有代码将通过Windows 10的Universal App来演示.我们将创建一个Universal App并应用MvvmLight框架. ...

  7. node.js Web应用框架Express入门指南

    node.js Web应用框架Express入门指南 作者: 字体:[增加 减小] 类型:转载 时间:2014-05-28 我要评论 这篇文章主要介绍了node.js Web应用框架Express入门 ...

  8. Surging 分布式微服务框架使用入门

    原文:Surging 分布式微服务框架使用入门 前言 本文非 Surging 官方教程,只是自己学习的总结.如有哪里不对,还望指正. 我对 surging 的看法 我目前所在的公司采用架构就是类似与S ...

  9. Surging 微服务框架使用入门

    原文:Surging 微服务框架使用入门 前言 本文非 Surging 官方教程,只是自己学习的总结.如有哪里不对,还望指正.  我对 surging 的看法 我目前所在的公司采用架构就是类似与Sur ...

  10. Google C++测试框架系列入门篇:第三章 基本概念

    上一篇:Google C++测试框架系列入门篇:第二章 开始一个新项目 原始链接:Basic Concepts 词汇表 版本号:v_0.1 基本概念 使用GTest你肯定会接触到断言这个概念.断言是用 ...

随机推荐

  1. html5吹牛扯淡篇,闲话内容。

    09年提出对媒体查询的草案,到今天的广泛运用,w3c带我们走进了个性化定制的殿堂.这些之所以会被认可会被写进世界级标准,因为他越来越适应广大用户的需求,需求就像一条锁链带动或者牵引整个互联网开发工作. ...

  2. oracle中批量生成字段类型的脚本

    select ' ALTER TABLE '||table_name || '  MODIFY( '|| column_name || ' DATE );' from USER_TAB_COLUMNS ...

  3. mybatis配置文件的bug

    看看图片里的配置有什么问题么? url=jdbc--我擦,我怎么这么不小心,换来一整天的不得安宁,上网各种搜bug,把mysql驱动配置到classpath中,jar包放进jdkjre里面还是不行妈的 ...

  4. 从零开始山寨Caffe·拾:IO系统(三)

    数据变形 IO(二)中,我们已经将原始数据缓冲至Datum,Datum又存入了生产者缓冲区,不过,这离消费,还早得很呢. 在消费(使用)之前,最重要的一步,就是数据变形. ImageNet Image ...

  5. js数组与对象性能比较

    js的数组可以看成特殊的对象,获取指定项的行为跟获取对象中指定key对应项的行为是一致的. 一般都是hash map实现的,因而复杂度是常数级的.

  6. 解决nginx中proxy_pass到tomcat的session丢失问题

    之前在配置tomcat的时候都是一个项目对应一个tomcat,也就是一个端口.最近需要把两个项目整合到同一个tomcat中,通过配置nginx让两个域名指向同一tomcat的不同项目.整合完毕后发现其 ...

  7. Redis_密码管理(转)

    一. 如何初始化redis的密码? 总共2个步骤: a.在配置文件中有个参数: requirepass  这个就是配置redis访问密码的参数. 比如 requirepass test123 b.配置 ...

  8. block 从B界面向A界面传值

    最近在改公司外包项目的代码,发现了一种block传值的用法很有意思,记录一下 A.B两个页面 在B界面.h中定义 @property (nonatomic,strong) void(^block)(N ...

  9. linux下tomcat安装

    1.先安装jdk,我们这里用yum进行安装: yum -y install java-1.7.0-openjdk* 确定是否安装成功: java -version 如果显示jdk的版本信息,说明安装成 ...

  10. python 中使用 global 引发了莫名其妙的问题

    哪里出问题了 python 中,使用 global 会将全局变量设为本函数可用.同时,在函数内部访问变量会先本地再全局. 在嵌套函数中,使用 global 会产生不合常理的行为. 上代码: In [9 ...