JavaRush /Курсы /Модуль 5. Spring /Лекция 245: Введение в Service Discovery (Eureka)

Лекция 245: Введение в Service Discovery (Eureka)

Модуль 5. Spring
25 уровень , 4 лекция
Открыта

Прежде, чем углубляться в дебри Eureka, давайте попробуем ответить на вопрос: чем плохо просто вручную задавать адреса микросервисов?

Представьте, что микросервисы — это не статичные здания с фиксированным адресом, а таксопарк. Машины (сервисы) постоянно выходят на маршрут, ломаются, заменяются новыми и меняют свое местоположение. Теперь попробуйте обслуживать клиентов, если у вас нет диспетчера — придется каждый раз вручную искать и записывать новые координаты машин.

В мире микросервисов таким "диспетчером" и является Service Discovery. Он автоматически отслеживает, какие сервисы доступны, где они находятся и куда нужно отправлять запросы. Eureka — одна из популярных реализаций этой системы.

Проблемы статической конфигурации:

  1. Увеличение риска ошибок. Если вам нужно вручную обновлять адреса всех микросервисов, то высока вероятность случайно что-то сломать. Особенно если вы используете десятки (а то и сотни) микросервисов.
  2. Усложнение масштабирования. При добавлении нового инстанса микросервиса нужно обновлять конфигурацию других микросервисов, которые с ним взаимодействуют.
  3. Долгое время реакции на изменения. Если адрес какого-либо сервиса изменился, понадобятся ручные действия для внесения правок. Это тормозит процесс доставки новых версий.

Service Discovery решает эти проблемы, позволяя микросервисам автоматически находить друг друга без необходимости ручной настройки. Его основная идея — централизованное управление адресами и метаданными сервисов.


Как работает Service Discovery?

Компоненты Service Discovery:

  • Service Registry (реестр сервисов): центральная база данных, где хранятся адреса (и другие метаданные) всех доступных микросервисов.
  • Service Provider (поставщик сервисов): микросервис, который регистрируется в Service Registry.
  • Service Consumer (потребитель сервисов): микросервис, который запрашивает адреса других сервисов из Service Registry, чтобы взаимодействовать с ними.

Пример цикла работы Service Discovery:

  1. Регистрация: Когда микросервис запускается, он регистрируется в реестре Service Registry, указывая свой адрес (обычно IP и порт) и другие параметры.
  2. Heartbeat (сигналы жизнедеятельности): Микросервис периодически посылает heartbeat-сообщения в реестр, чтобы сообщить, что он все ещё жив.
  3. Обнаружение: Другой микросервис (потребитель) получает адрес зарегистрированного сервиса, запрашивая его из реестра.
  4. Отмена регистрации: Если микросервис умирает (или его инстанс завершается), его запись удаляется из реестра.

Eureka

Теперь, когда мы понимаем концепцию Service Discovery, можно перейти к одному из самых популярных и легко интегрируемых инструментов — Eureka. Это библиотека Netflix, которая стала Open Source и является частью Spring Cloud.

Преимущества Eureka:

  1. Простая интеграция с Spring Boot. Вы можете легко добавить Eureka в ваш проект, просто подключив соответствующие зависимости.
  2. Поддержка динамической регистрации и обнаружения сервисов. Eureka облегчает масштабируемость и отказоустойчивость приложений.
  3. Поддержка схемы CAP (Consistency, Availability, Partition-tolerance). Eureka можно настроить так, чтобы она больше фокусировалась на доступности (Availability), что делает её идеальным выбором для микросервисов.
  4. Мониторинг и управление через Dashboard. Вы можете видеть зарегистрированные сервисы, их текущее состояние и метрики через веб-интерфейс.

Основные компоненты Eureka

  1. Eureka Server:
    • Центральный компонент в системе Service Discovery, хранящий информацию обо всех зарегистрированных сервисах.
    • Является централизованной базой данных для адресов микросервисов.
    • Отвечает за обработку регистраций и heartbeat-сообщений.
  2. Eureka Client:
    • Библиотека, которая подключается к вашим микросервисам, чтобы они могли регистрироваться в Eureka Server.
    • Также отвечает за получение адресов других сервисов из Eureka Server.
  3. Dashboard:
    • Веб-интерфейс для мониторинга Eureka Server. Показывает зарегистрированные сервисы, их состояние (UP/DOWN), логи и адреса.

Взаимодействие компонентов


+------------------+        Registration       +------------------+
|  Service A       |------------------------->|  Eureka Server   |
| (Eureka Client)  |     Service Discovery    |                  |
+------------------+<-------------------------+------------------+
+------------------+
|  Service B       |
| (Eureka Client)  |
+------------------+

Пример: Запуск Eureka Server

Прежде, чем использовать Service Discovery, мы должны запустить Eureka Server. Для этого выполним следующие шаги:

  1. Добавление зависимости в pom.xml
    
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
    </dependency>
    
  2. Аннотация @EnableEurekaServer

    В классе Application добавляем аннотацию для активации Eureka Server:

    @SpringBootApplication
    @EnableEurekaServer
    public class EurekaServerApplication {
        public static void main(String[] args) {
            SpringApplication.run(EurekaServerApplication.class, args);
        }
    }
    
  1. Настройка application.yml

    Создаем файл application.yml в папке resources:

    
    server:
      port: 8761 # порт Eureka Server
    eureka:
      client:
        register-with-eureka: false # Eureka Server сам себя не регистрирует
        fetch-registry: false       # Eureka Server не запрашивает реестр
      instance:
        hostname: localhost         # Основной хост
    
  1. Запуск приложения

    Теперь можно запустить приложение, и сервер Eureka будет доступен на http://localhost:8761.

Пример: Регистрация микросервиса в Eureka Server

После запуска сервера, настроим клиента для регистрации в нем.

  1. Добавление зависимости
    
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
    </dependency>
    

  2. Настройка клиента

    Добавим в application.yml настройку для подключения к Eureka Server:

    eureka:
      client:
        service-url:
          defaultZone: http://localhost:8761/eureka/ # URL Eureka Server
      instance:
        prefer-ip-address: true # Регистрировать IP вместо имени хоста
    
  1. Аннотация @EnableEurekaClient

    Добавим аннотацию в основной класс:

    
    @SpringBootApplication
    @EnableEurekaClient
    public class ServiceAApplication {
    public static void main(String[] args) {
        SpringApplication.run(ServiceAApplication.class, args);
    }
    }
    

Проверка

Запустите сначала Eureka Server, затем Eureka Client (ваш микросервис). Перейдите по адресу http://localhost:8761, чтобы увидеть, что ваш клиент зарегистрировался в системе. Там вы увидите имя сервиса, его статус и адрес.


Преимущества и вызовы

Использование Eureka значительно упрощает управление микросервисами в динамической среде, но стоит учитывать нагрузку на сервер и необходимость надёжной работы heartbeat-сообщений. Это мощный инструмент, который помогает сделать системы более гибкими и масштабируемыми.

Теперь, когда вы знаете, как работает Service Discovery, и даже умеете настраивать Eureka Server и Eureka Client, вы готовы создавать более сложные микросервисные приложения с автоматическим обнаружением сервисов.

Комментарии
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ