Hystrix简介–总结
这是其他两篇文章的后续文章– 动机 ,说明为什么在分布式系统中需要类似Hystrix的内容,以及Hystrix的基本介绍 。
这将是我的Hystrix旅程的总结,其中包含各种属性的详细信息,可以对这些属性进行调整以更改Hystrix的行为,并涉及一些高级概念
调整Hystrix行为
Hystrix的配置在此Wiki中进行了解释,简要介绍了两个主要的组来控制Hystrix的属性,
- 命令属性
- 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简介–总结相关推荐
- Hystrix简介及简单代码示例
Circuit Breaker:Hystrix Clientshttps://cloud.spring.io/spring-cloud-netflix/multi/multi__circuit_bre ...
- 【Spring Cloud总结】17.Hystrix简介及简单代码示例
接上篇<16.超时机制,断路器模式简介> Spring Cloud版本为Finchley.SR2版 上一篇我们介绍了超时机制以及断路器模式,并且引申出了Spring Cloud的断路器组 ...
- Hystrix简介– Hello World
在先前的博客文章中,我谈到了需要像Netflix Hystrix这样的库的动机. 在这里,我将跳入一些非常基本的方法来开始使用Hystrix,并在更复杂的用例中进行后续介绍. 你好,世界 以下是&qu ...
- Hystrix 简介和使用
Hystrix 一.概念 二.使用 1. 环境搭建 2. 服务降级 3. 异常熔断 4. 自定义异常熔断器 5.Hystrix仪表盘监控 三.测试 1. 异常熔断 2. 超时熔断 3. 熔断器获得异常 ...
- Hystrix中文开发手册-Hystrix简介(Home)
Hystrix 是什么 ? 为什么要使用Hystrix? Hystrix 可以解决什么问题? Hystrix 的设置原则是什么? Hystrix 如何实现这些设计目标? Hystrix 是什么? 在分 ...
- 熔断器Hystrix简介
(1)熔断器是什么? 熔断器(fuse)是指当电流超过规定值时,以本身产生的热量使熔体熔断,断开电路的一种电器,如(空气开关) (2)什么是Hystrix 美[hɪst'rɪks] Hystrix是一 ...
- Hystrix熔断器简介
1.微服务中的雪崩效应 什么是微服务中的雪崩效应呢? 微服务中,一个请求可能需要多个微服务接口才能实现,会形成复杂的调用链路. 扇入:代表着该微服务被调用的次数,扇入大,说明该模块复用性好 扇出:该微 ...
- Netflix Hystrix断路器简介与工作原理
一.前言? 1.Netflix Hystrix断路器是什么? Netflix Hystrix是SOA/微服务架构中提供服务隔离.熔断.降级机制的工具/框架.Netflix Hystrix是断路器的一种 ...
- 一起来学Spring Cloud | 第五章:熔断器 ( Hystrix)
在微服务项目中,一个系统可以分割成很多个不同的服务模块,不同模块之间我们通常需要进行相互调用.springcloud中可以使用RestTemplate+Ribbon和Feign来调用(工作中基本都是使 ...
最新文章
- OpenCV中的内存泄露问题(cvLoadImage,cvCloneImage)
- springmvc 将大写转小写_Excel – 快速设置大小写中文数字顺序编号,拖动自动增序...
- Java程序中Timer的用法
- electron-vue脚手架项目初始化时提示: Failed to download repo simulatedgreg/electron-vue: Response code Server E
- Angular如何响应DOM event
- ubuntu小企鹅输fcitx入法乱码问题
- 计算机网络之物理层:1、接口特性、同步异步、串行并行、双工
- element的form表单中如何一行显示多el-form-item标签
- EDG 官宣 Clearlove(明凯)正式退役成为教练,你有什么想说的?
- java 分析图片文字大小时,剔除部分异常数据,思路梳理(格拉布斯准则)
- Sybase数据库按条件导出数据文件
- php opendir 不能用,php opendir()函数讲解及遍历目录实例
- Liunx 安装redis
- 雨落无声-开博啦........
- springboot连接数据库用户名密码加密
- 用户吐槽不能给安卓手机发视频,库克:“给你妈妈买台 iPhone !”
- python炒股学习软件_要炒股,学Python-LSTM学习
- r语言中正定矩阵由于误差不正定_浅谈「正定矩阵」和「半正定矩阵」
- 一种准确预测核糖核酸假尿苷位点的新方法
- 计算机硬盘磁道损坏有什么症状,计算机硬盘扇区损坏,读取数据时出现死机现象的解决方法...
热门文章
- python正则获取网页标签里面的内容
- 三班的孩子们,你们现在还好吗?
- 循环录入某学生 5 门课的成绩并计算平均分,如果某分数录入为负,停止录入并提示录入错误
- 去掉字符串后面所有的0 去掉字符串前面或后面的0;
- oracle spacial,Oracle Spacial(空间数据库)geometry元数据结构
- (转)公钥,私钥和数字签名这样最好理解
- 基于openfire源码开发插件
- 通过smack client + openfire server 实现 peer to peer communication
- java流与文件——操作文件
- 制作FAT12软盘以查看软盘的根目录条目+文件属性+文件内容