Микросервис симулирует бесконечный цикл вызовов?

Меня смущает, как может вести себя бесконечный цикл притворных звонков. Пример: Предположим, у меня есть 2 API, A и B. Если я вызываю API A, который, в свою очередь, вызывает API B через симметричный HTTP-вызов, который, в свою очередь, снова вызывает API A через feign, он распознает это и разорвет цепочку вызовов.?

Быстрая блок-схема звонков: A -> B -> A -> B ... Повторять бесконечно?

Я не пробовал этот код, это всего лишь идея. Но я предполагаю, что spring-cloud-starter-feign предоставит несколько методов для решения этой проблемы? Это предположение верно?

    @PostMapping(RestJsonPath.API_A)
    ResponseEntity<byte[]> apiA();

    @PostMapping(RestJsonPath.API_B)
    ResponseEntity<byte[]> apiB();

Будет ли он выполняться до истечения времени ожидания или Hystrix остановит его?

1 ответ

Решение

TL; DR:

Feign будет сохранять соединение открытым при первоначальном запросе от A до B до тех пор, пока не сработает предварительно настроенное время ожидания. В этот момент Feign истечет время ожидания запроса, и если вы указали откат Hystrix, Spring будет использовать откат Hystrix в качестве ответ.

Объяснение:

spring-boot-starter-feign предоставляет уровень абстракции для написания кода HTTP-запроса. Он не будет обрабатывать потенциальные циклы или циклы в вашем коде.

Вот пример весеннего загрузочного симулятора клиента с их учебного сайта для демонстрации:

@FeignClient(value = "jplaceholder",
        url = "https://jsonplaceholder.typicode.com/",
        configuration = ClientConfiguration.class,
        fallback = JSONPlaceHolderFallback.class)
public interface JSONPlaceHolderClient {

    @RequestMapping(method = RequestMethod.GET, value = "/posts")
    List<Post> getPosts();


    @RequestMapping(method = RequestMethod.GET, value = "/posts/{postId}", produces = "application/json")
    Post getPostById(@PathVariable("postId") Long postId);
}

Сначала обратите внимание, что это интерфейс - весь код автоматически генерируется Spring во время запуска, и этот код будет отправлять запросы RESTful по URL-адресам, настроенным с помощью аннотаций. Например, 2-й запрос позволяет нам передать переменную пути, которую Spring обеспечит для нее в пути URL-адреса исходящего запроса.

Здесь важно подчеркнуть, что этот интерфейс отвечает только за HTTP-вызовы, а не за возможные петли. Логика, использующая этот интерфейс (который я могу внедрить в любой другой Spring Bean, как и любой другой Spring Bean), остается за вами, разработчик.

Github репо, откуда пришел этот пример.

Spring Boot Docs на сайте весна-загрузка-стартер-openfeign.

Надеюсь, что это поможет вам понять цель проекта openfeign и понять, что вы должны иметь дело с циклами и бесконечными циклами в коде приложения.

Что касается Hystrix, эта инфраструктура вступает в игру (если она включена) только в случае сбоя одного из этих сгенерированных HTTP-запросов, будь то тайм-аут, ошибка 4xx, ошибка 5xx или ошибка десериализации ответа. Вы настраиваете Hystrix в качестве разумного значения по умолчанию или в качестве запасного варианта, когда HTTP-запрос не выполняется.

Это достойный учебник по Hystrix.

Некоторые моменты, на которые следует обратить внимание, - это то, что резервный Hystrix должен реализовывать ваш клиентский интерфейс Feign, и вы должны указать этот класс в качестве своего резервного Hysterix в @FeignClient аннотаций. Spring и Hystrix автоматически вызовут ваш класс Hystrix в случае сбоя запроса Feign.

Другие вопросы по тегам