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,一经查实,立即删除!

相关文章

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

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

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…

责任链设计模式示例

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

使用JUnit规则进行干净的集成测试

JUnit Rules的优势&#xff0c;尤其是在进行集成测试时&#xff0c;几乎不能被高估。 在本文中&#xff0c;我们将阐明ExternalResource扩展的有用性。 在我们必须使用抽象外部资源的第三方库的情况下&#xff0c;这些简化了灯具控制。 作为示例&#xff0c;我们将看看如何基于…

winform基础窗体设置及基础控件

WinForm - 也叫做C/S 客户端 另&#xff1a;B/S是 网页端 客户端应用程序 - 是需要安装在用户电脑上才可以使用的程序 特点&#xff1a; 不需要联网也可以打开使用部分功能&#xff0c;但是现在的情况是许多功能依然需要互联网的支持&#xff0c;代码部分在用户电脑上执行 使用…

【FastJSON】解决FastJson中“$ref 循环引用”的问题

0、开发环境 SSH&#xff0c;EasyUI&#xff0c;MySQL 1、需求要求&#xff1a; (1)首先获取所有的贷款订单数据&#xff0c;即List <LoanOrder>。 (2)然后从单个贷款订单实体LoanOrder去访问贷款人实体Loaner的信息。 2、实体之间的关系描述 (1)LoanOrder实体与Loaner…

JavaFX真实世界应用程序:EIZO CuratOR Caliop

JavaFX Real-World应用程序第四号称为Caliop 。 它是EIZO为医院手术室开发的CuratOR解决方案的前端。 前端在壁挂式控制台上运行&#xff0c;并允许操作团队查找有关患者的信息&#xff0c;控制各种视频源到不同监视器的路由&#xff0c;录制视频&#xff0c;拍摄照片/剧照。 …

netbeans代码提示_NetBeans可用性提示

netbeans代码提示的Java IDE都来了&#xff0c;因为在很长的路要走天的JBuilder的 &#xff08;尽管JBuilder中似乎是一个值得欢迎提前在时间&#xff09;。 当今的Java IDE&#xff08;例如NetBeans &#xff0c; Eclipse &#xff0c; IntelliJ IDEA和JDeveloper &#xff09…

推荐文章:机器学习:“一文读懂机器学习,大数据/自然语言处理/算法全有了...

PS:文章主要转载自CSDN大神"黑夜路人"的文章: http://blog.csdn.NET/heiyeshuwu/article/details/43483655 本文主要对机器学习进行科普,包括机器学习的定义、范围、方法,包括机器学习的研究领域&#xff1a;模式识别、计算机视觉、语音识别、自然语言…

java比较炫的登录界面_html+css实现漂亮的透明登录页面,HTML实现炫酷登录页面...

承蒙各位小伙伴的支持&#xff0c;鄙人有幸入围了《CSDN 2020博客之星》的前200名&#xff0c;现在进入投票环节&#xff0c;如果我平时写的文章和分享对你有用的话&#xff0c;请每天点击一下这个链接&#xff0c;投上你们宝贵的一票吧&#xff01;谢谢&#xff01;❤️ 每一票…

OpenMap教程第2部分–使用MapHandler构建基本地图应用程序–第1部分

1.简介 在第一个教程中&#xff0c;我们创建了一个基本的OpenMap GIS应用程序&#xff0c;该应用程序在JFrame中显示一个从文件系统加载的具有一个形状图层的地图。 该教程基于com.bbn.openmap.app.example.SimpleMap 。 在该教程中&#xff0c;我们使用了以下OpenMap类&#x…

java rx.observable_Rxjava2 Observable的条件操作符详解及实例

简要&#xff1a;需求了解&#xff1a;在使用 Rxjava 开发中&#xff0c;经常有一些各种条件的操作 &#xff0c;如比较两个 Observable 谁先发射了数据、跳过指定条件的 Observable 等一系列的条件操作需求&#xff0c;那么很幸运&#xff0c; Rxjava 中已经有了很多条件操作符…

Linux poll 和 select 机制

poll select 介绍 使用非阻塞 I/O 的应用程序常常使用 poll, select, 和 epoll 系统调用. poll, select 和 epoll 本质上有相同的功能: 每个允许一个进程来决定它是否可读或者写一个 或多个文件而不阻塞. 这些调用也可阻塞进程直到任何一个给定集合的文件描述符可用来 读或写.…

hprof 不大 泄露_HPROF –内存泄漏分析教程

hprof 不大 泄露本文将为您提供有关如何通过生成和分析Sun HotSpot JVM HPROF堆转储文件来分析JVM内存泄漏问题的教程。 一个现实的案例研究将用于此目的&#xff1a;Weblogic 9.2内存泄漏影响Weblogic Admin服务器。 环境规格 Java EE服务器&#xff1a;Oracle Weblogic Ser…

投资银行对Java进行的二十大核心面试问答

这是在金融领域&#xff08;主要是大型投资银行&#xff09;共享Java核心访谈问题和答案的新系列。 在JP Morgan&#xff0c;Morgan Stanley&#xff0c;Barclays或Goldman Sachs上会问许多这些Java面试问题。 银行主要从多线程 &#xff0c; 集合 &#xff0c;序列化&#xff…

java 支付重复问题_Airbnb支付系统如何在分布式环境下避免重复打款

原文链接&#xff1a;https://medium.com/airbnb-engineering/avoiding-double-payments-in-a-distributed-payments-system-2981f6b070bbAirbnb一直在将其基础架构迁移到面向服务的体系结构(SOA)。 SOA具有许多优势&#xff0c;例如使开发人员能够专业化并具有更快迭代的能力。…

myeclipse配置java8_MyEclipse 2017配置Tomcat8

MyEclipse 2017的配置其实跟MyEclipse 2015的比较一致&#xff0c;再往之前的就有出入了。不得不吐槽其卡&#xff0c;跟Eclipse不在一个量级上呀。。。一、配置转自&#xff1a;http://www.xuexila.com/diannao/diy/2788109.html工具/原料myeclipse 2017tomcat8 服务器方法/步…

MySQL在Django框架下的基本操作(MySQL在Linux下配置)

注&#xff1a;本文已迁移至CSDN&#xff0c;后续的更新也会在CSDN。 http://blog.csdn.net/houchaoqun_xmu/article/details/53813633 http://blog.csdn.net/houchaoqun_xmu 【原】本文根据实际操作主要介绍了Django框架下MySQL的一些常用操作&#xff0c;核心内容如下&#x…

Clean Sheet – Windows 10的人体工程学Eclipse主题

Clean Sheet是适用于Windows 10的符合人体工程学的Eclipse主题。它基于干净&#xff0c;低眩光的外观和感觉&#xff0c;旨在减轻视觉疲劳和眼睛疲劳。 它融合了均衡的颜色选择&#xff0c;可以突出谐波语法并注重可读性。 除自定义滚动条外&#xff0c;它还努力满足现代美学要…

CentOS上安装MyCat-MySQL

1、安装JDK&#xff0c;要求JDK7以上。 2、下载MyCat&#xff0c;地址。 3、解压Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz&#xff0c;到usr/local/Mycat目录下。 4、添加用户Mycat。 [rootlocalhost Desktop]# useradd Mycat [rootlocalhost Desktop]# passwd M…