博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Hystrix框架1--入门
阅读量:5827 次
发布时间:2019-06-18

本文共 3495 字,大约阅读时间需要 11 分钟。

介绍

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

一个依赖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
{ 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

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

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

调用方法

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

//同步方法@Testpublic void testSynchronousSysOut() {    System.out.println( new CommandHelloWorld("World").execute());    System.out.println(  new CommandHelloWorld("Bob").execute());}//放入队列获得future异步调用@Testpublic void testAsynchronous2() throws Exception {    Future
fWorld = new CommandHelloWorld("World").queue(); Future
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@Testpublic void testObservable() throws Exception {    Observable
fWorld = new CommandHelloWorld("World").observe(); Observable
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
() { @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方法

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

修改test方法

@Testpublic 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的使用,其中还有很多高级功能会在之后介绍

转载于:https://www.cnblogs.com/resentment/p/5888145.html

你可能感兴趣的文章
d3 v4实现饼状图,折线标注
查看>>
微软的云策略
查看>>
Valid Parentheses
查看>>
windows下Python 3.x图形图像处理库PIL的安装
查看>>
【IL】IL生成exe的方法
查看>>
没有JS的前端:体积更小、速度更快!
查看>>
数据指标/表现度量系统(Performance Measurement System)综述
查看>>
GitHub宣布推出Electron 1.0和Devtron,并将提供无限制的私有代码库
查看>>
论模式在领域驱动设计中的重要性
查看>>
四、配置开机自动启动Nginx + PHP【LNMP安装 】
查看>>
Linux 目录结构及内容详解
查看>>
OCP读书笔记(24) - 题库(ExamD)
查看>>
.net excel利用NPOI导入oracle
查看>>
$_SERVER['SCRIPT_FLENAME']与__FILE__
查看>>
hive基本操作与应用
查看>>
html5纲要,细谈HTML 5新增的元素
查看>>
Android应用集成支付宝接口的简化
查看>>
[分享]Ubuntu12.04安装基础教程(图文)
查看>>
django 目录结构修改
查看>>
win8 关闭防火墙
查看>>