Hystrix简介– Hello World

在先前的博客文章中,我谈到了需要像Netflix Hystrix这样的库的动机。 在这里,我将跳入一些非常基本的方法来开始使用Hystrix,并在更复杂的用例中进行后续介绍。

你好,世界

以下是“ Hystrix命令”的一个简单的Hello World示例:

import com.netflix.hystrix.HystrixCommand;
import com.netflix.hystrix.HystrixCommandGroupKey;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;public class HelloWorldCommand extends HystrixCommand<String> {private static final Logger logger = LoggerFactory.getLogger(HelloWorldCommand.class);private final String name;public HelloWorldCommand(String name) {super(HystrixCommandGroupKey.Factory.asKey("default"));this.name = name;}@Overrideprotected String run() throws Exception {logger.info("HelloWorld Command Invoked");return "Hello " + name;}
}

run方法保存了我们要保护的所有依赖活动,该活动最终返回此特定实例中的参数化类型– String。 如果您是Netflix Rx-java库的粉丝,那么创建Hystrix命令的另一种方法如下:

import com.netflix.hystrix.HystrixCommandGroupKey;
import com.netflix.hystrix.HystrixObservableCommand;
import rx.Observable;public class HelloWorldObservableCommand extends HystrixObservableCommand<String> {private String name;public HelloWorldObservableCommand(String name) {super(HystrixCommandGroupKey.Factory.asKey("default"));this.name = name;}@Overrideprotected Observable<String> resumeWithFallback() {return Observable.just("Returning a Fallback");}@Overrideprotected Observable<String> construct() {return Observable.just("Hello " + this.name);}
}

在这里,“ construct”方法返回Rx-java Observable 。

使用Hystrix命令

现在我们有了一个Hystrix命令来包装我们的调用,它可以用很多不同的方式使用,让我们从最简单的同步调用开始–

HelloWorldCommand helloWorldCommand = new HelloWorldCommand("World");
assertEquals("Hello World", helloWorldCommand.execute());

或者,可以使它返回Future:

HelloWorldCommand helloWorldCommand = new HelloWorldCommand("World");
Future future = helloWorldCommand.queue();
assertEquals("Hello World", future.get());

或者,甚至可以使它返回Rx-Java可观察的:

HelloWorldCommand helloWorldCommand = new HelloWorldCommand("World");CountDownLatch l = new CountDownLatch(1);Observable<String> obs = helloWorldCommand.observe();
obs.subscribe(s -> logger.info("Received : " + s),t -> logger.error(t.getMessage(), t),() -> l.countDown()
);
l.await(5, TimeUnit.SECONDS);

该命令的Observable变体也沿相同的方向工作,但是我们应该对比一下小的行为差异:

HelloWorldObservableCommand helloWorldCommand = new HelloWorldObservableCommand("World");
logger.info("Completed executing HelloWorld Command");
Observable<String> obs = helloWorldCommand.observe();

这里有两种获取Observable的方法,一种是通过调用“ .observe()”的方法,另一种是以下方法:

HelloWorldObservableCommand helloWorldCommand = new HelloWorldObservableCommand("World");
Observable<String> obs = helloWorldCommand.toObservable();

另一个是以下使用“ .toObservable()”调用的内容:

HelloWorldObservableCommand helloWorldCommand = new HelloWorldObservableCommand("World");
Observable<String> obs = helloWorldCommand.toObservable();

区别在于,“。observe()”方法返回的是Hot Observable,可立即开始执行“ construct”方法,而“ .toObservable”的变体将返回“ Cold Observable”,除非已预订,否则不会调用“ construct”方法,请按以下方式说:

CountDownLatch l = new CountDownLatch(1);
obs.subscribe(System.out::println, t -> l.countDown(), () -> l.countDown());
l.await();

我在这里有更多信息。

请注意,尽管Hystrix Command不是Singleton,但使用Hystrix Command的典型方法是在需要的地方构造它,并在完成后将其处置。

后备和命令组密钥

在HelloWorldCommand的构造函数中,我调用了具有以下签名的超类构造函数方法:

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

该参数指定一个Hystrix“命令组”键,以及默认情况下是类的简单名称的Command Key,它控制着Hystrix行为的许多细节,下面是属性示例,我将稍后再回到这些细节:

hystrix.command.HelloWorldCommand.metrics.rollingStats.timeInMilliseconds=10000
hystrix.command.HelloWorldCommand.execution.isolation.strategy=THREAD
hystrix.command.HelloWorldCommand.execution.isolation.thread.timeoutInMilliseconds=1000
hystrix.command.HelloWorldCommand.execution.isolation.semaphore.maxConcurrentRequests=10
hystrix.command.HelloWorldCommand.circuitBreaker.errorThresholdPercentage=50
hystrix.command.HelloWorldCommand.circuitBreaker.requestVolumeThreshold=20
hystrix.command.HelloWorldCommand.circuitBreaker.sleepWindowInMilliseconds=5000hystrix.threadpool.default.coreSize=10
hystrix.threadpool.default.queueSizeRejectionThreshold=5

我们可能要控制的另一种行为是在对依赖服务的调用失败的情况下的响应,后备方法提供了这种行为,因此请考虑依赖服务始终失败的情况:

import com.netflix.hystrix.HystrixCommand;
import com.netflix.hystrix.HystrixCommandGroupKey;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;public class FallbackCommand extends HystrixCommand<String> {private static final String COMMAND_GROUP="default";private static final Logger logger = LoggerFactory.getLogger(FallbackCommand.class);public FallbackCommand() {super(HystrixCommandGroupKey.Factory.asKey(COMMAND_GROUP));}@Overrideprotected String run() throws Exception {throw new RuntimeException("Always fail");}@Overrideprotected String getFallback() {logger.info("About to fallback");return "Falling back";}
}

在这里,从属服务调用始终失败,并且以下测试中所示的响应将始终是fallback方法的响应:

FallbackCommand fallbackCommand = new FallbackCommand();
assertEquals("Falling back", fallbackCommand.execute());

监控方式

在总结基础之前,最好先演示一下Hystrix在Hystrix流和Hystrix仪表板方面的出色功能。 让我们从Hystrix流开始,如果通常在基于Java的Web应用程序中将其作为servlet启用,它会提供SSE实时统计流,有关Web应用程序中存在的Hystrix命令的行为。

由于我的演示基于基于Karyon2 Rx-Netty的应用程序,因此可以在此处查看我的配置。 Hystrix流中的信息有点太原始了,这是很棒的Hystrix仪表板所适合的地方–它使用Hystrix流,并显示有关每个Hystrix命令和不同底层线程池如何执行的实时汇总信息。 我这里有一个基于很棒的Spring-Cloud项目的示例Hystrix仪表板项目。 此处是一个示例仪表板:

Hystrix仪表板

结论

这涵盖了Hystrix的基础知识,还有很多工作要做,我将在下一篇博客文章中总结这些内容,其中包含一些高级Hystrix功能的详细信息。

翻译自: https://www.javacodegeeks.com/2015/10/gentle-introduction-to-hystrix-hello-world.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/356442.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Unity 继承MonoBehaviour下方法通过鼠标触控与物体交互

要通过鼠标的进入、离开、悬停、拖拽等动作实现与物体的交互时&#xff0c;我们可以使用继承MonoBehaviour的脚本下的与鼠标相关的方法。具体有以下方法&#xff1a; //当鼠标按下时被调用private void OnMouseDown(){Debug.Log("鼠标按下了");}//当鼠标按下并拖动时…

Collection中list集合的应用常见的方法

集合 &#xff1a; 用存放对象的容器(集合) Collection &#xff1a; 跟接口 &#xff1a; 单列集合 ---> List :有序的 &#xff0c;元素是可以重复的。 ---> Set : 无序的 &#xff0c;元素是不可以重复的。 Collectionz红常用的方…

js base64编码 java 解码_JavaScript字符串的Base64编码与解码

有时文本里包含一些不可打印的符号&#xff0c;而你需要把它们传输到服务器&#xff0c;这时我们会需要用到Base64编码。或者你需要把一个图片内容以文本格式嵌入到网页中&#xff0c;这时你也会用到 Base64 编码。所谓 Base64 是一种基于64个可打印字符来表示二进制数据的方法…

linux cmake 安装mysql5.5.11_以及更高版本_linux cmake 安装mysql5.5.11,以及更高版本

1、下载mysql5.5.12和cmakewgethttp://mirrors.sohu.com/mysql/MySQL-5.5/mysql-5.5.12-linux2.6-i686.tar.gzwget http://www.cmake.org/files/v2.8/cmake-2.8.4.tar.gz2、安装cmakemkdir /usr/local/cmake切换到存放cmake-2.8.4.tar.gz到目录tar zxvfcmake-2.8.4.tar.gzcd cm…

iOS中如何监测来电

http://blog.csdn.net/liujinlongxa/article/details/44207587转载于:https://www.cnblogs.com/it-k-50/p/6122844.html

maven 构建依赖树_Maven构建依赖项

maven 构建依赖树熟悉发行版和快照依赖关系的Maven和Gradle用户可能不了解TeamCity快照依赖关系&#xff0c;或者假定他们与Maven相关&#xff08;这是不正确的&#xff09;。 熟悉工件和快照相关性的TeamCity用户可能不知道&#xff0c;除了TeamCity提供的功能之外&#xff0c…

ssh图片上传 java_ssh上传并显示图片

struts部分&#xff1a;attribute"upfileForm"input"/upload/uploadfile.jsp"name"upfileForm"path"/upfile"scope"request"validate"true"type"com.yourcompany.struts.action.UpfileAction">publi…

安卓手机移动端页面为body设置overflow:hidden;不起作用

动态的改变body的样式&#xff0c;测试了可行 var scrollTop $("body").scrollTop();//body设置为fixed之后会飘到顶部&#xff0c;所以要动态计算当前用户所在高度 $("body").css({overflow:hidden,position: fixed,top: scrollTop*-1 }); $loadMask.css…

责任链设计模式示例

本文是我们名为“ Java设计模式 ”的学院课程的一部分。 在本课程中&#xff0c;您将深入研究大量的设计模式&#xff0c;并了解如何在Java中实现和利用它们。 您将了解模式如此重要的原因&#xff0c;并了解何时以及如何应用模式中的每一个。 在这里查看 &#xff01; 目录 …

HDU 5944 Fxx and string(暴力/枚举)

传送门 Fxx and string Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/65536 K (Java/Others)Total Submission(s): 1007 Accepted Submission(s): 422 Description Problem DescriptionYoung theoretical computer scientist Fxx get a string which co…

经典的java程序_Java经典程序

}}}-----------------结果&#xff1a;ABDCBDCB-----------------2.写出程序运行结果import java.lang.StringBuffer;public class Test2{public static void stringReplace(String str){str str.replace(j,i);}public static void bufferReplace(StringBuffer sbf){sbf sbf.…

继续OI

NOIP2016于2016.11.20日12:00正式结束。 我作为oi的生涯 或许会结束&#xff1f; 或者继续&#xff1f; 然而前途依然迷茫&#xff0c;我是否应该继&#xff1f;或是放弃&#xff1f; 距离省选还有3~4个月&#xff0c;我该何去何从&#xff1f; 虽然已经经历过联赛&#xff0c;…

java存储过程示例_安全密码存储–请勿做的事和Java示例

java存储过程示例安全存储密码的重要性 作为软件开发人员&#xff0c;我们最重要的职责之一就是保护用户的个人信息。 如果没有我们应用程序的技术知识&#xff0c;用户别无选择&#xff0c;只能相信我们正在履行这一责任。 令人遗憾的是&#xff0c;在密码方面&#xff0c;软件…

背包问题 贪心算法 java_JS基于贪心算法解决背包问题

前面我们分享了关于js使用贪心算法解决找零问题&#xff0c;本文我们接着为大家介绍JS基于贪心算法解决背包问题。贪心算法&#xff1a;在对问题求解时&#xff0c;总是做出在当前看来是最好的选择。也就是说&#xff0c;不从整体最优上加以考虑&#xff0c;他所做出的仅是在某…

Nginx配置proxy_pass

nginx配置proxy_pass&#xff0c;需要注意转发的路径配置 1、location /test/ { proxy_pass http://t6:8300; } 2、location /test/ { proxy_pass http://t6:8300/; } 上面两种配置&#xff0c;区别只在于proxy_pass转发的路径后是否带 “/” 针对情况1 如果访问url ht…

java代码耗尽内存_有关Java内存溢出及内存消耗的小知识

内存溢出原理&#xff1a;我们知道&#xff0c;Java程序本身是不能直接在计算机上运行的&#xff0c;它需要依赖于硬件基础之上的操作系统和JVM(Java虚拟机)。Java程序启动时JVM都会分配一个初始内存和最大内存给这个应用程序。这个初始内存和最大内存在一定程度上会影响应用程…

简单一致的Log4j2 Logger命名

在带有Java 7方法句柄的可移植记录器名称一文中 &#xff0c;我写了关于使用Java 7的方法句柄来命名类的记录器的文章。 我在那篇文章中说过&#xff0c;这种方法的优点包括记录器命名的一致性&#xff0c;避免了意外的代码复制和粘贴&#xff0c;这可能会导致将不同的类名用作…

第三周总结 类、对象、包

1.面向对象的特征有哪些&#xff1f;封装、继承、多态、&#xff08;抽象&#xff09;2.一个“.java”文件中是否可以有多个类&#xff08;不是内部类&#xff09;&#xff1f;有什么限制吗&#xff1f;可以有多个类&#xff0c;但是public的类只有一个&#xff0c;而且必须和j…

java服务器崩溃的原因_请求大神帮忙分析一下服务器崩溃原因

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼---- Minecraft Crash Report ----// Who set us up the TNT?Time: 14-6-11 上午12:52Description: Exception in server tick loopjava.lang.NoClassDefFoundError: scala/collection/Seqat java.lang.Class.forName0(Native Met…

VBA_Excel_教程:过程,函数

Sub s1()Debug.Print "s1"调用过程&#xff1a;无括号&#xff0c;加call提升可读性s2Call s2 End SubSub s2()Debug.Print "s2" End Sub 函数当过程用完全没有问题 Function f1()Debug.Print "f1"f2Call f2 End FunctionFunction f2()Debug.Pri…