工作随笔——自动重发的凶手--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

 

posted @ 2017-06-14 16:56  爱自己  阅读(1671)  评论(0编辑  收藏  举报