hystrix熔断 简介_Hystrix简介– Hello World

hystrix熔断 简介

在以前的博客文章中,我介绍了需要像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启用,它将提供有关Web应用程序中Hystrix命令的行为的实时统计信息的SSE流。

由于我的演示基于基于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

hystrix熔断 简介

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

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

相关文章

php中哪个函数用于读取文件,PHP内置函数fget读取文件

php fgets()函数从文件指针读取一行语法:fgets(file,length)参数说明必需的. 指定姚要读取的文件长度可选. 指定姚都区的字节数. 默认值为102字节从文件所指向的文件中读取一行&#xff0c;并返回最大长度为1个字节的字符串. 遇到换行符(包含在返回值中&#xff0c;)&#xff0…

c++返回指针时候注意提防_提防Java中的函数式编程!

c返回指针时候注意提防这对函数式编程并不会造成太大的影响&#xff0c;这真棒。 这是关于某些实践的警告&#xff0c;您很可能会将其应用于您的代码&#xff0c;而这是完全错误的&#xff01; 。 高阶函数对于函数式编程是必不可少的&#xff0c;因此&#xff0c;谈论它们将帮…

centos php支持yaf,CentOS环境下给PHP7.0安装yaf扩展

|CentOS环境下给PHP7.0安装yaf扩展在CentOS环境下给PHP7.0安装yaf扩展&#xff0c;首先要知道PHP的安装目录在哪里&#xff0c;以我当前的路径为例&#xff0c;在/usr/local/php目录下。下一步需要下载扩展包&#xff0c;进入http://pecl.php.net/package/yaf寻找符合版本要求的…

linux内核编译如何选择cpu类型,Ubuntu内核编译和CPU Hot-Plug特性配置全过程及遇到问题记录...

最近编译Palacios需要linux的内核支持cpu Hot-Plug(内存热插拔)特性&#xff0c;无奈我机器上安装的Ubuntu10.04系统默认不支持内存热插拔特性&#xff0c;所以需要修改配置文件并重新编译linux内核&#xff0c;然后就开始了漫长的linux内核编译过程&#xff0c;幸好有个大神帮…

jsf教程_JSF范围教程– JSF / CDI会话范围

jsf教程会话作用域跨越多个HTTP请求-响应周期&#xff08;理论上是无限的&#xff09;。 当您需要每个HTTP请求-响应周期进行一次交互时&#xff0c;请求作用域在任何Web应用程序中都非常有用。 但是&#xff0c;当您需要对属于用户会话的任何HTTP请求-响应周期可见的对象时&…

linux查询设备文件信息失败怎么办,Linux下使用blkid命令查询设备及文件系统信息的方法...

在Linux下可以使用blkid命令对查询设备上所采用文件系统类型进行查询。blkid主要用来对系统的块设备(包括交换分区)所使用的文件系统类型、LABEL、UUID等信息进行查询。要使用这个命令必须安装e2fsprogs软件包。直接使用blkid可列出当前系统中所以已挂载文件系统的类型。默认情…

将MongoDB集成到您的Spring项目中

本文展示了如何通过注释配置将MongoDB集成到您的spring项目中。 我们将从Gradle配置开始。 group com.gkatzioura.spring version 1.0-SNAPSHOTbuildscript {repositories {mavenCentral()}dependencies {classpath("org.springframework.boot:spring-boot-gradle-plugi…

linux 内存一直在增加,linux – 缓存内存和共享内存总和超过总内...

所有共享内存也计为缓存.共享内存是在内部使用tmpfs实现的. tmpfs实现为页面缓存的瘦包装器,只是没有任何后备存储(除了tmpfs是可交换的).男人自由不解释这个.至少在我的系统上(由procps-ng提供,最后更新2016-06-03).抱歉.所有man free告诉你,缓存是从/ proc / meminfo中的缓存…

vertx rest 跨域_在基于简单Vertx Rest的应用程序上为REST资源设置基本响应HTTP标头...

vertx rest 跨域我是Vert.x的新手&#xff0c;但作为Java开发人员&#xff08;辛勤工作&#xff09;&#xff0c;与NodeJS或其他任何基于Reactor的框架/库相比&#xff0c;我觉得它更加有趣并且很有前途。 因此&#xff0c;我正在使用Vert.x实现一个非常简单的Restful API。 今…

linux rpm mysql mysql_config,Linux CentOS6 mysql rpm安装

选择操作系统及版本&#xff1a;点击5.6版本链接将下载好的文件上传至服务器下面开始安装&#xff1a;检查是是否有mysql的包# rpm -qa | grep -i mysql删除原有包# yum -y remove mysql-libs*开始安装下载好的三个文件&#xff1a;# rpm -ivh MySQL-server-5.6.38-1.el6.x86_6…

java 可视化_可视化Java 9模块关系

java 可视化正如我在之前的文章中所述 &#xff0c;我已经在Java 9 Jigsaw构建上运行Eclipse Neon了一段时间&#xff0c;并且没有任何问题。 我在周末花了几个小时来修改一些模块化工具的想法。 我为Eclipse Neon写了一个小插件&#xff0c;可视化了各个模块之间的连接。 现…

zybo的linux开发教程,Zybo全栈开发入门教程——连载三:创建Linux设备驱动和应用程序...

作者&#xff1a;Commanderfranz&#xff0c;编译&#xff1a; kenshin通过前面两篇文章我们不仅创建的自定义IP模块还移植了Linux操作系统&#xff0c;今天这篇文章的内容是将这两部分联系起来&#xff0c;其实我们创建的myLed IP相对于Linux操作系统可以是它的一个底层设备&a…

jwt令牌_JWT –生成和验证令牌–示例

jwt令牌JWT提供了一种非常有趣的方式来表示可以验证和信任的应用程序之间的声明。 我的目标是展示一个小的样本&#xff0c;它使用出色的Nimbus JOSE JWT库来生成和验证令牌。 总览 进行介绍的最佳地点之一是这里 。 简而言之&#xff0c;要从jwt.io网站的资料中借用&#xf…

linux 二进制差分工具,打造Android万能的软件更新库

今日科技快讯阿里星球今天在苹果商店发布的更新动态显示&#xff0c;其将在近期停止APP内的音乐服务&#xff0c;用户可以通过新版本内的指引和说明&#xff0c;导出本地音乐。这意味着上线八个月后&#xff0c;阿里星球做出了一个重大决定&#xff1a;停止音乐服务后&#xff…

jboss eap 7_JBoss EAP 7快速入门

jboss eap 7现在&#xff0c; 最新的Red Hat JBoss企业应用平台7的beta版已经发布&#xff0c;现在是时候探索可用的Java EE 7 快速入门并使用JBoss Developer Studio &#xff08;JDBS&#xff09;部署您的第一个应用程序了。 快速入门演示了JBoss EAP&#xff0c;Java EE 7和…

lambda 分类聚合_使用Java 8 Lambda,流和聚合

lambda 分类聚合总览 在本文中&#xff0c;我们将介绍使用Java 8 lambda&#xff0c;流和聚合来过滤和处理Collection中的对象。 这篇文章中的所有代码都可以在此处的 BitBucket中找到 。 对于此示例&#xff0c;我们将创建许多对象&#xff0c;这些对象代表我们IT基础架构中的…

linux下kegg注释软件,KEGG功能注释工具 KofamKOALA 安装与使用

KEGG数据库&#xff0c;即京都基因和基因组百科全书(Kyoto Encyclopedia of Genes and Genomes)&#xff0c;是系统分析基因功能、基因组信息的数据库。KofamKOALA是一个方便的KEGG功能注释工具&#xff0c;由创建KEGG的京都大学化研所生物信息中心学者在2019年11月发表于Bioin…

jooq_jOOQ API设计缺陷的怪异事件

jooqjOOQ是内部特定于域的语言&#xff08;DSL&#xff09; &#xff0c;它以Java&#xff08;宿主语言&#xff09;建模SQL语言&#xff08;外部DSL&#xff09;。 这篇热门文章描述了jOOQ API的主要机制&#xff1a; Java Fluent API设计器速成课程 。 任何人都可以根据该文…

linux镜像文件不要大于4g,Systemback制做大于4G的Ubuntu系统镜像

1 安装Systemback依此执行以下命令。sudo apt-get updatesudo add-apt-repository ppa:nemh/systembacksudo apt-get update && sudo apt-get install systemback unionfs-fuse安装完成&#xff1a;2 使用Systemback生成镜像文件输入管理员密码&#xff0c;打开后界面以…

黑马2016java_2016年成功的Java开发人员简介

黑马2016java2015年即将结束。 现在该总结过去一年中已完成的工作和未完成的工作。 此外&#xff0c;现在是预测下一个2016年的好时机。 您已经猜到这篇文章是关于2016年理想的Java开发人员的。 我想给你一个惊喜&#xff0c;这次我更改了预测的格​​式。 为了使预测更加客观…