当前位置: 首页 > 知识库问答 >
问题:

在异常时假装客户端重试

袁运良
2023-03-14
java prettyprint-override">Retryer<ClientResponse> retryer = RetryerBuilder.<ClientResponse>newBuilder()
  .retryIfExceptionOfType(FeignException.class)
  .withStopStrategy(StopStrategies.stopAfterAttempt(retryCount))
  .withWaitStrategy(WaitStrategies.exponentialWait(maxWaitSeconds, TimeUnit.SECONDS))
  .build();
    
retryer.call(() -> { 
  return client.doStuffs(someInput); }
);
Feign client = Feign.builder()
    .decoder(jacksonDecoder)
    .encoder(jacksonEncoder)
    .logger(slf4jLogger)
    .client(okHttpClient)
    .retryer(new Retryer.Default(
                            SECONDS.toMillis(minWaitSeconds), 
                            SECONDS.toMillis(maxWaitSeconds), 
                            retryCount
            ))
    .requestInterceptor(new BasicAuthRequestInterceptor(clientConfig.getUser(), clientConfig.getPassword()))
    .target(target);
    
client.doStuffs(someInput);
<dependency>
    <groupId>io.github.openfeign</groupId>
    <artifactId>feign-core</artifactId>
    <version>${feign.version}</version>
</dependency>

共有1个答案

赵灼光
2023-03-14

如果没有其他配置,则Feign将只在IOException上重试。如果希望基于状态代码重试,则需要创建一个ErrorDecoder,该RetryableException或其导数,以触发重试。

下面是一个简单的例子:

class MyErrorDecoder implements ErrorDecoder {
    public Exception decode(String methodKey, Response response) {
        if (response.status() == 503) {
            throw new RetryableException(
                response.status(), 
                "Service Unavailable", 
                response.request().httpMethod(), 
                null);
        } else {
            return new RuntimeException("error");
        }
    }
}

有关更多示例,请查看错误处理文档。

 类似资料:
  • 我需要多次调用服务(>50次)并聚合响应。因此,我决定使用,使用Async和CustomExecuter(它自己的线程池)来提高速度,而不是等待服务响应。 我在类路径上使用带有ApacheHTTP和Hystrix的feign客户机。我可以看到它有时是工作的,有时我得到例外,因为电路是开放的。

  • 我对假装很陌生。今天就发现吧……当我读到Spring Cloud Feign时,我的第一个问题是:“您如何包装您的Fiign客户机?” 我举个例子。假设我们有2个微服务M1和M2。M2使用来自M1的endpoint。 null 也许我完全错了,请指正。 多谢!拜拜

  • 使用Spring云合同验证生产者和消费者之间的合同。在我的消费者控制器中,我正在使用Feign client调用另一个微服务方法来获取一些数据。但是现在在SpringCloud contract中,为这个微服务进行存根调用是不可能的。 使用Spring Cloud与Netflix OSS。

  • 我有一个从服务器端抛出的异常,我希望在客户端捕捉到这个异常。异常应该使用Jersey通过REST发送。这是我目前所掌握的: 定义我的异常:

  • 其中api为: 带有try/catch得客户端用法: 依赖项的版本为: null null ps.当假客户服务可用时,它可以工作,好的。我只关注例外方面。

  • 我已经将Hadoop1.0.3配置为3台具有完全分布式模式的计算机。在下面的第一台计算机上,正在运行作业: 现在当我在上面运行简单的map reduce作业时,执行map ReduceJob需要更长的时间。所以我在Hadoop上安装了HBASE层。现在我在3个集群上有以下的HBASE进程。 ./psql.sh master(zookeeper名称).../examples/web_stat.sql