Что такое Service Discovery и как оно работает?
Service Discovery — это механизм, позволяющий микросервисам автоматически находить друг друга в сети без жёсткого указания IP-адресов и портов.
Аналогия из жизни: Service Discovery — это как телефонный справочник. Вместо того чтобы помнить номер каждого отдела, вы звоните на ресепшен (реестр), называете имя отдела и получаете актуальный номер.
Два подхода
| Подход | Как работает | Пример |
|---|---|---|
| Client-Side Discovery | Клиент запрашивает реестр и сам выбирает экземпляр | Netflix Eureka |
| Server-Side Discovery | Запрос идёт через балансировщик, который обращается к реестру | Kubernetes DNS, AWS ELB |
Netflix Eureka (Client-Side Discovery)
// Eureka Server
@SpringBootApplication
@EnableEurekaServer
public class EurekaServerApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaServerApplication.class, args);
}
}
# Eureka Server — application.yml
server:
port: 8761
eureka:
client:
register-with-eureka: false
fetch-registry: false
// Микросервис-клиент (payment-service)
@SpringBootApplication
@EnableDiscoveryClient
public class PaymentServiceApplication {
public static void main(String[] args) {
SpringApplication.run(PaymentServiceApplication.class, args);
}
}
# Клиент — application.yml
spring:
application:
name: payment-service
eureka:
client:
service-url:
defaultZone: http://eureka-server:8761/eureka/
instance:
prefer-ip-address: true
Consul
Consul — Service Discovery + Key-Value Store + Health Checks. Более зрелое решение для production:
Пример
spring:
cloud:
consul:
host: consul-server
port: 8500
discovery:
service-name: payment-service
health-check-interval: 10s
Kubernetes DNS
Если микросервисы работают в Kubernetes, Service Discovery встроено:
Пример
apiVersion: v1
kind: Service
metadata:
name: payment-service
spec:
selector:
app: payment-service
ports:
- port: 8080
# Другие сервисы обращаются по имени: http://payment-service:8080
В Kubernetes-среде часто отказываются от Eureka/Consul в пользу встроенного DNS, что упрощает архитектуру.
На собеседовании: покажите, что знаете оба подхода (client-side и server-side), и что в Kubernetes Service Discovery встроено через DNS. Частая ошибка — рассказывать только про Eureka, не упомянув Kubernetes.