这是其他两篇文章的后续文章– 动机 ,说明为什么在分布式系统中需要类似Hystrix的内容,以及Hystrix的基本介绍 。

这将是我的Hystrix旅程的总结,其中包含各种属性的详细信息,可以对这些属性进行调整以更改Hystrix的行为,并涉及一些高级概念

调整Hystrix行为

Hystrix的配置在此Wiki中进行了解释,简要介绍了两个主要的组来控制Hystrix的属性,

  1. 命令属性
  2. ThreadPool属性

属性遵循Wiki中说明的优先顺序,这里我将重点介绍通过属性文件指定的属性。

对于示例命令,定义了以下方式:

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;}
}

可以调整的第一个行为是在线程池中执行命令还是与调用方(SEMAPHORE策略类型)执行线程相同。 如果执行在线程池中,则可以设置请求超时。

hystrix.command.HelloWorldCommand.execution.isolation.strategy=THREAD
hystrix.command.HelloWorldCommand.execution.isolation.thread.timeoutInMilliseconds=1000

第二种行为是断路器,它根据在滚动时间窗内收集的信息进行工作,这种方式进行配置,例如持续10秒:

hystrix.command.HelloWorldCommand.metrics.rollingStats.timeInMilliseconds=10000

在此窗口中,如果一定百分比的故障(例如50%)发生在请求阈值(例如10秒内发生20个故障),则电路断开,其配置如下所示:

hystrix.command.HelloWorldCommand.circuitBreaker.requestVolumeThreshold=20
hystrix.command.HelloWorldCommand.circuitBreaker.errorThresholdPercentage=50

电路断开后,它将保持这种状态并保持以下设置的时间,在这种情况下为5秒:

hystrix.command.HelloWorldCommand.circuitBreaker.sleepWindowInMilliseconds=5000

线程池设置是使用指定的组密钥控制的,在本示例中称为默认组密钥。 不过,也可以将特定的“线程池键”指定为构造函数的一部分。

hystrix.threadpool.default.coreSize=10
hystrix.threadpool.default.queueSizeRejectionThreshold=5

在这里,可以并行运行10个命令,而其他5个则保留在队列中,超过该队列将拒绝请求。

要求折叠

Tomaz Nurkiewicz在他的博客网站NoBlogDefFound中做了出色的解释请求折叠的工作 。 我的示例有些简化,请考虑以下情况,其中有很多请求要检索给定id的Person,方法如下:

public class PersonService {public Person findPerson(Integer id) {return new Person(id, "name : " + id);}public List<Person> findPeople(List<Integer> ids) {return ids.stream().map(i -> new Person(i, "name : " + i)).collect(Collectors.toList());}
}

该服务以固定响应进行响应,但假定该调用是对远程数据存储的。 还可以看到,该服务实现了一个批处理方法,以在给定ID列表的情况下检索人员列表。

请求折叠是一项功能,它将一段时间内发生的多个用户请求批处理为一个这样的远程呼叫,然后将响应散发回用户。

可以通过以下方式定义获取一组ID并获取人员响应的hystrix命令:

public class PersonRequestCommand extends HystrixCommand<List<Person>>{private final List<Integer> ids;private final PersonService personService = new PersonService();private static final Logger logger = LoggerFactory.getLogger(PersonRequestCommand.class);public PersonRequestCommand(List<Integer> ids) {super(HystrixCommandGroupKey.Factory.asKey("default"));this.ids = ids;}@Overrideprotected List<Person> run() throws Exception {logger.info("Retrieving details for : " + this.ids);return personService.findPeople(this.ids);}
}

到目前为止,非常简单,复杂的逻辑现在位于RequestCollapser中,如下所示:

package aggregate.commands.collapsed;import com.netflix.hystrix.HystrixCollapser;
import com.netflix.hystrix.HystrixCollapserKey;
import com.netflix.hystrix.HystrixCollapserProperties;
import com.netflix.hystrix.HystrixCommand;import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.function.Function;
import java.util.stream.Collectors;public class PersonRequestCollapser extends HystrixCollapser<List<Person>, Person, Integer> {private final Integer id;public PersonRequestCollapser(Integer id) {super(Setter.withCollapserKey(HystrixCollapserKey.Factory.asKey("personRequestCollapser")).andCollapserPropertiesDefaults(HystrixCollapserProperties.Setter().withTimerDelayInMilliseconds(2000)));this.id = id;}@Overridepublic Integer getRequestArgument() {return this.id;}@Overrideprotected HystrixCommand<List<Person>> createCommand(Collection<CollapsedRequest<Person, Integer>> collapsedRequests) {List<Integer> ids = collapsedRequests.stream().map(cr -> cr.getArgument()).collect(Collectors.toList());return new PersonRequestCommand(ids);}@Overrideprotected void mapResponseToRequests(List<Person> batchResponse, Collection<CollapsedRequest<Person, Integer>> collapsedRequests) {Map<Integer, Person> personMap = batchResponse.stream().collect(Collectors.toMap(Person::getId, Function.identity()));for (CollapsedRequest<Person, Integer> cr: collapsedRequests) {cr.setResponse(personMap.get(cr.getArgument()));}}
}

这里发生了一些事情,首先,参数化类型签名中的类型指示响应的类型(List <Person>),调用方期望的响应类型(Person)和请求的请求类型(请求的ID)。人)。 然后有两种方法,一种创建批处理命令,第二种将响应映射回原始请求。

现在,从用户的角度来看,这没有多大变化,就好像对单个命令一样进行调用,并且Request Collapsing处理批处理,分派和映射回响应。 这是示例测试的样子:

@Test
public void testCollapse() throws Exception {HystrixRequestContext requestContext = HystrixRequestContext.initializeContext();logger.info("About to execute Collapsed command");List<Observable<Person>> result = new ArrayList<>();CountDownLatch cl = new CountDownLatch(1);for (int i = 1; i <= 100; i++) {result.add(new PersonRequestCollapser(i).observe());}Observable.merge(result).subscribe(p -> logger.info(p.toString()), t -> logger.error(t.getMessage(), t), () -> cl.countDown());cl.await();logger.info("Completed executing Collapsed Command");requestContext.shutdown();
}

结论

Hystrix的功能远不止我在这里介绍的内容。 它确实是一个很棒的库,对于创建弹性系统至关重要。我已经开始欣赏设计这个出色的库所花费的大量思考过程。

翻译自: https://www.javacodegeeks.com/2015/11/gentle-introduction-to-hystrix-wrapup.html

Hystrix简介–总结相关推荐

  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简介– Hello World

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

  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. OpenCV中的内存泄露问题(cvLoadImage,cvCloneImage)
  2. springmvc 将大写转小写_Excel – 快速设置大小写中文数字顺序编号,拖动自动增序...
  3. Java程序中Timer的用法
  4. electron-vue脚手架项目初始化时提示: Failed to download repo simulatedgreg/electron-vue: Response code Server E
  5. Angular如何响应DOM event
  6. ubuntu小企鹅输fcitx入法乱码问题
  7. 计算机网络之物理层:1、接口特性、同步异步、串行并行、双工
  8. element的form表单中如何一行显示多el-form-item标签
  9. EDG 官宣 Clearlove(明凯)正式退役成为教练,你有什么想说的?
  10. java 分析图片文字大小时,剔除部分异常数据,思路梳理(格拉布斯准则)
  11. Sybase数据库按条件导出数据文件
  12. php opendir 不能用,php opendir()函数讲解及遍历目录实例
  13. Liunx 安装redis
  14. 雨落无声-开博啦........
  15. springboot连接数据库用户名密码加密
  16. 用户吐槽不能给安卓手机发视频,库克:“给你妈妈买台 iPhone !”
  17. python炒股学习软件_要炒股,学Python-LSTM学习
  18. r语言中正定矩阵由于误差不正定_浅谈「正定矩阵」和「半正定矩阵」
  19. 一种准确预测核糖核酸假尿苷位点的新方法
  20. 计算机硬盘磁道损坏有什么症状,计算机硬盘扇区损坏,读取数据时出现死机现象的解决方法...

热门文章

  1. python正则获取网页标签里面的内容
  2. 三班的孩子们,你们现在还好吗?
  3. 循环录入某学生 5 门课的成绩并计算平均分,如果某分数录入为负,停止录入并提示录入错误
  4. 去掉字符串后面所有的0 去掉字符串前面或后面的0;
  5. oracle spacial,Oracle Spacial(空间数据库)geometry元数据结构
  6. (转)公钥,私钥和数字签名这样最好理解
  7. 基于openfire源码开发插件
  8. 通过smack client + openfire server 实现 peer to peer communication
  9. java流与文件——操作文件
  10. 制作FAT12软盘以查看软盘的根目录条目+文件属性+文件内容