Концепции микросервисов (с использованием технологий Java)
В микросервисах у нас может быть запущено несколько служб, и каждая служба также может иметь несколько экземпляров.
Служба продуктов: просмотр продуктов с помощью rest api Служба заказов: размещает заказ Служба инвентаризации: проверяет, доступен ли продукт в службе уведомлений об инвентаризации:
Служба обнаружения
- У каждой службы может быть запущено несколько экземпляров, и они должны обнаруживать друг друга.
- Поскольку мы не можем конкретно указать службу, поскольку они являются несколькими экземплярами, ссылки на разные службы должны быть общими.
- Ссылка на одну услугу означает ссылку на доступные услуги.
- В java мы можем использовать spring cloud netflix эврика
Централизованная конфигурация
- Если мы изменим переменную конфигурации в коде, нам нужно внести изменения в код, скомпилировать и повторно развернуть его.
- Если у нас есть несколько экземпляров одной и той же службы, то это становится затруднительным, так как нам также необходимо отключить эти службы.
- Решение: Используйте централизованный сервер конфигурации
- Храните все переменные конфигурации различных служб в разных файлах в репозитории git или локальном хранилище.
- Всякий раз, когда в этих файлах происходят изменения, сервер конфигурации будет иметь новые переменные конфигурации.
- Теперь, чтобы обновить все переменные конфигурации во время выполнения, вам нужно вызвать какой-либо api-интерфейс, который обновит переменные конфигурации в этой службе и во всех ее экземплярах.
- В Java Центральный конфигурационный сервер с автоматическим обновлением
Хранение секретов в хранилище
- имена пользователей, пароли, ссылки на базы данных и т.д. Должны быть скрыты от конфигурации
- Мы должны установить хранилище в нашей системе или через докер, запуск хранилища также запустит сервер.
- Сохраните все секреты в хранилище.
- В Java мы можем использовать конфигурацию хранилища Spring starter для использования секретов в нашем коде.
- Достаточно просто подключиться к серверу хранилища, и все секреты станут доступны сервису.
Посредник сообщений
- Одна служба может зависеть от другой службы, изменение переменной конфигурации одной службы может повлиять на другую.
- Мы можем использовать брокер сообщений, такой как RabbitMQ, который сообщает о некоторых изменениях в конфигурации другим службам, которые подписаны на эту службу, в которой произошли изменения.
- RabbitMQ должен быть установлен в хост-системе и работать на каком-либо хосте и порту.
- RabbitMQ в инфре?
Шлюз API
- В нашем приложении могут быть разные сервисы.
- Каждая служба может обрабатывать разные конечные точки.
- Шлюз API, получает запрос uri от клиентов.
- Он перенаправляет клиента на правильный сервис.
- Он действует как распределенная центральная конечная точка.
- Мы также можем подключить балансировщики нагрузки к каждой службе.
- Здесь также можно позаботиться об аутентификации, мониторинге и ограничении скорости.
- Шлюз API также является сервисом и должен присутствовать в службе обнаружения.
- В Java, spring cloud gateway
Защита сервера с помощью аутентификации и авторизации
- Запустите keycloak на хост-машине, он запустится на каком-нибудь порту
- ретрансляция токенов:
- Если аутентификация выполняется с помощью токена, используя keycloak, поскольку мы будем авторизовываться на шлюзе api, нам также необходимо отправить этот токен на соответствующий шлюз.
- В Java используйте Keycloak
Упругость
- Служба заказов асинхронно взаимодействует со службой инвентаризации
- Служба инвентаризации может выйти из строя, поэтому нам нужно сделать ее устойчивой
- Интерпретатор запроса:
- Когда одна служба разговаривает с другой, маркер аутентификации не отправляется. Потому что это не механизм передачи токенов.
- Для передачи токена авторизации нам нужно получить токен и добавить его на предъявителя авторизации в заголовке запроса, а затем отправить запрос в службу.
- Определение: следите за перебоями в обслуживании и задержками в сети и временно останавливайте службу до тех пор, пока она снова не начнет нормально функционировать.
- В Java, Resilience или hystrix (netflix – сейчас не поддерживается)
Архитектура микросервисов, управляемых событиями
- Когда заказ размещен, служба заказов отправляет сообщение в службу уведомлений через RabbitMQ.
- Используйте привязки RabbitMQ для прослушивания событий
- выходные связующие: для отправки уведомлений
- привязки ввода: для получения уведомлений
Распределенная трассировка
- шаблон микросервисов позволяет нам отслеживать запросы от одного микросервиса к другому.
- Мы предоставляем уникальный идентификатор по ходу запроса
- каждый запрос имеет один и тот же идентификатор трассировки на протяжении всего пути
- но когда между ними есть автоматический выключатель, идентификатор трассировки изменяется, поскольку автоматический выключатель порождает новый поток. Но есть обходной путь, позволяющий сохранить наш идентификатор трассировки неизменным (отслеживаемая служба исполнителей на Java).
- В java мы используем spring cloud sleuth и zipkin
Централизованное ведение журнала
- журналы находятся во всех разных службах
- размещайте все журналы централизованно
- Сначала нам нужно использовать некоторую библиотеку ведения журнала в каждой службе, например log4J или logback
- остерегайтесь проблем с безопасностью при входе в систему
- В java (популярен стек ELK -> эластичный поиск, лог-кэш и кибана)
- logstash: службы приложений отправляют журналы в logstash по протоколу tcp. затем эти журналы отправляются из хранилища журналов в elasticsearch.
- этапы: (настройка в файле logstash.conf)
- ввод: из служб, использующих tcp или ftp или RabbitMQ
- фильтр: журналы фильтрации
- вывод: отправить в elasticsearch
- этапы: (настройка в файле logstash.conf)
- Эластичный поиск (реализация поисковой системы на java): Используется для хранения журналов
- Каждый сервис имеет свой собственный индекс в эластичном поиске
- Kibana: Визуализация, запрос и фильтрация данных эластичного поиска
- logstash: службы приложений отправляют журналы в logstash по протоколу tcp. затем эти журналы отправляются из хранилища журналов в elasticsearch.
Конец
- Не используйте микросервисную архитектуру, если в этом нет необходимости. В большинстве случаев лучше всего подходят монолиты.
Посетите мой личный блог здесь: https://rahilrehan.github.io/
Оригинал: “https://dev.to/rahil_rehan/microservices-concepts-java-1a5a”