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...?
}
}
对于上面的示例...我使用了基于弹簧的组件来突出显示单例。提前谢谢......
答案 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客户端,只要你的所有本地代码(例如任何自定义Encoder
,Expander
,或RequestInterceptor
类等)没有可变状态。
Feign internals不会以可变状态的方式存储很多东西,但有些东西被缓存并重新使用(因此如果你调用你的Feign目标,可以同时从多个线程调用#&# 39;同时来自多个线程的方法),所以你的插件应该是无状态的。
在我看来,所有主要Feign模块都是以不变性和无状态为目标编写的。
答案 3 :(得分:0)
在feign / core / src / main / java / feign / Client.java中,有一条注释
/ ** *提交HTTP {@link请求请求}。期望实现是线程安全的。 * / 公共接口客户端{
因此,从设计者的角度来看,它应该是线程安全的。