Hystrix(自定义的实现 熔断,降级)

本文介绍如何使用HystrixCommand类实现熔断器功能,通过泛型和反射调用不同类的方法,并配置熔断规则,包括线程池、熔断器启用条件及超时时间。

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

创建类继承 HystrixCommand类实现里面的方法:

@Component
public class HystrixFallback<T> extends HystrixCommand<T>{
	private Object cla;// 方法对象
	private Object[]  args; //参数 
	private String mname;//方法名
	private Class[]  patms;// 参数类型
	
	public HystrixFallback() {
		 super(Setter.withGroupKey(HystrixCommandGroupKey.Factory.asKey("FallbackGroup"))
			        .andCommandPropertiesDefaults(HystrixCommandProperties.Setter().withExecutionTimeoutInMilliseconds(5000)));
		 
	}
	public HystrixFallback(Object cla,String mname,Class[] patms ,Object ... args)  {
		 super(Setter.withGroupKey(HystrixCommandGroupKey.Factory.asKey(cla.getClass().getName()))
					 .andThreadPoolPropertiesDefaults(   // 配置线程池
		                        HystrixThreadPoolProperties.Setter()
		                        .withCoreSize(10)  // 配置线程池里的线程数,设置足够多线程,以防未熔断却打满threadpool
		                )
					 .andCommandPropertiesDefaults(  // 配置熔断器
		                        HystrixCommandProperties.Setter()
		                        .withCircuitBreakerEnabled(true)  //  熔断器在整个统计时间内是否开启的阀值
		                        .withCircuitBreakerRequestVolumeThreshold(3)    // 至少有3个请求才进行熔断错误比率计算
		                        .withCircuitBreakerErrorThresholdPercentage(50)   //当出错率超过50%后熔断器启动
		                         .withMetricsRollingStatisticalWindowInMilliseconds(5000)   // 统计滚动的时间窗口
		                         .withExecutionTimeoutInMilliseconds(3000)  //熔断超时时间
		                         .withCircuitBreakerSleepWindowInMilliseconds(2000)   // 熔断器工作时间,超过这个时间,先放一个请求进去,成功的话就关闭熔断,失败就再等一段时间
							 ));
		 this.cla = cla;
		 this.args=args;
		 this.mname=mname;
		 this.patms=patms;
	}

	@Override
	public T run() throws Exception {
		Class[] argsClass  = null;
		if(patms!=null && patms.length>0){
			argsClass=patms;
		}else{
			argsClass= new Class[args.length];  
			for (int i = 0, j = args.length; i < j; i++) {  
		         argsClass[i] = args[i].getClass();
		    } 
		}
		Class<? extends Object> cs = cla.getClass();
		Method menthod = cs.getMethod(mname,argsClass);
		Object temp = menthod.invoke(cla,args);
		return (T) temp;
	}
	@Override
	public T getFallback() {
		System.err.println("熔断");
		//throw new SessionMissAccountException();
		return null;
	}
}

1.通过泛型实现不同类的调用,通过反射调用方法,实现。
2.配置熔断器线程池,以及熔断器规则。
3.实现run(需要熔断的调用方法)主体方法,实现getFallback()方法,熔断策略(报错或则超时或则违背自定义策略触发)。

### Hystrix熔断降级的概念 Hystrix 是 Netflix 开源的一款用于提高分布式系统容错性和稳定性的库。它通过实现 **熔断机制** 和 **服务降级策略** 来保护应用程序免受级联故障的影响[^1]。当某个微服务不可用或者响应间过长Hystrix 可以快速失败并触发备用逻辑(即降级处理),从而减少对整个系统的负面影响。 #### 熔断机制的核心概念 熔断机制类似于电路中的保险丝,在检测到异常情况切断请求流以防止进一步损害。具体来说,Hystrix 维护了一个滚动的间窗口来统计最近一段间内的请求状态。一旦满足特定条件(例如错误率达到阈值),就会激活熔断器,阻止后续请求进入目标服务直到恢复期结束[^3]。 --- ### Hystrix的工作原理 Hystrix 的工作流程可以分为以下几个方面: #### 1. 请求隔离 为了降低单个依赖项失效带来的风险,Hystrix 将每个外部调用封装在一个独立的线程池或信号量中运行。这种设计使得即使某些依赖出现问题也不会影响其他部分正常运作[^2]。 #### 2. 断路器模式 Hystrix 实现了经典的断路器模式。以下是其主要行为: - 当一定数量的请求连续失败后(由 `circuitBreaker.requestVolumeThreshold` 控制),如果这些请求中有足够的比例发生错误(通常为 50%,可配置),则断路器会被打开。 - 打开状态下,所有新的请求都会被立即拒绝而不会实际发送给远程服务,并执行预先定义好的回退函数 (fallback method)[^3]。 - 进入半开状态:经过一段设定的间间隔 (`sleepWindowInMilliseconds`) 后,允许少量试探性请求重新尝试连接原服务;成功的话就关闭断路器恢复正常操作,否则继续保持开启状态。 #### 3. 超控制与限管理 为了避免长间等待无果的情况,Hystrix 对每一个命令都设置了最大超(`execution.isolation.thread.timeoutInMilliseconds`) 。一旦超出这个限仍未收到回应,则认为此次调用已经失败并将启动 fallback 方法作为替代方案[^4]。 #### 4. Fallback 回滚机制 每当遇到任何类型的失败情形(包括但不限于网络中断、服务器崩溃或是人为编码失误),都可以指定一个自定义的方法来进行补偿处理 —— 即所谓的 “fallback”。这可能涉及返回缓存数据、静态默认值或者其他合理的选择依据当前上下文环境决定最佳应对措施[^5]。 --- ### 使用方法概述 要集成 Spring Cloud 应用程序与 Hystrix 功能一起使用,需遵循如下几个关键步骤: 1. 添加必要的 Maven 或 Gradle 依赖项至项目构建文件当中; 2. 在主应用类上方标注注解@EnableCircuitBreaker 或者更具体的 @EnableHystrix 注释以便启用相应特性支持; 3. 定义好那些需要受到保护的服务接口方法并通过加注@HystrixCommand 注明它们以及关联起来的具体回调处理器名称等细节信息; 4. 如果有必要还可以调整一些内置参数数值来自定义适应不同业务场景下的需求特点比如修改默认超毫秒数等等。 下面给出了一段简单的 Java 示例代码展示如何正确地运用以上提到的技术要点完成基本功能开发任务: ```java import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand; import org.springframework.stereotype.Service; @Service public class MyService { @HystrixCommand(fallbackMethod = "getDefaultResponse") public String fetchData() { // Simulate a remote call that might fail. throw new RuntimeException("Remote service is down!"); } private String getDefaultResponse() { return "Default response due to failure."; } } ``` --- ### 参数详解 | 参数名 | 描述 | 默认值 | |--------------------------------|--------------------------------------------------------------------------------------|------------| | circuitBreaker.enabled | 是否启用断路器 | true | | execution.isolation.thread.timeoutInMilliseconds | 设置 Hystrix 的超间,默认 1 秒 | 1000 ms | | circuitBreaker.sleepWindowInMilliseconds | 断路器打开后的休眠间 | 5000 ms | | circuitBreaker.requestVolumeThreshold | 滑动窗口间内请求数不能超过该配置 | 20 | | circuitBreaker.errorThresholdPercentage | 错误率达到此百分比触发熔断 | 50% | ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值