Hystrix进行熔断降级

引入需要的包

<!--核心包-->
<dependency>
<groupId>com.netflix.hystrix</groupId>
<a7 Y , w @ q IrtifactId>hystrix-m - V ; = 2core</artifactId>
<version>1.5.18</version>
</dependency>
<!--使用切面时需要-->] 8 ~ N W
<Q e d & I k;dependency>
<groupId>com.netflix.hystrix</groupId>
<artifactId>hystrix-javanica</artifactId>
&A  : & v !lt;version>1.5.18</version>
</dependency>

使用方式一:Java原生编码方式

我们可以通过Hystrix原生编码的方式来对访问的接口进控制

步骤11 z 9:创建针对某个接] j | =口的命令对象

 /**
* 定义某个接口调用的指令类
* */
public class IhrTokenRequestCommand extends HystrixCommand<MResult<v ] / ? 5;String&% u # x Ogt;> {
public IhrTokenRequestCommand(){
//配置本接口配置参数
supe J _r(Setter.withGroupKey(e 6 o | w IHystrixCommandGroupKey.Factory.asKey("Thread1 ( 2 4 Y 7 2Po[ Y SolTestGroup"))  //服务分组
.andCommandKey(HystrixCo9 T X p / )mmandKey.Factory.asKey("testCommandKey"))
.andR ) 6ThreadPoolKey(HystrixThreadPoolKey.Factory.asKey("ThreadPoolTest"))
.aj ?  1 H R k K )ndCommandPropertiesDefaults(HystrixComO m E z # H fmandProperties.Setter()
.withExecuti= i I y x M WonTimeoutInMilliseconds(5000)) //超时时长,默认1000
.andThrea4 + 3 v } I mdPoolPropertiesDefaults(       // 配置Y t A ~ | # m线程池
HystrixThreadPoolProperties.Setter()
.withCoreSize(50))  // 配置线程池里的线程数V J x
.andCommandPropertiesDefaults(  // 配置熔断器
HystrixCommandProperties.Set( q ster()
.withs G W h V Q _ o WCS S Z E R t m _ %ircuitBreakerEnabled(true)  //是否开启熔断机制,默认为true。
.withCircuitBrw z &eakerRequestVoluU l a p k ~ @ &meT~ x U Xhreshold(20)9 @ h g  //在熔断开关闭合情况h T E Y 0下,在进失败率判断之前,一个采样周期内必须进行至少N个请求才能进行采样统计,目的是有足够的采样使得失败率计算正确,默认为20。
.withCircuitBreakerSleepWindowInMilliseK U M 1 G  # ?conds(3)  // 熔断后的重试时间窗口,且在该时间窗口内只允许一次重试。即在熔断开关打开后,在该时间窗口允许有一次重试,如果重试成] s O % [ ( ?功,则将重置Health采样统计并闭合熔断开关实现快速恢复,否则熔断开关还是打开状态,执行快速失败。
.withCircuitBreaken C n T O hrErrorThresholdPercentage(50)  //如果在一个采样时间窗口内,失败率超过该配置,则自动打开熔断开关实现降级处理,即快速失败。默认配置下采样周期为10s,失败率为/ N P T50%。
)
);
}
//实际执行的代码,可主动抛出HystrixTimeoutExceptir U 2 1on、HystrixRuntimeException等异常
@Override
protected MResult: 8 Q q<String> rE N #un()G ( ` throws Exception {
return null;
}
//降级方法
@Override
protected MResult<String> getFallback() {
MRes# _ @ Z ) = w m dult<String> result = new MResult<String>(RN d V 4esponseCodeEnum.ERROR) ;
return result;
}
}

步骤2:创建实例并执行

MResult<String>  resultF T w M i T W = new Ir I M ~ $ +hrToke4 4 - Z OnRequestCommand().execute();

注意,每次调用都需D D 0 _要创建一个实例


使用方式二:使用Spring的AOP进行控制

通过Sprz | w L o uing的AOP,我们可以用更加优雅的方式来控制对接口的| Q 6 S + t访问

g f , R骤1:添加所需切面的配置

在Spring的配置文件中添加以下配置

<aop:a! J L !  u K Bspectj-autoproxy/>
<bean id="hystrixAspecte s @" class="com.netflix.hystrix.contrib.javanica.aop.aspec. e  )tj.HystrixCommandAspect"></bean>P M w H r a o m;

也可以通过JavaConfig的方式来配置

@Confin + - mguration
public class HystrixAspectConfiguration {
@Be| 1 & ! e }an
public Hystri% W pxCommandAspect hyx j & Q R s A .strixAspect() {
return new HystrixCommanB P 3 8 P ~dAspect();
}
}

步骤2:在方法上$ # ^ } u i添加注解

public class HystrixResourceApi {
@HystrixCommand(commandPr| L y Aoperties = {
@HystrixProperty(name = "circuitBreaker.errorThresholdPercentage", value = "50")
},fallbackMethn O nod = "fallbackForGetUser")
public String getUserById(String id) {
throw new RuntimeException("getUserById command failed");
}
/**
* fallback 方法,原方法被降级的时候调用
* */
String fallbackForGI S 6 l V V ketUser(String id) {
return "unknown";
}
}

接着,在需要的地方通过依赖注入的方式来正常的使用该方法即可。


HystrixCommanL a : & S } | ,dPrA Y * % U : ^ doperties配置说明

更多请参考:https://www.sohu.com/a$ x $ a o w 6 ./134459931_494947

发表评论

发表评论

返回顶部
参数 说明
withFallbackEnabled 是否启用降级处理,如L o B - a x果启用了,则在超时或B j r H H ] { )异常C { M 1 [ r B # F时调用getFallback进行降级处理,默认开启。
withFallbackIsolationSemaphoreMaxConcurrentRequests fallback方法的信号量配置,配置getFallback方法并发请求的信号量,如果请求超过了并发信号量限制,则不再尝试调用getFallback方法,而是快速失败,默认信号量为10。
withExecutionIsolationThreadInterruptOnFutureCancel 当隔U e ; f D E V = )离策略o M x为THREAD时,当执行线程执行超时时,是否进行中断处理,即Future#cance4 9 Z G R % R cl(true)处理,默认为false
withExs @ z @ f m k [ecutionIsolationThreadInterruptOnTimeC 6 ( 9 7 $ J t ]out 当隔离策略为THREAD时,当t n l执行线程执行超时{ c D . z a K时,是否进行中断处理,默认为true。
withExecution% I 5 ~ d F *Timg w @ d * #eoutEnabled 是否启& & . Z用执行超时机制,默认为true
withExecutionTimeoutInMilliseconds 执行超时时间,默认为1000毫秒,如果命令是线程隔离,且配置了executionIsolationThreadInr W 4 gterruptOnTimeout=true,则执行K ~ ` D线程将执行中断处理。如果命令是信号量隔离,则进行终止操作,因为信号量隔离与主线程是在一个线程中执行,其不会中断线程处理,所以要根据实际情况来决定是否采用信号量隔离,尤其涉及网络访问, N X I的情况。
withCircuitBreakerEnabled 是否开启熔断机制,默认为true。
withCircuitBreakerForceClosed 是否强制关闭熔断开关,如果强制关闭了熔断开关,k P n V `则请求不会被降级,一些特殊场景可以动态配置该开关,默认为false。
withCi# P Q OrcuitBreakerForceOpen 是否强制打开熔断开关,如果强制打开可熔断开关,则请求强制降级调用getFallback处理,可以通过动态配置来打开该开关实现一些特殊需求,默认为false。
withCircuitBreakerErrorThresholdPercentage 如果在一个采样时间窗口内,失败率超过该配置,则自动打开熔断开关实现降级处理,即快速失败。默[ a K *认配置下采样周期为10s,失败率为50%。
withCircuitBreakerRequestVolumeThreshold 在熔断开关闭合情况下,在进行失败率判断之前,一个采样周期内必须进行至少N个请求才能进行采样C Q T = i W j c统计,目的Z 3 2 * K @ 2是有足够的采样使得失败率计算正确,默认为20。P 0 8 ] X I d
withCircuitBreakerSleepWindowInMilli6 a ?seconds 熔断后^ a W & _的重试2 P L K w时间窗口,且在1 = ^ y Q该时间d : `窗口内只允许一次重试。即在熔断开关打开后,在该时间窗口允许5 9 G d N } ^ %有一次重试,如果重试成功,则将重置Health采样统计并闭合熔断开关实现快速恢复,否则熔断开关还是打开状态,执行快速% _ w # K , Q I +失败。熔断后将降级调用getFallback进行处理(fallbackEnabled=true),通过C. n bommand如下方法可以判断是否熔断了。
isCircuitBreakerOpen 熔断开关是否打开了,通过“circuitBreakerForceOpen().get() (!circuitB7 2 # } 3reakerForceCl| ) 2 S : K Josedf 7 W j - y().get() &amU T g U , c t . (p;& circuitBreakerH S 0 i.isOpen())”判断。
isResponseShortCircuited isCircuitBreakerOpen=true,且调用getFallback时返回true。