Что такое сервис-дискавери и как он связан с Feign client
Что проверяют
Понимаете ли вы, кто именно в этой связке ищет адрес. Feign часто описывают как клиент, который сам находит сервисы, и вопрос как раз проверяет, различаете ли вы декларативный HTTP-клиент, реестр и балансировщик, или у вас это одна неразличимая магия из стартера.
Как отвечать
Сервис-дискавери это способ узнать адреса живых экземпляров сервиса, не зашивая их в конфигурацию. Экземпляр при старте регистрируется в реестре и шлёт туда сигналы жизни, клиенты получают список. Дискавери бывает на стороне клиента, когда список тянет сам вызывающий и сам выбирает экземпляр, и на стороне сервера, когда выбор делает прокси или платформа: в Kubernetes эту роль играют сервис и внутренний DNS, и отдельный реестр там обычно лишний.
Feign это декларативный HTTP-клиент: вы описываете интерфейс аннотациями, реализация собирается за вас.
@FeignClient(name = "billing")
interface BillingClient {
@GetMapping("/invoices/{id}")
InvoiceDto get(@PathVariable Long id);
}Связь такая: имя в аннотации трактуется как идентификатор сервиса. Перед вызовом оно уходит в клиент дискавери, тот берёт список экземпляров из локального кэша реестра, балансировщик выбирает один, и только после этого Feign отправляет запрос по готовому адресу. Сам Feign ничего не ищет, он собирает запрос и разбирает ответ.
Где спотыкаются
Считают список экземпляров мгновенно точным. Регистрация, сигналы жизни и обновление кэша идут по таймерам, поэтому упавший экземпляр какое-то время остаётся в списке. Отсюда таймауты, размыкатель и повтор на другом экземпляре только для идемпотентных операций.
Прописывают явный адрес в аннотации, чтобы заработало локально, и забывают убрать. Дискавери и балансировка при этом выключаются целиком, весь трафик идёт мимо реестра в один экземпляр, а замечают это уже под нагрузкой.
Ждут отказоустойчивости по умолчанию. Ни повторов, ни размыкателя, ни разумных таймаутов в голом клиенте нет, их подключают отдельно. Иначе один медленный сервис затягивает пул потоков вызывающего и роняет его следом за собой.