Микросервис симулирует бесконечный цикл вызовов?
Меня смущает, как может вести себя бесконечный цикл притворных звонков. Пример: Предположим, у меня есть 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.