Ответ
Service Discovery (обнаружение сервисов) — это механизм, который позволяет клиентам в распределенной системе (например, микросервисной) динамически находить сетевые адреса (IP и порт) экземпляров сервисов, к которым им нужно подключиться.
Зачем он нужен?
- Динамическая инфраструктура: В облачных средах (Kubernetes, облачные платформы) IP-адреса и порты экземпляров сервисов непостоянны из-за автоматического масштабирования, отказов и перезапусков.
- Устранение жестких зависимостей: Избавляет от необходимости прописывать IP-адреса сервисов в конфигурации клиентов (
app.properties). - Балансировка нагрузки: Позволяет клиенту получить список всех доступных экземпляров сервиса для распределения запросов.
Как работает (на примере шаблона Registry):
- Регистрация: При запуске каждый экземпляр сервиса регистрирует себя в Service Registry (например, Eureka, Consul, Zookeeper).
- Обнаружение: Клиент запрашивает у Registry актуальный адрес нужного сервиса (по его имени).
- Вызов: Клиент использует полученный адрес для выполнения запроса.
Пример с 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).