Что такое Spring Cloud Feign Client и для чего он используется
Что проверяют
Понимаете ли вы, что декларативный клиент это удобство поверх обычного HTTP, и не теряются ли за аннотациями таймауты, повторы и обработка ошибок. Заодно смотрят, ориентируетесь ли вы в том, что в экосистеме уже устарело.
Как отвечать
Feign превращает интерфейс с аннотациями в HTTP-клиент: реализацию генерирует библиотека, разработчик описывает только контракт.
@FeignClient(name = "billing")
interface BillingClient {
@GetMapping("/invoices/{id}")
Invoice byId(@PathVariable("id") long id);
}Имя в аннотации служит ключом обнаружения сервиса: адрес берётся из реестра и балансируется, а при точечном обращении задаётся прямой адрес. Дальше стоит назвать слои, которые обычно и настраивают: кодировщик и декодировщик тела, перехватчик запроса для проброса токена и трассировки, свой декодер ошибок, превращающий код ответа в доменное исключение, отдельные таймауты на соединение и чтение, обёртку предохранителем с запасным ответом.
Уместно добавить честную рамку: Feign синхронный и блокирующий, для реактивного стека берут другой клиент, а сам стартер сейчас развивается в режиме поддержки, и в новых сервисах ту же задачу решают декларативные HTTP-интерфейсы самого Spring.
Где спотыкаются
Называют спутниками Feign библиотеки прошлого поколения для балансировки и размыкания цепи. Их давно заменили: балансировка своя в Spring Cloud, отказоустойчивость через Resilience4j. Такой ответ сразу выдаёт, по каким материалам человек готовился.
Оставляют таймауты по умолчанию. Они щедрые, счёт идёт на десятки секунд, и один залипший сосед по сети держит потоки вызывающего сервиса до исчерпания пула. Таймаут задают явно и делают его меньше, чем терпение того, кто ждёт ответа.
Не указывают имена параметров явно и ловят ошибку на старте или пустой запрос: имена аргументов в байт-коде по умолчанию не сохраняются. Вторая ловушка рядом это повторы. Ретрай на неидемпотентный вызов рождает второй платёж, поэтому включают его осознанно и только там, где повтор безопасен.