建设部网站 专业评估,东莞市手机网站建设,超全wordpress,wordpress前台主题切换自定义注解FeignRetry为了解决上面提到的问题#xff0c;让Feign调用的每个接口单独配置不同的重试机制。我们使用了面向切面编程并编写了一个自定义注解#xff1a;FeignRetry。此注释的工作方式类似于Retryable的包装器#xff0c;并与其共享相同的规范以避免混淆。Target…自定义注解FeignRetry为了解决上面提到的问题让Feign调用的每个接口单独配置不同的重试机制。我们使用了面向切面编程并编写了一个自定义注解FeignRetry。此注释的工作方式类似于Retryable的包装器并与其共享相同的规范以避免混淆。Target({ElementType.METHOD, ElementType.TYPE})
Retention(RetentionPolicy.RUNTIME)
public interface FeignRetry {Backoff backoff() default Backoff();int maxAttempt() default 3;Class? extends Throwable[] include() default {};
}Target(ElementType.TYPE)
Retention(RetentionPolicy.RUNTIME)
public interface Backoff {long delay() default 1000L;;long maxDelay() default 0L;double multiplier() default 0.0D;;
}FeignRetryAspect切面处理FeignRetry注解。 Slf4j
Aspect
Component
public class FeignRetryAspect {Around(annotation(FeignRetry))public Object retry(ProceedingJoinPoint joinPoint) throws Throwable {Method method getCurrentMethod(joinPoint);FeignRetry feignRetry method.getAnnotation(FeignRetry.class);RetryTemplate retryTemplate new RetryTemplate();retryTemplate.setBackOffPolicy(prepareBackOffPolicy(feignRetry));retryTemplate.setRetryPolicy(prepareSimpleRetryPolicy(feignRetry));// 重试注意这里execute还有第二个参数可以设置重试全部失败以后的回调函数再重试任然失败以后可以编写回调函数来兜底return retryTemplate.execute(arg0 - {int retryCount arg0.getRetryCount();log.info(Sending request method: {}, max attempt: {}, delay: {}, retryCount: {},method.getName(),feignRetry.maxAttempt(),feignRetry.backoff().delay(),retryCount);return joinPoint.proceed(joinPoint.getArgs());});}private BackOffPolicy prepareBackOffPolicy(FeignRetry feignRetry) {if (feignRetry.backoff().multiplier() ! 0) {ExponentialBackOffPolicy backOffPolicy new ExponentialBackOffPolicy();backOffPolicy.setInitialInterval(feignRetry.backoff().delay());backOffPolicy.setMaxInterval(feignRetry.backoff().maxDelay());backOffPolicy.setMultiplier(feignRetry.backoff().multiplier());return backOffPolicy;} else {FixedBackOffPolicy fixedBackOffPolicy new FixedBackOffPolicy();fixedBackOffPolicy.setBackOffPeriod(feignRetry.backoff().delay());return fixedBackOffPolicy;}}private SimpleRetryPolicy prepareSimpleRetryPolicy(FeignRetry feignRetry) {MapClass? extends Throwable, Boolean policyMap new HashMap();policyMap.put(RetryableException.class, true); // Connection refused or time outpolicyMap.put(ClientException.class, true); // Load balance does not available (cause of RunTimeException)if (feignRetry.include().length ! 0) {for (Class? extends Throwable t : feignRetry.include()) {policyMap.put(t, true);}}return new SimpleRetryPolicy(feignRetry.maxAttempt(), policyMap, true);}private Method getCurrentMethod(JoinPoint joinPoint) {MethodSignature signature (MethodSignature) joinPoint.getSignature();return signature.getMethod();}
}捕获FeignRetry注解的方法将配置传递给Spring RetryTemplate根据配置调用服务。FeignRetry 的使用用法很简单只需将注释放在我们希望重试机制处于活动状态的 Feign Client方法上即可。自定义切面的用法类似于Spring自带的Retryable注解。GetMapping
FeignRetry(maxAttempt 3, backoff Backoff(delay 500L))
ResponseEntityString retrieve1();GetMapping
FeignRetry(maxAttempt 6, backoff Backoff(delay 500L, maxDelay 20000L, multiplier 4))
ResponseEntityString retrieve2();另外还需要在应用程序类中使用 EnableRetry 注释来启动重试直接写在SpringBoot的启动类上。这里再讲解一下各个参数的含义include就是value默认为空当exclude也为空时默认所有异常都可以触发重试exclude指定那些异常不触发重试(可以配置多个异常类型)默认为空maxAttempts最大重试次数默认3次包括第一次调用backoff重试等待策略 默认使用Backoff注解BackOff各个参数的讲解value: 重试的间隔时间默认为1000L我们设置为2000Ldelay重试的间隔时间,就是valuemaxDelay重试次数之间的最大时间间隔默认为0如果小于delay的设置则默认为30000Lmultiplierdelay时间的间隔倍数默认为0表示固定暂停1秒后进行重试如果把multiplier设置为1.5则第一次重试为2秒第二次为3秒第三次为4.5秒。