在我们的日常开发中,有些时候需要和第三方系统进行对接操作,或者调用其他系统的 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隔离一般只适用非网络调用。
相关推荐
1. **配置 Hystrix**:在每个微服务实例中,配置 Hystrix,启用监控端点,并设置适当的熔断和降级策略。 2. **配置 Turbine**:创建一个独立的 Turbine 服务器,配置它去聚合所有 Hystrix 实例的监控数据流。这通常...
为了充分利用 Hystrix Dashboard,我们需要将我们的服务配置为向 Hystrix Stream 发送数据。Hystrix Stream 是一个基于文本的 HTTP 流,它不断地推送服务的运行时信息。通过在服务代码中添加适当的配置,我们可以将...
Hystrix是一个由Netflix开源的延迟和容错库,旨在隔离远程系统、服务和第三方库的访问点,停止级联失败,提供后备选项,并实现优雅降级。...这说明了使用Hystrix进行服务调用时,资源隔离与限流的重要性。
调整线程池大小至20后,250个并发请求能正常处理,说明线程池大小应根据实际服务负载进行适当配置。 3. **熔断机制**:在压力测试中,通过Hystrix安全方式发起请求,虽然理论上接口请求次数多于实际处理次数,但这...
1. `src/main/java`: 这里存放的是项目的源代码,包括gRPC存根的包装类以及与Hystrix相关的配置和逻辑。 2. `pom.xml`: Maven的项目对象模型文件,定义了项目依赖、构建目标等信息,用于构建和管理项目。 3. `README...
**配置说明:** - `spring.application.name`: 应用名称。 - `server.port`: 服务端口。 - `eureka.client.register-with-eureka`: 是否向 Eureka 注册自己(Eureka 服务器不需要注册自己)。 - `eureka.client....
公司内部分享的根据网络上的资源整理的FeignClient的原理讲解PPT,包括FeignClient原理、hystrix、ribbon原理及参数配置等。
### SpringCloudNetflix系统配置说明 #### 一、SpringCloudNetflix简介 SpringCloud 是一套用于构建分布式系统的工具包,它能够帮助开发者快速实现一系列常见的分布式系统模式,如配置管理、服务发现、断路器、...
通过对这些示例的分析,你可以深入了解Hystrix在实际项目中的运用,并学习如何根据自己的需求进行定制配置。 五、Hystrix监控与仪表盘 Hystrix提供了强大的监控工具——Hystrix Dashboard,可以实时展示Hystrix的...
- **查找远程配置资源**:说明如何配置客户端从远程位置获取配置信息。 - **安全**:介绍如何保护客户端与配置服务器之间的通信安全。 - **Vault**:讨论如何集成HashiCorp的Vault来管理和保护敏感信息。 #### ...
SpringCloud是Java开发微服务架构的热门框架,它提供了服务发现、配置中心、负载均衡、熔断机制等全套解决方案...对于更详细的说明,可以查阅提供的PDF和JPG文件,它们提供了排版清晰、易于阅读的SpringCloud配置详解。
Spring Cloud Config:配置管理工具,目前支持本地存储、Git以及Subversion,可以实现应用配置的外部化存储,支持客户端配置信息刷新、加密/解密配置内容等。 Eureka:服务治理组件,包含服务注册中心、服务注册与...
- **断路器**:利用Hystrix或Resilience4j来实现服务间的故障隔离。 - **智能路由**:通过Zuul或Netflix Gateway等组件实现请求的智能分发。 - **微代理**:例如使用Spring Cloud Gateway作为API网关。 - **控制总线...
这是一个基于SpringCloud和SpringBoot的学生选课系统的源码包,包含数据库文件和项目说明,适合进行课程设计或毕业设计的学习和实践。这个项目利用了Spring生态的先进技术和微服务架构,旨在提供一个高效、可扩展的...
而 spring-cloud-test 可能是一个包含具体代码和配置的模块,可能包括了 Eureka、Zuul、Hystrix、Ribbon 或其他 Spring Cloud 组件的配置和实现。 在实际使用中,你需要了解以下步骤来搭建和运行此项目: 1. **...
- **Spring Cloud Config客户端**:说明了如何配置客户端以监听来自Spring Cloud Bus的通知,并自动刷新其配置。 #### Spring Cloud Netflix - **服务发现:Eureka客户端**:介绍了如何集成Netflix Eureka客户端...
一篇很好的springCloud学习的思维导读,详细的介绍了,springCloud的搭建步骤以及各组件的说明讲解 涵盖 Eureka服务注册与发现 Zookeeper服务注册与发现 Consul服务注册与发现 Ribbon负载均衡服务调用 OpenFeign...
9. 客户端负载均衡器Ribbon:说明了如何自定义Ribbon客户端、使用Eureka中的Ribbon以及如何不使用Eureka进行Ribbon的配置和使用。 10. 声明式REST客户端Feign:详细阐述了如何通过Feign构建RESTful客户端,包括覆盖...
服务介绍项目名称编号名称说明可乐云认证认证服务认证服务基于SpringSecurity进行安全认证,采用OAuth2.0认证体系,对客户端,用户进行认证及授权,支持账号密码登录,短信验证码登录可乐云配置配置配置服务基于
按照说明操作,可以避免因配置错误导致的服务启动失败。 “springcloud”这个目录下,可能包含了项目的核心组件代码,如: 1. Eureka:服务注册与发现。每个微服务都会向Eureka注册,其他服务可以通过Eureka找到并...