Service Discovery: автоматическое обнаружения сервисов
В этом уроке мы реализуем паттерн Service Discovery, позволяющий микросервисам автоматически обнаруживать и общаться друг с другом.
Доработка функционала всех микросервисов будет происходить на основе кода предыдущих уроков ветки spring_cloud.
В микросервисной архитектуре каждый сервис может динамически менять своё расположение (например, IP-адрес или порт), а также может меняться количество запущенных экземпляров. Важно иметь механизм, который позволяет обновлять и распространять эту информацию среди всех взаимодействующих между собой элементов системы. Предположим, что наше приложение развернуто в prod-среде, в которой каждый микросервис поднят в нескольких экземплярах. Сейчас, например, в конфигурации Menu Aggregate Service прописано только по одному URL для связи с Menu Service и Review Service, что фактически лишает нас возможности работать с другими экземплярами этих сервисов. В этой ситуации на помощь приходит паттерн Service Discovery, который решает проблему, абстрагируя клиентов микросервисов от их фактического расположения в сети. Теперь вместо использования конкретных URL или IP адресов клиенты пользуются абстрактными идентификаторами микросервисов, зарегистрировавшихся в Service Discovery, а запросы маршрутизируются к разным экземплярам этих микросервисов с использованием балансировщика нагрузки. Информация о том, какие экземпляры “здоровы”, как правило, кешируется клиентами локально, чтобы не перегружать сеть при каждом запросе. Данные в кеше обновляются по заданному интервалу. Когда экземпляр микросервиса по какой-либо причине становится “нездоров”, он автоматически исключается из списка доступных для клиентов, и запросы более не отправляются к нему. Также сам сервер, на котором запущен Service Discovery, может быть развернут в нескольких экземплярах, чтобы не стать единой точкой отказа. В этом случае информация о микросервисах, регистрирующихся в нем, реплицируется между всеми инстансами Service Discovery. Рассмотрим диаграмму взаимодействия Menu Aggregate Service с Review Service и Menu Service, когда используется Service Discovery:- Поднимаются несколько экземпляров Service Discovery
- Каждый экземпляр микросервисов регистрируется в Service Discovery, при этом идентификаторы экземпляров одного и того же микросервиса совпадают, отличаются лишь их IP адреса и порты.
- Menu Aggregate Service получает от Service Discovery информацию обо всех экземплярах Menu Service и Review Service и кеширует ее локально.
- Menu Aggregate Service обращается к Review Service и Menu Service с помощью балансировщика нагрузки, который согласно своему алгоритму выбирает экземпляр, куда отправить HTTP запрос.
В проекте используется наиболее распространенная среди экосистемы Spring Boot реализация паттерна Service Discovery - Spring Cloud Netflix Eureka Service Discovery Библиотека состоит из двух частей: Eureka Server и Eureka Client.
200 OK