成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

這可能是Feign調用可重試的優秀方案了

開發 前端
Feign?重試其實是一個很常見的場景,我們本文通過了自定義了一個@FeignRetry?注解來實現可重試的機制,針對不同的Feign接口還可以使用不同的重試策略,是不是很方便,快在你的項目中用起來吧。

前言

在我們公司里,不同的服務之間通過Feign進行遠程調用,但是,我們在嘗試使調用可重試時遇到了一個小問題,Feign框架本身可以配置的自己的重試機制,但是它是一刀切的方式,所有的調用都是同樣的機制,沒有辦法像我們希望的那樣在每個方法的基礎上配置。不過我在項目中探索除了一種新的寫法,通過spring-retry框架集合Feign去實現重試機制,可以為每個調用實現不同的重試機制,那究竟是如何做到的呢,繼續往下看呀。

自定義注解@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));

// 重試
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) {
Map<Class<? extends Throwable>, Boolean> policyMap = new HashMap<>();
policyMap.put(RetryableException.class, true); // Connection refused or time out
policyMap.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))
ResponseEntity<String> retrieve1();

@GetMapping
@FeignRetry(maxAttempt = 6, backoff = @Backoff(delay = 500L, maxDelay = 20000L, multiplier = 4))
ResponseEntity<String> retrieve2();

另外還需要在應用程序類中使用 @EnableRetry 注釋來啟動重試,比如可以加載SpringBoot的啟動類中。

總結

Feign重試其實是一個很常見的場景,我們本文通過了自定義了一個@FeignRetry注解來實現可重試的機制,針對不同的Feign接口還可以使用不同的重試策略,是不是很方便,快在你的項目中用起來吧。

責任編輯:武曉燕 來源: JAVA旭陽
相關推薦

2021-11-03 16:10:16

RedisJava內存

2017-05-15 12:58:00

編程javaapl

2021-08-27 10:14:22

機器學習工具手冊人工智能

2018-10-25 09:37:02

Docker入門容器

2024-08-28 11:56:33

2023-02-26 10:14:51

Spring第三方庫

2023-02-26 00:00:01

Spring數據庫組件

2018-11-05 08:10:30

Netty架構模型

2020-04-14 10:50:47

FlutterGithub

2017-02-20 15:51:07

2021-05-27 05:30:23

數據分析工具數據可視化

2018-07-16 10:10:43

WiFi上網網速

2019-05-29 10:04:38

CAP理論 AP

2021-02-26 10:16:55

鴻蒙HarmonyOS應用開發

2021-06-09 07:56:51

JvmJVM面試題Java

2018-08-22 09:08:44

區塊鏈安全應用程序

2018-08-22 10:00:01

區塊鏈數字貨幣比特幣

2020-05-17 16:06:47

ICMPIP協議網絡協議

2020-03-05 15:12:51

數據分析人工智能運營

2021-09-30 07:25:32

數據分析數據分析師工具
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 天天看天天干 | 欧美专区在线视频 | 精品国产黄a∨片高清在线 成人区精品一区二区婷婷 日本一区二区视频 | 欧美不卡| 99久久久久久| 盗摄精品av一区二区三区 | 日韩中文字幕一区二区 | 成人福利在线视频 | 精品欧美一区二区久久久伦 | 国产一级在线 | 欧美日韩高清一区 | 国产精品日韩在线观看一区二区 | 午夜免费电影 | 久久中文字幕视频 | 国产一区二区视频在线观看 | 亚洲国产aⅴ成人精品无吗 综合国产在线 | 久久久久久91 | 欧美1—12sexvideos | 国产精品亚洲成在人线 | 人人玩人人干 | 黄色免费在线观看 | 国产在线网址 | 精品成人佐山爱一区二区 | 男女啪啪网址 | 欧美精品一区三区 | 伊人精品| 狠狠亚洲 | 欧美二区在线 | 日韩精品在线一区 | 国产精品一区二区视频 | 少妇黄色 | 亚洲国产91 | 久久天堂 | 又爽又黄axxx片免费观看 | 国产高清免费 | 欧美小视频在线观看 | 日韩欧美电影在线 | 免费看的av | www.久久久.com | 国产一区二区三区久久久久久久久 | 99热在线免费|