В чем разница между сервис-дискавери и DNS и каковы преимущества сервис-дискавери
Что проверяют
Понимаете ли вы, что DNS это способ узнать адрес по имени, а сервис-дискавери это система, которая знает, какие экземпляры сейчас живы. Следом часто спрашивают, зачем Eureka, если приложение крутится в Kubernetes.
Как отвечать
Разведите понятия. DNS отвечает на вопрос «какой IP у этого имени» и полагается на кэш с TTL. Он не знает, жив ли экземпляр, не несёт метаданных (версия, зона), а обычная A-запись не содержит порта, для него есть SRV-записи. Кэшируют все: резолвер, ОС и сама JVM, где время жизни кэша задаётся networkaddress.cache.ttl. Упавший экземпляр может ещё какое-то время получать трафик.
Сервис-дискавери добавляет к этому:
- реестр: Eureka, Consul, ZooKeeper или etcd хранят список экземпляров с адресами, портами и метаданными;
- регистрацию: сервис сам регистрируется при старте или его регистрирует платформа;
- проверку здоровья: по пропущенным heartbeat или health check мёртвый экземпляр выпадает из списка без правки конфигов;
- балансировку на клиенте: в Spring Cloud это
spring-cloud-starter-netflix-eureka-clientплюс Spring Cloud LoadBalancer, клиент сам выбирает экземпляр из свежего списка.
Отдельно скажите про Kubernetes: там дискавери встроен. Список подов сервиса ведёт сама платформа через EndpointSlice, живость определяют readiness-пробы, а клиент получает обычное DNS-имя orders.default.svc.cluster.local, которое указывает на стабильный ClusterIP. DNS там служит интерфейсом поверх полноценного дискавери, и проблема кэша снимается, потому что IP сервиса не меняется. Consul тоже умеет отвечать по DNS.
Где спотыкаются
Противопоставляют DNS и дискавери как «старое и новое». Точнее так: DNS может быть транспортом, а дискавери механизмом, который держит список актуальным.
Тащат Eureka в Kubernetes без причины. Получается второй реестр, который дублирует встроенный и может с ним расходиться.
Забывают, что реестр сам является точкой отказа и имеет свою модель согласованности. Eureka выбирает доступность и в режиме self-preservation может держать мёртвые экземпляры, Consul построен на Raft и без кворума не принимает изменения. Клиенту нужны локальный кэш списка, таймауты и повторы.