工作随笔——自动重发的凶手--feign
公司使用的feign(https://github.com/OpenFeign/feign)作为http客户端。
开发时debug后端程序,发现同一个请求会多次收到。
为了判断是谁在搞鬼,在客户端和服务端中间加了一层代理。发现客户端发起了多次请求(代理工具有请求通过是会输出日志)。
查看 Feign.java 发现有默认重试机制
// 约102行 private Retryer retryer = new Retryer.Default(); // 约 127行 ublic Builder retryer(Retryer retryer) { this.retryer = retryer; return this; }
查看 Retryer.java 类,默认重试5次。
public Default() { this(100, SECONDS.toMillis(1), 5); }
// period参数的含义请查看 nextMaxInterval()方法
public Default(long period, long maxPeriod, int maxAttempts) {
this.period = period;
this.maxPeriod = maxPeriod;
this.maxAttempts = maxAttempts;
this.attempt = 1;
}
解决问题:
Retryer retryer = new Retryer.Default(100, SECONDS.toMillis(1), 0); Feign.builder().retryer(retryer).encoder(new GsonEncoder()).decoder(new GsonDecoder()).logger(new Logger.JavaLogger().appendToFile("sdk.log")).logLevel(Level.FULL) .target(AccountApi.class, apihost);
如果Feign的版本在8.17.0及其以后:
Retryer retryer = Retryer.NEVER_RETRY; Feign.builder().retryer(retryer).encoder(new GsonEncoder()).decoder(new GsonDecoder()).logger(new Logger.JavaLogger().appendToFile("sdk.log")).logLevel(Level.FULL) .target(AccountApi.class, apihost);
以上--end
好记性不如烂笔头!