Какой сервис discovery использовали
Что проверяют
Работали ли вы с микросервисами на практике или знаете их по докладам. Название инструмента почти ничего не решает: важнее, понимаете ли вы, как сервис узнаёт адрес соседа и что происходит, когда реестр отстаёт от реальности. Следом часто спрашивают, почему выбрали именно этот вариант и что будет при падении реестра.
Как отвечать
Назовите свой инструмент и сразу покажите механику. Основные варианты в Java-мире:
- Eureka: реестр из Spring Cloud Netflix. Сервис регистрируется при старте и шлёт heartbeat, по умолчанию раз в 30 секунд, запись считается протухшей после 90 секунд тишины. Клиент держит копию реестра в кеше и тоже обновляет её раз в 30 секунд. Eureka выбирает доступность, а не согласованность: в режиме self-preservation сервер перестаёт вычищать записи, если heartbeat пропали массово;
- Consul: реестр с активными health checks, DNS-интерфейсом и key-value хранилищем, подключается через Spring Cloud Consul;
- ZooKeeper и etcd: согласованные хранилища, на которых discovery строят поверх эфемерных узлов или lease;
- Kubernetes: discovery даёт сама платформа. Объект
Serviceполучает стабильное DNS-имя, балансировку берёт на себя kube-proxy, и отдельный реестр в приложении часто не нужен.
Дальше про клиентскую сторону. Балансировку на клиенте в Spring Cloud сейчас делает Spring Cloud LoadBalancer: аннотация @LoadBalanced на бине RestTemplate или WebClient.Builder и вызов по имени сервиса. Ribbon давно выведен из поддержки, называть его текущим решением не стоит.
Где спотыкаются
Считают реестр мгновенным. Из-за кешей на сервере и клиенте упавший экземпляр ещё какое-то время получает запросы, и без таймаутов и повторов через Resilience4j или Spring Retry пользователи увидят ошибки.
Тащат Eureka в Kubernetes по привычке. Получается два механизма discovery, которые расходятся между собой, а выгоды никакой.
Не могут ответить, что будет при недоступности реестра. Клиенты Eureka продолжают работать по последней копии из кеша, и об этом стоит сказать самим, не дожидаясь вопроса.