3

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

4 回答 4

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

于 2016-09-29T06:36:43.353 回答
1

这个讨论似乎表明它线程安全的。(谈论创建一个效率低下的新对象)查看了源代码,似乎没有任何状态会使其不安全。这是意料之中的,因为它是以球衣 Target 为蓝本的。但是你应该得到 Feign 开发者的确认,或者在以不安全的方式使用它之前进行自己的测试和审查。

于 2017-05-24T01:54:05.920 回答
1

在深入研究了feign-core代码和其他几个 feign 模块之后(我们需要对不存在的东西的额外支持,所以我不得不修改一些东西——另外,这个问题让我很好奇,所以我又看了看) ,看起来你应该在多线程环境中安全地重用 Feign 客户端,只要你的所有本地代码(例如任何自定义Encoder、、ExpanderRequestInterceptor类等)没有可变状态。

Feign 内部不会以可变状态的方式存储太多东西,但有些东西会被缓存和重用(因此可能会同时从多个线程调用,如果您从多个线程调用 Feign 目标的方法)同时),所以你的插件应该是无状态的。

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

于 2018-04-05T00:30:22.843 回答
0

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

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

所以,从设计者的角度来看,应该是线程安全的。

于 2018-12-25T02:26:45.407 回答