Сервер, клиент и шлюз Eureka
🙌 Репозиторий Github для приложения: https://github.com/OmarElGabry/microservices-spring-boot
Вспоминая нашу архитектуру приложения, у нас есть реестр сервисов, сервис изображений, сервис галерей и шлюз.
Служба галереи использует службу изображений внизу и извлекает список всех изображений для отображения.
Мы собираемся создать версию приложений для весенней загрузки: 2.0.0.RELEASE.
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.0.0.RELEASE</version> <relativePath/> </parent>
Сервер Eureka
Это сервер имен или реестр служб. Обязанность дать имена каждому микросервису. Почему?
- Нет необходимости жестко кодировать IP-адреса микросервисов.
- Что делать, если службы используют динамические IP-адреса; при автомасштабировании.
Итак, каждая служба регистрируется в Eureka и отправляет эхо-запрос на сервер Eureka, чтобы сообщить, что он активен.
Если сервер Eureka не получил никаких уведомлений от службы. Эта служба автоматически удаляется с сервера Eureka.
Шаги довольно простые. 1, 2, 3,… и готово !.
Ok. Итак, как обычно, создайте проект maven или воспользуйтесь spring initializr. Не забудьте включить в файл pom.xml
следующие зависимости: Web, Eureka Server и DevTools (необязательно).
Затем в файле application.properties
нам нужно установить некоторые конфигурации.
Наконец, в классе основного приложения весенней загрузки включите сервер Eureka с помощью аннотации @EnableEurekaServer
.
Все идет нормально?. Далее мы создаем наши сервисы; изображение и галерея.
Служба изображений
Клиентский сервис Eureka - это независимый сервис в микросервисной архитектуре. Это может быть оплата, учетная запись, уведомление, авторизация, конфигурация и т. Д.
Служба изображений действует как источник данных для изображений, каждое изображение имеет идентификатор, заголовок и URL-адрес. Достаточно просто ?.
Ok. Итак, для файла pom.xml
вместо Eureka Server используйте Eureka Client.
В файле application.properties
определяем конфигурации (как и раньше)
Затем включите клиент eureka, используя аннотацию @EnableEurekaClient
.
Теперь наш сервис изображений собирается предоставлять некоторые данные через конечные точки, не так ли? Итак, нам нужно создать контроллер и определить методы действий.
Не забудьте создать класс сущности Image с тремя полями; идентификатор, заголовок и URL.
Услуги галереи
Клиентская служба Eureka также может быть клиентом REST, который вызывает (потребляет) другие службы (службы REST API) в нашем приложении микросервиса.
Так, например, служба галереи вызывает службу изображений, чтобы получить список всех изображений или, возможно, только изображений, созданных в течение определенного года.
Вызовы от этого REST-клиента к другим службам можно выполнять с помощью:
- RestTemplate. Объект, который может отправлять запросы к службам REST API.
- FeignClient (действует как прокси) и предоставляет другой подход к RestTemplate.
И то, и другое - запросы балансировки нагрузки между сервисами.
- Что такое балансировка нагрузки?
Что делать, если несколько экземпляров службы работают на разных портах. Итак, нам нужно сбалансировать запросы между всеми экземплярами службы.
При использовании подхода «ленточный» (по умолчанию) запросы будут распределяться между ними поровну.
Итак, как обычно, начинаем с pom.xml
. Он такой же, как и для сервиса изображений. Далее идет файл application.properties
.
В классе основного приложения весенней загрузки, помимо включения клиента eureka, нам нужно создать bean-компонент для RestTemplate
для вызова службы изображений.
В контроллере вызовите службу изображений с помощью RestTemplate
и верните результат.
Хорошо, вот что нужно отметить. Поскольку мы используем restTemplate
, который, в свою очередь, использует Eureka Server для именования служб и Ribbon для балансировки нагрузки. Итак, мы можем использовать имя службы (например, image-service
) вместо localhost:port
.
Ворота - Зуул
При вызове любой службы из браузера мы не можем называть ее по имени, как это делали в службе галереи - это используется внутри служб между службами.
И поскольку мы создаем больше экземпляров сервисов, каждый с разными номерами портов, теперь возникает вопрос: Как мы можем вызывать сервисы из браузера и распределять запросы между их экземплярами, работающими на разных портах?
Что ж, обычное решение - использовать шлюз.
Шлюз - это единственная точка входа в систему, которая используется для обработки запросов путем их маршрутизации в соответствующую службу. Его также можно использовать для аутентификации, мониторинга и многого другого.
Что такое Зуул?
Это прокси, шлюз, промежуточный уровень между пользователями и вашими услугами.
Сервер Eureka решил проблему присвоения имен службам вместо жесткого кодирования их IP-адресов.
Но, тем не менее, у нас может быть несколько служб (экземпляров), работающих на разных портах. Итак, Зуул ...
- Сопоставляет префиксный путь say
/gallery/**
и службуgallery-service
. Он использует сервер Eureka для маршрутизации запрошенной службы. - Он балансирует нагрузку (с помощью ленты) между экземплярами службы, работающей на разных портах.
- Что еще? Мы можем фильтровать запросы, добавлять аутентификацию и т. д.
В pom.xml
добавьте зависимости: Web, Eureka Client и Zuul.
Стоит отметить, что Зуул выступает в роли клиента Eureka. Итак, мы даем ему имя, порт и ссылку на сервер Eureka (так же, как мы делали с сервисом изображений).
Наконец, включите Zuul и Eureka Client.
Тестирование наших микросервисов
Ok. Итак, у нас есть обнаружение службы; Сервер Эврика. Две услуги; изображение и галерея. И шлюз; Зуул.
Чтобы протестировать наше приложение, запустите сервер eureka, zuul, а затем две службы. Затем перейдите на сервер Eureka Server, работающий на localhost:8761
, вы должны увидеть запущенные службы.
Для запуска нескольких экземпляров. В eclipse перейдите в Run → Configurations / Arguments → VM options и добавьте
-Dserver.port=8300
Чтобы пропинговать службу галереи, отправьте запрос на шлюз, добавив путь для службы галереи localhost:8762/gallery
.
Вы должны увидеть сообщение ниже, и если вы снова нажмете URL-адрес, запрос будет перенаправлен на второй экземпляр службы галереи; благодаря балансировщику нагрузки.
Привет от службы галереи, работающей в порту: 8100
Привет от службы галереи, работающей в порту: 8300
Чтобы получить все изображения, нажмите localhost:8762/gallery/1
в браузере.
{ "id": 1, "images": [ { "id": 1, "title": "Treehouse of Horror V", "url": "https://.../rm3842005760" }, { "id": 2, "title": "The Town", "url": "https://.../rm3698134272" }, { "id": 3, "title": "The Last Traction Hero", "url": "https://.../rm1445594112" } ] }
Но мы еще не закончили! Нам все еще нужно аутентифицировать пользователей. Затем мы будем использовать JSON Web Tokens (JWT) для аутентификации.
Спасибо за чтение! Если вам понравилось, пожалуйста, похлопайте 👏 в ладоши.