Является ли Feign потокобезопасным?

Является ли экземпляр Feign потокобезопасным...? Я не смог найти никакой документации, подтверждающей это. Кто-нибудь там думает иначе?

Вот стандартный пример, размещенный в репозитории github для 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...?
  }
}

Для приведенного выше примера... Я использовал компоненты на основе пружины, чтобы выделить синглтон. Заранее спасибо...


person Pradeep Krishna Govindaraju    schedule 12.08.2016    source источник
comment
Краткий ответ: Да, это потокобезопасно. Длинный ответ: его все еще можно использовать не потокобезопасными способами. Пока весь код, который вы подключаете к вашему Feign.builder(), не имеет состояния, а любые используемые вами классы Param.Expander не имеют состояния, вы должны быть в безопасности.   -  person Shadow Man    schedule 05.04.2018


Ответы (4)


Это обсуждение предполагает, что это потокобезопасный. (Говорит о том, что создание нового объекта неэффективно) Взглянув на исходный код, похоже, нет никакого состояния, которое сделало бы его небезопасным. Это ожидаемо, так как он смоделирован на основе джерси Target. Но вы должны получить подтверждение от разработчиков Feign или провести свои собственные тесты и проверить, прежде чем использовать его небезопасным способом.

person user31482    schedule 24.05.2017

Я тоже искал, но к сожалению ничего не нашел. Единственные признаки предоставляются в конфигурации 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

person Alexander    schedule 29.09.2016
comment
Для строителя имеет смысл быть прототипом, вы так не думаете? Цель компоновщика — создать новый неизменяемый объект, настраивая свойства неатомарно. Создаваемый объект может быть неизменяемым, окончательным и потокобезопасным. - person Seagull; 16.02.2018
comment
Построитель определенно не ориентирован на многопотоковое исполнение. Но построенная цель относительно потокобезопасна. Так как он может вызывать внешние подключаемые модули, его можно использовать не потокобезопасным способом, но основной код Feign сам выглядит потокобезопасным. - person Shadow Man; 05.04.2018

После глубокого изучения кода feign-core и пары других модулей имитации (нам нужна была дополнительная поддержка вещей, которых там не было, поэтому мне пришлось кое-что изменить — к тому же, этот вопрос вызвал у меня любопытство, поэтому я взглянул еще раз), похоже, вы должны быть в безопасности при повторном использовании клиентов Feign в мульти -threaded, если весь ваш локальный код (например, любые пользовательские классы Encoder, Expander или RequestInterceptor и т. д.) не имеет изменяемого состояния.

Внутренности Feign не хранят много информации об изменяемом состоянии, но некоторые вещи кэшируются и используются повторно (таким образом, они могут быть вызваны из нескольких потоков одновременно, если вы вызываете методы цели Feign из нескольких потоков одновременно). в то же время), поэтому ваши плагины не должны иметь состояния.

Мне кажется, что все основные модули Feign были написаны с учетом неизменности и отсутствия состояния в качестве цели.

person Shadow Man    schedule 05.04.2018

В feign/core/src/main/java/feign/Client.java есть комментарий

/** * Отправляет запросы HTTP {@link Request}. Ожидается, что реализации будут потокобезопасными. */ клиент открытого интерфейса {

Таким образом, с точки зрения дизайнера, это должно быть потокобезопасным.

person yx1989    schedule 25.12.2018