hystrix应用 博客_用Hystrix保护您的应用程序

hystrix应用 博客

68747470733a2f2f6e6574666c69782e6769746875622e636f6d2f487973747269782f696d616765732f687973747269782782d6c6f676f2d7461676c696e652d3835302e706e67

在先前的帖子http://www.javacodegeeks.com/2014/07/rxjava-java8-java-ee-7-arquillian-bliss.html中,我们讨论了微服务以及如何使用(RxJava)的Reactive Extensions编排微服务。 但是,如果一项或多项服务因已停止或引发异常而失败,该怎么办? 在像微服务体系结构这样的分布式系统中,正常的情况是远程服务可能会失败,因此它们之间的通信应该是容错的,并且可以适当地管理网络呼叫中的延迟。

而这正是Hystrix所做的。 Hystrix是一个延迟容错库,旨在隔离对远程系统,服务和第三方库的访问点,停止级联故障,并在不可避免发生故障的复杂分布式系统中实现弹性。

在像微服务这样的分布式体系结构中,一个服务可能需要使用其他服务作为依赖项来完成其工作。 应用程序中通过网络或客户端库伸出的每一个可能导致网络请求的点都是失败的根源。 比故障更糟的是,这些应用程序还可能导致服务之间的延迟增加。 这给我们带来了另一个大问题,假设您正在Tomcat上开发一个服务,该服务将打开两个服务的两个连接,如果该服务中的一个花费比预期多的时间来发送响应,那么您将花费一个线程。 Tomcat池(当前请求之一)不执行任何操作,而是等待一个答案。 如果您的网站流量不高,这可能是可以接受的,但是如果您的流量很大,则所有资源可能会变得饱和并阻塞整个服务器。

Hystrix Wiki提供了这种情况下的模式:

soa-3-640

避免先前问题的方法是添加一个线程层,以将每个依赖项彼此隔离。 因此,每个依赖项(服务)可能包含一个线程池以执行该服务。 在Hystrix中,此层由HystricxCommand对象实现,因此对外部服务的每次调用都被包装为在不同的线程中执行。

Hystrix Wiki提供了此方案的模式:

soa-4-isolation-640

而且Hystrix还提供其他功能:

  • 每个线程都有一个超时,因此调用可能不会无限等待响应。
  • 在可行的情况下执行故障预置,以保护用户免受故障的影响。
  • 衡量成功,失败(客户端抛出的异常),超时和线程拒绝,并进行监视。
  • 实现断路器模式,如果错误百分比超过阈值,该模式将在一段时间内自动或手动停止所有对外部服务的请求。

因此,让我们从一个非常简单的示例开始:

public class HelloWorldCommand extends HystrixCommand<String> {public HelloWorldCommand() {super(HystrixCommandGroupKey.Factory.asKey("HelloWorld"));}@Overrideprotected String run() throws Exception {return "Hello World";}
}

然后,我们可以使用execute方法以同步方式执行该命令。

new HelloWorldCommand().execute();

尽管此命令是同步的,但它是在不同的线程中执行的。 默认情况下, Hystrix为在同一HystrixCommandGroupKey中定义的每个命令创建一个线程池。 在我们的示例中, Hystrix创建了一个线程池,该线程池链接到分组到HelloWorld线程池的所有命令。 然后对于每次执行,都会从池中获取一个线程来执行命令。

但是我们当然可以异步执行命令(这完全适合异步JAX-RS 2.0Servlet 3.0规范 )。 为此,只需运行:

Future<String> helloWorldResult = new HelloWorldCommand().queue();
//some more work
Stirng message = helloWorldResult.get();

实际上,同步调用是由Hystrix在内部实现的,它返回新的HelloWorldCommand()。queue()。get();。 内部。

我们已经看到我们可以同步和异步执行命令,但是还有第三种方法是使用RxJava进行React式执行(您可以在我之前的文章http://www.javacodegeeks.com/2014/07/中了解有关RxJava的更多信息rxjava-java8-java-ee-7-arquillian-bliss.html )。

为此,您只需要调用observe方法:

Observable<String> obs = new HelloWorldCommand().observe();
obs.subscribe((v) -> {System.out.println("onNext: " + v);
}

但是有时情况会出错,命令的执行可能会引发异常。 从run()方法抛出的所有异常 HystrixBadRequestException除外 计为失败并触发getFallback()和断路器逻辑(更多有关断路器)。 您不希望将其视为服务故障的任何业务异常(例如非法参数)都必须包装在HystrixBadRequestException中

但是服务故障会如何处理, Hystrix可以为我们做什么? 总之, Hystrix可以提供两件事:

  1. 一种在服务失败的情况下执行某些操作的方法。 此方法可以返回空的默认值或存根值,或者例如可以调用另一项服务,该服务可以完成与失败的服务相同的逻辑。
  2. 自动打开和关闭电路的某种逻辑。

倒退

发生异常( HystrixBadRequestException除外)时调用的方法是getFallback() 。 您可以重写此方法并提供自己的实现。

public class HelloWorldCommand extends HystrixCommand<String> {public HelloWorldCommand() {super(HystrixCommandGroupKey.Factory.asKey("HelloWorld"));}@Overrideprotected String getFallback() {return "Good Bye";}@Overrideprotected String run() throws Exception {//return "Hello World";throw new IllegalArgumentException();}
}

断路器

断路器 r是一种检测故障并避免不断接收相同错误的软件模式。 而且,如果服务是远程的,则可以在不等待TCP连接超时的情况下引发错误。

假设下一个典型示例:一个系统每秒需要访问数据库100次,但它失败了。 每秒将引发100次相同的错误,并且由于与远程数据库的连接意味着存在TCP连接,因此每个客户端将等待直到TCP超时到期。

因此,如果系统可以检测到服务出现故障并避免客户端在一段时间内发出更多请求,这将非常有用。 这就是断路器的作用。 对于每次执行,请检查电路是否断开(跳闸),这意味着发生了错误,并且该请求将不发送给服务,并且将执行后备逻辑。 但是,如果电路是闭合的,则该请求将被处理并且可以正常工作。

Hystrix维护一个统计数据库,其中包含成功请求与失败请求的数量。 当Hystrix在规定的空闲时间内检测到失败命令的阈值时,它将断开电路,因此以后的请求将能够尽快返回错误,而不必将资源消耗到可能处于脱机状态的服务中。 但好消息是, Hystrix还是负责关闭电路的负责人。 经过一段时间后, Hystrix将尝试再次运行传入的请求,如果此请求成功,则它将关闭电路,否则将保持电路断开。

Hystrix网站的下一张图中,您可以看到Hystrix与电路之间的相互作用。

hystrix流程图原始

既然我们已经了解了Hystrix的基础知识,那么让我们看看如何编写测试以检查Hystrix是否按预期工作。

测试前的最后一件事。 在Hystrix中,有一个名为HystrixRequestContext的特殊类。 此类包含状态并管理请求的生命周期。 例如,如果要Hystrix管理缓存结果或出于日志记录目的,则需要初始化此类。 通常,此类在启动业务逻辑之前(例如,在Servlet Filter中 )初始化,并在处理请求后结束。

让我们使用先前的HelloWorldComand来验证电路断开时是否调用了fallback方法。

public class HelloWorldCommand extends HystrixCommand<String> {public HelloWorldCommand() {super(HystrixCommandGroupKey.Factory.asKey("HelloWorld"));}@Overrideprotected String getFallback() {return "Good Bye";}@Overrideprotected String run() throws Exception {return "Hello World";}
}

和测试。 请记住,出于学术目的,我在测试中添加了很多断言。

@Test
public void should_execute_fallback_method_when_circuit_is_open() {//Initialize HystrixRequestContext to be able to get some metricsHystrixRequestContext context = HystrixRequestContext.initializeContext();HystrixCommandMetrics creditCardMetrics = HystrixCommandMetrics.getInstance(HystrixCommandKey.Factory.asKey(HelloWorldRestCommand.class.getSimpleName()));//We use Archaius to set the circuit as closed.ConfigurationManager.getConfigInstance().setProperty("hystrix.command.default.circuitBreaker.forceOpen", false);String successMessage = new HelloWorldRestCommand().execute();assertThat(successMessage, is("Hello World"));//We use Archaius to open the circuitConfigurationManager.getConfigInstance().setProperty("hystrix.command.default.circuitBreaker.forceOpen", true);String failMessage = new HelloWorldRestCommand().execute();assertThat(failMessage, is("Good Bye"));//Prints Request => HelloWorldRestCommand[SUCCESS][19ms], HelloWorldRestCommand[SHORT_CIRCUITED, FALLBACK_SUCCESS][0ms] System.out.println("Request => " + HystrixRequestLog.getCurrentRequest().getExecutedCommandsAsString());assertThat(creditCardMetrics.getHealthCounts().getTotalRequests(), is(2));assertThat(creditCardMetrics.getHealthCounts().getErrorCount(), is(1));}

这是一个非常简单的示例,因为execute方法和fallback方法非常简单,但是如果您认为execute方法可能包含复杂的逻辑,而fallback方法也可能是如此复杂(例如,从另一台服务器检索数据,则生成某种存根数据,…),然后编写集成或功能测试以验证所有这些有意义的流程。 请记住,有时您的后备逻辑可能取决于当前用户或其他用户的先前调用。

Hystrix还提供其他功能,例如兑现结果,因此在同一HystrixRequestContext中已经执行的任何命令可以返回缓存结果( https://github.com/Netflix/Hystrix/wiki/How-To-Use#Caching )。 它提供的另一个功能是折叠。 它支持将请求自动批处理为单个HystrixCommand实例执行。 它可以使用批处理大小和时间作为执行批处理的触发器。

如您所见, Hystrix是一个非常简单但功能强大的库,如果您的应用程序调用外部服务,则应考虑这一点。

我们不断学习,

亚历克斯


唱一首歌,你是钢琴家,今晚唱一首歌,好吧,我们都在想起旋律,而且你让我们感觉很好(钢琴家–比利·乔尔)

音乐: https : //www.youtube.com/watch?v = gxEPV4kolz0

翻译自: https://www.javacodegeeks.com/2014/09/defend-your-application-with-hystrix.html

hystrix应用 博客

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

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

相关文章

艾默生变频器报警PHP,艾默生ct变频器报警ou 这个CT的变频器报警UU怎么解决?

1, 这个CT的变频器报警UU怎么解决&#xff1f;(1) 控制板Q1(15050026)坏。(2) 7840坏&#xff1a;在变频器通电时&#xff0c;用直流档&#xff0c;黑接5脚&#xff0c;红分别接6,7,8脚&#xff0c;值为2.5,2.5,5为正常&#xff0c;否则7840坏。(3) 小板坏&#xff1a;在变频器…

Project Reactor展开方法

最近&#xff0c;我的一位同事向我介绍了Project Reactor类型的expand运算符&#xff0c;在这篇文章中&#xff0c;我想介绍几种使用它的方式。 展开分页结果 考虑在名为City的模型上基于Spring Data的存储库&#xff1a; import org.springframework.data.jpa.repository.Jpa…

同时买票是怎么实现的_去巴黎玩怎么买地铁票最划算?| 巴黎最全交通攻略

次票、天票、机场票……傻傻分不清楚。不会法语怎么办&#xff1f;什么时候买有优惠&#xff1f;看这一篇全知道​​巴黎作为国际大都市&#xff0c;交通还是非常方便的。基本上80%的巴黎景点都能坐地铁到达&#xff0c;就在我们平常所说的小巴黎里。整个巴黎岛&#xff08;Ile…

php输入地址查询,PHP查询用户IP所在地址

原创内容&#xff0c;转载请注明出处&#xff1a;https://www.myzhenai.com.cn/post/3042.html关键词&#xff1a;IP所在地址 IP地址 PHP获取ip地址相关内容&#xff1a;获取IP所处位置的Shell代码&#xff1a;https://www.myzhenai.com.cn/post/2917.htmlWordPress获取当前浏览…

swig模板 PHP,如何使用nodejs前端模板引擎swig

这次给大家带来如何使用nodejs前端模板引擎swig&#xff0c;使用nodejs前端模板引擎swig的注意事项有哪些&#xff0c;下面就是实战案例&#xff0c;一起来看一下。相对于jade&#xff0c;我还是更喜欢swig前端模板引擎&#xff0c;jade虽然语法简练高效了不少&#xff0c;但是…

redis是什么_什么是Redis?为什么我们要用Redis?

前言当结束Java和数据库的学习以后&#xff0c;你就会接触到Redis这个词&#xff0c;我第一次听到的时候脑海里就会浮现这两个问题&#xff1a;什么是Redis&#xff1f;为什么我们要用Redis&#xff1f;我了解完以后&#xff0c;写出来帮助大家能够更快的认识它。我们先来看它的…

性能php 教程,提高PHP性能效率的几个技巧

如何提高效率问题&#xff0c;往往同样的功能&#xff0c;不一样的代码&#xff0c;出来的效率往往大不一样。● 用单引号代替双引号来包含字符串&#xff0c;这样做会更快一些。因为PHP会在双引号包围的字符串中搜寻变量&#xff0c;单引号则不会&#xff0c;注意&#xff1a;…

python from numpy import,python zeros()使用(from numpy import *)-Go语言中文社区

参考&#xff1a;############################################################函数zeros()在模块numpy中&#xff1a;from numpy import *help(zeros)该函数功能是创建给定类型的矩阵&#xff0c;并初始化为0参数简洁&#xff1a;shape&#xff1a;可以是int类型数据&#x…

sqlmap绕过d盾_Waf功能、分类与绕过

## 一. waf工作原理Web应用防火墙是通过执行一系列针对HTTP/HTTPS的安全策略来专门为Web应用提供保护的一款产品。常见的系统攻击分为两类&#xff1a;- 一是利用Web服务器的漏洞进行攻击&#xff0c;如DDOS攻击、病毒木马破坏等攻击&#xff1b;- 二是利用网页自身的安全漏洞进…

JUnit5 TestSuite替代

JUnit4具有TestSuite类来聚合多个测试。 这在JUnit 5中不可用。通常&#xff0c;通过套件中的一堆命名测试进行的测试发现有些糟透了。 但是&#xff0c;如果目标不是测试发现&#xff0c;而是不同测试类之间的资源共享&#xff0c;那么创建父对象是有意义的。 JUnit 5提供了N…

junit:junit_简而言之,JUnit:测试隔离

junit:junit作为顾问&#xff0c;我仍然经常遇到程序员&#xff0c;他们对JUnit及其正确用法的理解最多。 这使我有了编写多部分教程的想法&#xff0c;以从我的角度解释要点。 尽管存在一些有关使用该工具进行测试的好书和文章&#xff0c;但是也许可以通过本动手实践系列中的…

msflexgrid允许大选择_选择复式楼、跃层和别墅的装修业主如何做好家里的楼梯...

点击上面蓝色字体关注&#xff01;装修图例 | 别墅装修 | 装潢装饰 | 样板楼梯 | 装修设计很多复式或者别墅的房子&#xff0c;楼梯是不可缺少的建筑&#xff0c;大部分楼梯是连接客厅以及卧室的&#xff0c;很多朋友都选择在楼梯上面铺地板&#xff0c;木地板的改装空间大&…

mysql 查询 系统字段 自然日_Mysql查询用户留存/留存率问题用户n日(内)留存、某日新增用户n日(内)留存...

Mysql查询用户留存/留存率语法计算某日的客户在第n日再次出现的概率--用户n日留存率。计算某日的客户在某个时间段内再次出现的概率--用户n日内留存率。计算某日新增的用户在第n日再次出现的概率--新用户n日留存率。计算某日新增的用户在某个时间段内再次出现的概率--新用户n日…

ajax 示例_通过示例了解挥发

ajax 示例我们已经花了几个月的时间来稳定Plumbr中的锁定检测功能 。 在此期间&#xff0c;我们遇到了许多棘手的并发问题。 许多问题是独特的&#xff0c;但是一种特殊类型的问题一直反复出现。 您可能已经猜到了–滥用volatile关键字。 我们已经发现并解决了许多问题&#x…

springboot 多线程_redis官方推荐:SpringBoot用这个,一键多线程

Lettuce是一个可伸缩的线程安全的Redis客户端&#xff0c;提供了同步&#xff0c;异步和响应式使用方式。 如果多线程避免阻塞和事务操作(如BLPOP和MULTI / EXEC)&#xff0c;则多个线程可共享一个连接。 Lettuce使用通信使用netty。 支持先进的Redis功能&#xff0c;如Sentine…

oracle查询最高一条记录,oracle 查询已有记录,上一条记录,下一条记录

oracle可以使用 lead、lag 函数来查询已有记录的下一条、上一条记录。表结构如下&#xff1a;如要查询Staffno是6-1102的前一条记录select * from staff where staff_no(select c.p from (select staff_no,lag(staff_no,1,0) over (order by staff_no) as p from staff) c wh…

使用Maven进行增量构建

这是2020年&#xff0c;如果您要启动任何新的基于Java的项目&#xff0c;则应优先选择gradle&#xff0c;但由于某些原因&#xff0c;如果您仍然对Maven感兴趣&#xff0c;那么您可能会发现这篇文章有用。 Maven Java / scala编译器插件对增量编译提供了不错的支持&#xff0c…

php删除菜单栏,如何删除WordPress站点健康状态面板和菜单项

下面由WordPress教程栏目给大家介绍删除WordPress站点健康状态面板和菜单项的方法&#xff0c;希望对需要的朋友有所帮助&#xff01;删除 WordPress 站点健康状态面板和菜单项WordPress站点健康功能始于 5.2 版&#xff0c;如不想显示这玩意&#xff0c;可以使用本文的方法删除…

colspan会影响内部单元格宽度失效_电感失效分析

电感失效分析01电感的作用我们通常所说的电感指的是电感器件&#xff0c;它是用绝缘导线(例如漆包线,沙包线等)绕制而成的电磁感应元件。在电路中&#xff0c;当电流流过导体时&#xff0c;会产生电磁场&#xff0c;电磁场的大小除以电流的大小就是电感。电感是衡量线圈产生电磁…

ZeptoN正在将程序放入Java

1.简介 Java编程语言或“ Java”于1995年引入。然而&#xff0c;在近25年的时间里&#xff0c;它增加了最初不是核心语言所具有的功能。 此类功能包括枚举&#xff0c;泛型&#xff0c;对基本C样式功能开关语句的许多增强&#xff0c;断言等。 Java是一种编程语言&#xff0c;随…