Что такое Service Discovery и для чего он нужен?

«Что такое Service Discovery и для чего он нужен?» — вопрос из категории Архитектура, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Service Discovery (обнаружение сервисов) — это механизм, который позволяет клиентам в распределенной системе (например, микросервисной) динамически находить сетевые адреса (IP и порт) экземпляров сервисов, к которым им нужно подключиться.

Зачем он нужен?

  1. Динамическая инфраструктура: В облачных средах (Kubernetes, облачные платформы) IP-адреса и порты экземпляров сервисов непостоянны из-за автоматического масштабирования, отказов и перезапусков.
  2. Устранение жестких зависимостей: Избавляет от необходимости прописывать IP-адреса сервисов в конфигурации клиентов (app.properties).
  3. Балансировка нагрузки: Позволяет клиенту получить список всех доступных экземпляров сервиса для распределения запросов.

Как работает (на примере шаблона Registry):

  1. Регистрация: При запуске каждый экземпляр сервиса регистрирует себя в Service Registry (например, Eureka, Consul, Zookeeper).
  2. Обнаружение: Клиент запрашивает у Registry актуальный адрес нужного сервиса (по его имени).
  3. Вызов: Клиент использует полученный адрес для выполнения запроса.

Пример с Spring Cloud Netflix Eureka:

Сервер (Registry):

@SpringBootApplication
@EnableEurekaServer // Аннотация для включения сервера Eureka
public class ServiceDiscoveryApplication {
    public static void main(String[] args) {
        SpringApplication.run(ServiceDiscoveryApplication.class, args);
    }
}

Клиентский сервис:

@SpringBootApplication
@EnableDiscoveryClient // Регистрирует этот сервис в Eureka
public class ProductServiceApplication {
    public static void main(String[] args) {
        SpringApplication.run(ProductServiceApplication.class, args);
    }
}

// Конфигурация в application.yml
# eureka:
#   client:
#     service-url:
#       defaultZone: http://localhost:8761/eureka/
#   instance:
#     hostname: localhost

Клиенты могут использовать DiscoveryClient или @LoadBalanced RestTemplate/WebClient для поиска и вызова других сервисов по их имени (например, http://product-service/api/items).