Feign线程安全吗?

时间:2016-08-12 11:27:40

标签: netflix-feign feign

Feign线程的实例安全吗?我找不到任何支持此功能的文档。那边的人不这么想吗?

这是在github repo上发布的标准示例,用于Feign ...

interface GitHub {
  @RequestLine("GET /repos/{owner}/{repo}/contributors")
  List<Contributor> contributors(@Param("owner") String owner, @Param("repo") String repo);
}

static class Contributor {
  String login;
  int contributions;
}

public static void main(String... args) {
  GitHub github = Feign.builder()
                       .decoder(new GsonDecoder())
                       .target(GitHub.class, "https://api.github.com");

  // Fetch and print a list of the contributors to this library.
  List<Contributor> contributors = github.contributors("netflix", "feign");
  for (Contributor contributor : contributors) {
    System.out.println(contributor.login + " (" + contributor.contributions + ")");
  }
}

我应该将其更改为以下内容吗...它是否是线程安全的??

interface GitHub {
  @RequestLine("GET /repos/{owner}/{repo}/contributors")
  List<Contributor> contributors(@Param("owner") String owner, @Param("repo") String repo);
}

static class Contributor {
  String login;
  int contributions;
}

@Component
public class GithubService {

  GitHub github = null;

  @PostConstruct
  public void postConstruct() {
    github = Feign.builder()
                .decoder(new GsonDecoder())
                .target(GitHub.class, "https://api.github.com");
  }

  public void callMeForEveryRequest() {
    github.contributors... // Is this thread-safe...?
  }
}

对于上面的示例...我使用了基于弹簧的组件来突出显示单例。提前谢谢......

4 个答案:

答案 0 :(得分:1)

我也在寻找,但遗憾的是一无所获。 Spring配置中提供的唯一标志。构建器在范围原型中定义为bean,因此不应该是线程安全的。

@Configuration
public class FooConfiguration {
    @Bean
    @Scope("prototype")
    public Feign.Builder feignBuilder() {
        return Feign.builder();
    }
}

参考:http://projects.spring.io/spring-cloud/spring-cloud.html#spring-cloud-feign-hystrix

答案 1 :(得分:1)

This讨论似乎暗示 线程安全。 (谈论创建一个低效的新对象) 看看源代码,似乎没有任何状态可以使它不安全。这是预期的,因为它是在球衣Target上建模的。但是你应该从Feign开发者那里得到确认,或者在以不安全的方式使用之前进行自己的测试和审查。

答案 2 :(得分:0)

深入研究feign-core代码和其他一些假设模块(我们需要额外支持那些不存在的东西,所以我不得不修改一些东西 - 加上,这个问题让我好奇,所以我再看看),看起来你应该安全地重复使用多线程环境中的Feign客户端,只要你的所有本地代码(例如任何自定义EncoderExpander ,或RequestInterceptor类等)没有可变状态。

Feign internals不会以可变状态的方式存储很多东西,但有些东西被缓存并重新使用(因此如果你调用你的Feign目标,可以同时从多个线程调用#&# 39;同时来自多个线程的方法),所以你的插件应该是无状态的。

在我看来,所有主要Feign模块都是以不变性和无状态为目标编写的。

答案 3 :(得分:0)

在feign / core / src / main / java / feign / Client.java中,有一条注释

/ **  *提交HTTP {@link请求请求}。期望实现是线程安全的。  * / 公共接口客户端{

因此,从设计者的角度来看,它应该是线程安全的。