hystrix 总结

Hystrix是一款用于构建高可用系统的开源框架,通过线程资源隔离、熔断、超时、降级、限流等手段保障服务稳定。本文详细介绍Hystrix的工作原理及使用示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

hystrix是什么?

 

hystrix 是保证系统高可用的框架。主要通过线程资源隔离、熔断、超时、降级、限流来保证。

 

举例说明:

 

比如我们系统中要调用第三方短信发送的服务,如果调用时、出现网络不稳定或短信服务故障时,会造成我们自己系统(tomcat)大量线程阻塞,系统资源耗尽等问题。最终导致系统不可用。

 

在高并发情况下,如果我们直接调用短息服务接口,因有大量的网络 IO 、导致大量的tomcat工作线程被挂起、请求被积压,这时再有其他的请求时,tomcat将会直接拒绝掉。

 

 

综上说述,我们要解决的就是 调用第三方服务出现问题时要有保护机制,不能让三方故障蔓延到整个系统。所以第一个要做的就是线程资源的隔离。

 

资源隔:

线程资源隔离简单来说就是为某个远程服务的相关调用创建一个独立的线程池。当有请求过来时,并非由tomcat工作线程直接请求,而是提交一个task,由线程池里的线程发起调用。如果线程池中没有可用的络程,将进入等待队列,如果等待队列也满了,将直接告知tomcat线程失败(快速失败)。这样就将故障影响范围限制在当前的线程池中。

 

超时:

当tomcat工作线程提交一个task,可设置一个最大等待时间,如果命令(hystrix 都是用令命令提交任务)执时间超过了这个设置,将直接抛出超时异常,避免tomcat工作线程长时间等待导致资源耗尽。

 

 

限流:

如果某个时间出来大量的请求时,处理这个请求需要依赖第三方服务,比如调用微信下单接口。但是微信下单接口调用有频率限制,比如1妙最多5次。这时我们的系统每秒最多处理上线也就5个。这时就需要做一定的限流,直接拒绝一部分请求,避免大量请求积压。hystrix 限流有两种模式:信号量、线程池。两都最大的区别就是信号量只做限流,不会另外开启线程去执行任务。而线程池则是线程耗尽,队列满的情况 下进行限流。

 

降级:

比如,当我们调用数据库获取商品信息时,发现mysql挂了,这时调用肯定会报错,报错就会执行备选方法:getFallback().

我们就可以在getFallback里去获取缓存的商品信息部分数据返给上游,完成降级工作。报错,超时,reject,熔断,都会走降级方法。

 

熔断:

当调用报错()、超时、资源耗尽reject、流量超过一定阈值的前提下,这些情况都会被 短路器记录。当这些异常实践达到一定的设置比例将开发熔断,开启后后面的请求将直接走降级方法。开启经过一段时间后(设置参数)会允许一个请求通过。尝试是否正常了。如果正常则关闭熔断。

 

其他功能:

其他功能如:请求缓存(在一个请求上下文中),请求合并,可视化监控等。

 

 

 

 

代理实例:

 

package com.zzkx.pay.trade.hystrix.command;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.netflix.hystrix.HystrixCommand;
import com.netflix.hystrix.HystrixCommandGroupKey;
import com.netflix.hystrix.HystrixCommandKey;
import com.netflix.hystrix.HystrixCommandProperties;
import com.netflix.hystrix.HystrixThreadPoolProperties;
import com.zzkx.pay.trade.retrofit.response.AngelCreateOrderResponse;

import retrofit2.Call;
import retrofit2.Response;

/**
 * @author lyy
 */
public class TestCallCommand extends HystrixCommand<AngelCreateOrderResponse>{
	
	private static final Logger LOG = LoggerFactory.getLogger(TestCallCommand.class);
	
	private Call<AngelCreateOrderResponse> call;

	public TestCallCommand(Call<AngelCreateOrderResponse> call) {
		
		//线程组名称,建议一个服务对应一个组,后续的监控也是以组为单位进行统计
		super(Setter.withGroupKey(HystrixCommandGroupKey.Factory.asKey("AngelPayService"))
				//命令的名称,对应服务中的一个方法调用。
				.andCommandKey(HystrixCommandKey.Factory.asKey("AngelCreateOrderCall"))
				//设置线程参数
				.andThreadPoolPropertiesDefaults(HystrixThreadPoolProperties.Setter()
						.withCoreSize(10)
						.withMaximumSize(50)
						.withAllowMaximumSizeToDivergeFromCoreSize(true)
						.withKeepAliveTimeMinutes(1)
						.withMaxQueueSize(10)
						.withQueueSizeRejectionThreshold(15))
				//设置熔断器参数
				.andCommandPropertiesDefaults(HystrixCommandProperties.Setter()
						//每妙最大通过的请求数,超过这个值将直接开启熔断,走降级方法
						.withCircuitBreakerRequestVolumeThreshold(50)
						//命令执行的超时时间,超过则开启熔断
						.withExecutionTimeoutInMilliseconds(1200)
						//当流程超过RequestVolumeThreshold(50)设置的值并且出错率达到50%的时,开启熔断
						.withCircuitBreakerErrorThresholdPercentage(50)
						//熔断开启后几秒后允许一个流程通过,尝试处理。
						.withCircuitBreakerSleepWindowInMilliseconds(5000)
						//信号量隔离限流策略的设置
						.withFallbackIsolationSemaphoreMaxConcurrentRequests(50))
				
				);
		this.call = call;
		
	}

	@Override
	protected AngelCreateOrderResponse run() throws Exception {
		Response<AngelCreateOrderResponse> response = call.execute();
		return response.body();

	}

	@Override
	protected AngelCreateOrderResponse getFallback() {
		
		Throwable exception = this.getExecutionException();
		if(exception != null) {
			LOG.error(exception.getMessage(),exception);
			//从缓存获取数据返回
		}

		return null;

	}

	
}

 

调用代码:

调用command的执行方法

执行Command有4种方式:execute(),queue(),observe(),toObservable()

其中execute()和queue()仅仅对HystrixCommand适用。

 

TestCallCommand(call).execute()

 

这里传入的call是我使用的retrofit2中的。跟hystrix无关

### Hystrix 使用指南和最佳实践 Hystrix 是 Netflix 开源的一款用于处理分布式系统的延迟和容错的库,主要应用于微服务架构中的断路器模式实现。以下是有关 Hystrix 的使用方法、配置以及一些最佳实践。 #### 基本概念 Hystrix 提供了一种机制,在远程调用失败或者超时时保护并控制依赖的服务交互。它通过隔离点之间的访问来防止级联故障,并提供回退选项以增强系统的弹性[^1]。 #### 配置与使用 为了集成 Hystrix 到项目中,通常需要引入相应的 Maven 或 Gradle 依赖项。下面是一个简单的 Spring Cloud 中使用的例子: ```xml <dependency> <groupId>com.netflix.hystrix</groupId> <artifactId>hystrix-core</artifactId> <version>1.5.18</version> </dependency> ``` 接着可以通过 `@EnableCircuitBreaker` 注解启用断路器功能,并在具体的方法上标注 `@HystrixCommand` 来定义命令行为及其回退逻辑。 ```java import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand; import org.springframework.stereotype.Service; @Service public class MyService { @HystrixCommand(fallbackMethod = "fallback") public String callExternalService() { // 调用外部服务的代码 return externalCall(); } private String fallback() { return "Fallback response"; } } ``` 上述代码展示了如何设置一个带有默认回退方法的基础 Hystrix 命令。如果主业务逻辑执行过程中出现问题,则会触发指定的回退函数。 #### 性能优化与监控 除了基础的功能外,还需要关注性能调整方面的工作。比如可以自定义线程池大小、请求超时时间等参数;同时利用 Turbine 收集多个实例上的指标数据进行集中化展示以便于实时监测整个集群的状态变化情况[^4]。 另外值得注意的是随着技术栈的发展趋势,Hystrix 已经逐渐被 Resilience4j 所取代,后者更加轻量级且易于维护,特别是在响应式编程场景下表现尤为突出[^2]. #### 最佳实践总结 - **合理划分模块**: 将不同类型的请求分配到独立的资源组里运行,这样即使某个部分出了差错也不会影响其他正常工作的组件. - **设定恰当阈值**: 根据实际情况调整熔断条件(如错误百分比),既不过早也不过晚地激活防护措施. - **定期测试恢复能力**: 不仅要验证常规操作流程下的正确性还要模拟各种异常状况下来评估整体健壮程度. ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值