在我们的日常开发中,有些时候需要和第三方系统进行对接操作,或者调用其他系统的 api 接口,但是我们不能保证这些第三方系统的接口一定是稳定的,当系统中产生大量的流量来访问这些第三方接口,这些第三方系统的接口响应慢时,如何保证我们自己的系统不被这些第三方系统的接口耗费完系统的资源,导致我们自己的系统崩溃。为了避免这种情况的发生,我们应该将这些第三方系统的接口进行隔离访问,将他们分配到一个单独的线程池中进行处理,或给他们固定的资源,并且当出现失败时,做好相应的回退处理。 此时我们就可以借助 hystrix 来完成这个需求,当然 hystrix 能完成的功能远不止如此。 hystrix的Wiki地址
此文简单记录一下 hystrix 的各种配置,并在文末给出一个可以运行的 例子

一、hystrix的各种配置

public class SelectProductCommand extends HystrixCommand<Product> {
private ProductService productService;
private String productId;
public SelectProductCommand(ProductService productService, String productId) {
super(
Setter
// 配置全局唯一标识服务分组的名称 当我们进行监控时,相同分组的服务会聚合在一起,必填项
.withGroupKey(HystrixCommandGroupKey.Factory.asKey("group-product"))
// command key ,如果不进行配置,默认为类的 SimpleName,最好唯一
.andCommandKey(HystrixCommandKey.Factory.asKey("command-selectOne(String)"))
// 配置命令的一些参数
.andCommandPropertiesDefaults(
HystrixCommandProperties.Setter()
// 是否启动超时处理 默认为 true
.withExecutionTimeoutEnabled(true)
// 超时时间为 10s
.withExecutionTimeoutInMilliseconds(10000)
// 使用线程池进行隔离
.withExecutionIsolationStrategy(HystrixCommandProperties.ExecutionIsolationStrategy.THREAD)
// 隔离测试为 THREAD 时,执行线程执行超时时,是否进行中断处理 默认为 true
.withExecutionIsolationThreadInterruptOnTimeout(true)
// 当 Future#cancel(true) 是否进行中断处理 默认为 false
.withExecutionIsolationThreadInterruptOnFutureCancel(true) // 打开短路器
.withCircuitBreakerEnabled(true)
// 如果在一个采样时间窗口内,失败率超过该配置,则自动打开熔断开关实现降级处理,即快速失败。默认配置下采样周期为10s,失败率为50%
.withCircuitBreakerErrorThresholdPercentage(50)
// 在短路器闭合情况下,在进行失败率判断之前,一个采样周期内必须进行至少N个请求才能进行采样统计,目的是有足够的采样使得失败率计算正确,默认为20
.withCircuitBreakerRequestVolumeThreshold(60)
// 短路器闭合的重试时间窗口,且在该时间窗口内只允许一次重试。即在熔断开关打开后,在该时间窗口允许有一次重试,如果重试成功,则将重置Health采样统计并闭合断路器开关实现快速恢复,否则断路器开关还是打开状态,执行快速失败。
.withCircuitBreakerSleepWindowInMilliseconds(10000)
// 是否强制关闭断路器,如果强制关闭则请求不会进行 fallback 处理
.withCircuitBreakerForceClosed(false)
// 是否强制打开短路器,如果打开了那么将会直接进行降级处理
.withCircuitBreakerForceOpen(false) // 是否启用降级处理 默认是 true
.withFallbackEnabled(true)
// fallback方法的信号量配置,配置getFallback方法并发请求的信号量,如果请求超过了并发信号量限制,则不再尝试调用getFallback方法,而是快速失败,默认信号量为10
.withFallbackIsolationSemaphoreMaxConcurrentRequests(100) )
// 配置全局唯一标识线程池的名称 相同名称的线程池是同一个 如果不进行配置, 默认是 分组的名称
.andThreadPoolKey(HystrixThreadPoolKey.Factory.asKey("select-product-thread-pool"))
// 线程池属性配置
.andThreadPoolPropertiesDefaults(
HystrixThreadPoolProperties.Setter()
// 配置核心线程数的大小
.withCoreSize(5)
// 配置最大的线程数大小
.withMaximumSize(10)
// 允许最大线程数超过核心线程数,默认是 false ,如果这个值不为 true ,则上方配置的 withMaximumSize(10) 不会生效
.withAllowMaximumSizeToDivergeFromCoreSize(true)
// 线程池中空闲线程的生存时间
.withKeepAliveTimeMinutes(5)
// 配置线程池队列的最大大小
.withMaxQueueSize(500)
// 限制当前队列的大小,通过改变这个参数,可以实现动态改变队列的大小 当队列的大小超过 这个值 时会fallback
.withQueueSizeRejectionThreshold(490)
)
); this.productService = productService;
this.productId = productId;
} @Override
protected Product run() throws Exception {
log.info("----> Run Thread Name:{}", Thread.currentThread().getName());
return productService.selectOne(productId);
} /**
* 1、最大并发数受 FallbackIsolationSemaphoreMaxConcurrentRequests 限制,当超过这个值时,不会进行 fallback 处理,直接失败
* 2、该方法最好不要进行网络访问,应该返回降级数据
* 3、如果必须要走网络请求,那么最好调用另外一个 Command 命令
*
* @return
*/
@Override
protected Product getFallback() {
log.info("----> FallBack Thread Name:{}", Thread.currentThread().getName());
Optional.ofNullable(getFailedExecutionException()).ifPresent(exception -> log.error(exception.getMessage(), exception));
return Product.builder().productName("服务降级").build();
}
}

   hystrix使用线程池隔离时,线程池大小线程的配置:

每秒的访问峰值 * 99%的响应时间(s) + 预留线程数

二、使用 @HystrixCommand 的方式和注意事项

@HystrixCommand配置参考代码:https://gitee.com/huan1993/hystrix/tree/master/order-consumer-annotation-hystrix

三、进入 fallback 的时机

            1、执行方法抛出了异常,非 HystrixBadRequestException 异常

            2、方法执行超时了

            3、断路器打开了

            4、hystrix线程池拒绝了

四、隔离机制

         hystrix中存在2中隔离机制,THREAD 隔离和 SEMAPHORE(信号量) 隔离。

1、THREAD 隔离,它在一个单独的线程上执行,和调用线程不是在同一个线程上

2、SEMAPHORE 隔离,它和调用线程在同一个线程上

3、当我们继承 HystrixCommand 类时,建议使用 THREAD 隔离

4、当我们继承 HystrixObservableCommand 类时,建议使用 SEMAPHORE 隔离

5、一般情况下,我们使用线程隔离即可,SEMAPHORE隔离一般只适用非网络调用。

五、代码

代码如下:https://gitee.com/huan1993/hystrix

hystrix的配置说明的更多相关文章

  1. SpringCloud学习系列之三----- 断路器(Hystrix)和断路器监控(Dashboard)

    前言 本篇主要介绍的是SpringCloud中的断路器(Hystrix)和断路器指标看板(Dashboard)的相关使用知识. SpringCloud Hystrix Hystrix 介绍 Netfl ...

  2. 玩转Spring Cloud之熔断降级(Hystrix)与监控

    本文内容导航目录: 前言:解释熔断降级一.搭建服务消费者项目,并集成 Hystrix环境 1.1.在POM XML中添加Hystrix依赖(spring-cloud-starter-netflix-h ...

  3. Spring Cloud(Dalston.SR5)--Feign 与 Hystrix 断路器整合

    创建项目 要使 Feign 与 Hystrix 进行整合,我们需要增加 Feign 和 Hystrix 的依赖,修改 POM.xml 中增加以下依赖项如下: <?xmlversion=" ...

  4. Spring Cloud中Hystrix、Ribbon及Feign的熔断关系是什么?

    导读 今天和大家聊一聊在Spring Cloud微服务框架实践中,比较核心但是又很容易把人搞得稀里糊涂的一个问题,那就是在Spring Cloud中Hystrix.Ribbon以及Feign它们三者之 ...

  5. Feign Ribbon Hystrix 三者关系 | 史上最全, 深度解析

    史上最全: Feign Ribbon Hystrix 三者关系 | 深度解析 疯狂创客圈 Java 分布式聊天室[ 亿级流量]实战系列之 -25[ 博客园 总入口 ] 前言 疯狂创客圈(笔者尼恩创建的 ...

  6. 使用Hystrix提高系统可用性

    今天稍微复杂点的互联网应用,服务端基本都是分布式的,大量的服务支撑起整个系统,服务之间也难免有大量的依赖关系,依赖都是通过网络连接起来. (图片来源:https://github.com/Netfli ...

  7. NHibernate之映射文件配置说明

    NHibernate之映射文件配置说明 1. hibernate-mapping 这个元素包括以下可选的属性.schema属性,指明了这个映射所引用的表所在的schema名称.假若指定了这个属性, 表 ...

  8. Hystrix框架5--请求缓存和collapser

    简介 在Hystrix中有个Request的概念,有一些操作需要在request中进行 缓存 在Hystrix调用服务时,如果只是查询接口,可以使用缓存进行优化,从而跳过真实访问请求. 应用 需要启用 ...

  9. Hystrix框架4--circuit

    circuit 在Hystrix调用服务时,难免会遇到异常,如对方服务不可用,在这种情况下如果仍然不停地调用就是不必要的,在Hystrix中可以配置使用circuit,当达到一定程度错误,就会自动调用 ...

随机推荐

  1. echo -e 命令详解

    echo在php中是输入那么在linux中是不是也是输入呢,当然echo在linux也是输入不过它的用法比php强大多了可以带参数及一些东西,下面我们来看一篇关于linux echo命令介绍及-n.- ...

  2. Request 根据用户输入的信息获取输入到控制台

    html代码 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UT ...

  3. 【OI技巧】解决cin、cout因输入输出慢而TLE的问题

    语言本身没有问题!! 语言本身没有问题!! 语言本身没有问题!! C++本来的设计就是将输入输出流和C的标准输入输出挂钩在一起,这样就导致cin,cout输入输出前先要将内容放入缓冲区,最后再由cin ...

  4. Vue3的其他属性和API函数

    customRef() 自定义Ref函数实现Ref()的相关功能 1 <script> 2 import { ref customRef} from 'vue' 3 4 function ...

  5. PHP匿名类的用法

    在PHP7之后,PHP中加入了匿名类的特性.匿名类和匿名方法让PHP成为了更现代化的语言,也让我们的代码开发工作越来越方便.我们先来看看匿名类的简单使用. // 直接定义 $objA = new cl ...

  6. update修改某个字段的值

    ---恢复内容开始--- 例:给表名 ecs_article中 content字段 的 /tianyuan 替换成 11  加where条件:UPDATE ecs_article set conten ...

  7. Centos7安装配置Gitlab-CE

    GitLab介绍 GitLab:是一个基于Git实现的在线代码仓库托管软件,你可以用gitlab自己搭建一个类似于Github一样的系统,一般用于在企业.学校等内部网络搭建git私服. 功能:Gitl ...

  8. ES增删改查

    了解了一下python对es 7.5的操作,记录下,不难: #!/usr/bin/env python # -*- coding: UTF-8 -*- from settings import Con ...

  9. ssh 登录远程服务器--config配置

    一.config 配置案列 Host master HostName: 39.105.61.1 Port 22 User root IdentityFile <id_rsa> 二.配置讲解 ...

  10. IDEA连接Mysql数据库之后,在Mapper.xml编写SQL时不会自动提示表信息问题(非常详细!)

    1.首先得连接上数据库 (一)点击IDEA右侧数据库模块 (二)选择MySql进行连接 (三)填写数据库相关配置 (四)重点!!! 这个时候点击测试连接是连接不上的,需要设置时区 (按照如下设置) ( ...