在先前的博客文章中,我谈到了需要像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功能的详细信息。

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

Hystrix简介– Hello World相关推荐

  1. Hystrix简介及简单代码示例

    Circuit Breaker:Hystrix Clientshttps://cloud.spring.io/spring-cloud-netflix/multi/multi__circuit_bre ...

  2. 【Spring Cloud总结】17.Hystrix简介及简单代码示例

    接上篇<16.超时机制,断路器模式简介>  Spring Cloud版本为Finchley.SR2版 上一篇我们介绍了超时机制以及断路器模式,并且引申出了Spring Cloud的断路器组 ...

  3. Hystrix简介–总结

    这是其他两篇文章的后续文章– 动机 ,说明为什么在分布式系统中需要类似Hystrix的内容,以及Hystrix的基本介绍 . 这将是我的Hystrix旅程的总结,其中包含各种属性的详细信息,可以对这些 ...

  4. Hystrix 简介和使用

    Hystrix 一.概念 二.使用 1. 环境搭建 2. 服务降级 3. 异常熔断 4. 自定义异常熔断器 5.Hystrix仪表盘监控 三.测试 1. 异常熔断 2. 超时熔断 3. 熔断器获得异常 ...

  5. Hystrix中文开发手册-Hystrix简介(Home)

    Hystrix 是什么 ? 为什么要使用Hystrix? Hystrix 可以解决什么问题? Hystrix 的设置原则是什么? Hystrix 如何实现这些设计目标? Hystrix 是什么? 在分 ...

  6. 熔断器Hystrix简介

    (1)熔断器是什么? 熔断器(fuse)是指当电流超过规定值时,以本身产生的热量使熔体熔断,断开电路的一种电器,如(空气开关) (2)什么是Hystrix 美[hɪst'rɪks] Hystrix是一 ...

  7. Hystrix熔断器简介

    1.微服务中的雪崩效应 什么是微服务中的雪崩效应呢? 微服务中,一个请求可能需要多个微服务接口才能实现,会形成复杂的调用链路. 扇入:代表着该微服务被调用的次数,扇入大,说明该模块复用性好 扇出:该微 ...

  8. Netflix Hystrix断路器简介与工作原理

    一.前言? 1.Netflix Hystrix断路器是什么? Netflix Hystrix是SOA/微服务架构中提供服务隔离.熔断.降级机制的工具/框架.Netflix Hystrix是断路器的一种 ...

  9. 一起来学Spring Cloud | 第五章:熔断器 ( Hystrix)

    在微服务项目中,一个系统可以分割成很多个不同的服务模块,不同模块之间我们通常需要进行相互调用.springcloud中可以使用RestTemplate+Ribbon和Feign来调用(工作中基本都是使 ...

最新文章

  1. ios .framework动态库重签名
  2. 哈尔滨金融学院计算机系学生会,哈尔滨金融学院计算机系实习报告(毕业分散实习).doc...
  3. java中文乱码decode_java中文乱码
  4. python图灵测试_最前沿:基于GAN和RL的思想来训练对话生成,通过图灵测试可期!...
  5. 研究生导师一般希望招什么样的研究生?
  6. C语言 static
  7. NOI题库答案 (1.7 字符串基础)(21 - 25)
  8. 京瓷打印机p5026cdn_京瓷p5026cdn打印机驱动
  9. 双网口设备 网关设置注意事项
  10. Google Earth Engine(GEE)——将原始影像进行升尺度计算(以海南省为例)
  11. 上波浪线符号复制_波浪线符号(word小技巧)
  12. 并行计算:循环程序并行化的一般方法
  13. Jxl解析Excel表格数据
  14. 华为服务器文件升级失败,升级连接服务器失败
  15. ios设备苹果手机 js时间字符串转时间戳后显示错误NAN
  16. 计算机科学数学基础及教材推荐(转)
  17. 前端培训,丁鹿学堂和达内浅析
  18. 案例分析---我是如何在谷歌财经发现一个XSS漏洞
  19. 检测到可疑访问 php,php.net被Chrome/Firefox浏览器标注为可疑站点
  20. 微软新一代操作系统win10X已经编译完毕

热门文章

  1. 2017蓝桥杯省赛---java---B---2(纸牌三角形)
  2. 以管理员身份运行IJ
  3. Java获取指定月份的最后一天
  4. maven项目不编译xml文件
  5. 机器学习性能评估指标(综合性总结)
  6. jvm(11)-晚期(运行期)优化
  7. 将模板方法模式应用到kmeans聚类算法
  8. java集合——数组列表(ArrayList)+散列集(HashSet)
  9. 轮播有可能出现的问题
  10. 纹理和基元_Java的精妙之处,包括基元和变量参数数组