Gymterview
middle

Что такое 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.