Перевод статьи: https://amplication.com/blog/the-complete-microservices-guide
Автор: Мули Готтлиб
21 сентября 2023 г.
Введение в микросервисы
Почему микросервисы?
Что такое доменно-ориентированное проектирование?
Что такое распределенные сервисы?
Распределенные сервисы относятся к архитектуре программного обеспечения и подходу к проектированию, при котором различные компоненты, модули или функции приложения распределяются по нескольким машинам или узлам в сети.
В микросервисной архитектуре значительное внимание уделяется инфраструктуре, поскольку способ развертывания и управления микросервисами напрямую влияет на эффективность и масштабируемость системы.
-
Контейнеризация. Микросервисы часто упаковываются в контейнеры, такие как Docker, которые инкапсулируют приложение и его зависимости, обеспечивая согласованность между средой разработки, тестовой средой и производственной средой. Контейнеризация упрощает развертывание и управление ресурсами инфраструктуры.
-
Оркестрация. Микросервисы, как правило, развертываются и управляются с помощью платформ оркестрации контейнеров, таких как Kubernetes. Kubernetes автоматизирует развертывание, масштабирование и управление контейнеризованными приложениями. Это гарантирует эффективное распределение микросервисов по узлам инфраструктуры и возможность восстановления после сбоев.
-
Обнаружение сервиса. Микросервисы должны обнаруживать друг друга и взаимодействовать друг с другом в динамическом режиме. Инструменты обнаружения сервисов, такие как встроенные механизмы обнаружения сервисов etcd, Consul или Kubernetes, помогают находить микросервисы, работающие на разных узлах инфраструктуры, и подключаться к ним.
-
Масштабируемость. В микросервисной архитектуре особое внимание уделяется горизонтальному масштабированию, при котором при необходимости можно добавлять дополнительные экземпляры микросервисов, чтобы справляться с возросшими рабочими нагрузками. Инфраструктура должна поддерживать динамическое распределение и масштабирование ресурсов по мере необходимости.
Как создать микросервис?
Первым шагом в создании микросервиса является разбивка приложения на набор сервисов. Разбивка монолитного приложения на микросервисы включает в себя процесс декомпозиции, при котором вы идентифицируете отдельные функциональные возможности в монолите и реорганизуете их в отдельные, независимые микросервисы.
-
Анализ монолита. Тщательно изучите существующее монолитное приложение, включая его архитектуру, зависимости и функциональные возможности.
-
Идентификация бизнес-возможностей. Определите отличительные бизнес-возможности или функциональные возможности монолита. Это могут быть функции, модули или сервисы, которые можно логически разделить.
-
Определение границ сервиса. Установите четкие границы для каждого микросервиса. Определите, за что будет отвечать каждый микросервис, и убедитесь, что эти обязанности согласованы и четко определены.
-
Разделение данных. Изучите зависимости данных и решите, как данные будут распределяться между микросервисами. Возможно, вам придется ввести репликацию данных, синхронизацию данных и отдельные базы данных для каждого микросервиса.
-
Коммуникационные протоколы. Определите коммуникационные протоколы и API-интерфейсы между микросервисами. Для взаимодействия между сервисами обычно используются интерфейсы RESTful API, gRPC или очереди сообщений.
-
Отдельные базы исходного кода. Создайте разные базы исходного кода для каждого микросервиса. Для этого может потребоваться извлечение соответствующего кода и функциональности из монолита в отдельные репозитории для хранения исходного кода или в виде пакетов при использовании стратегии монорепозитория.
-
Декомпозиция базы данных. Если монолитное приложение использует одну базу данных, возможно потребуется разделить базу данных на более мелкие базы данных или схему внутри базы данных для каждого микросервиса.
-
Реализация логики сервиса. Разработайте бизнес-логику для каждого микросервиса. Убедитесь, что каждый микросервис может работать автономно и выполнять свои конкретные функции.
-
Интеграция и тестирование. Проведите всестороннее комплексное тестирование, чтобы убедиться, что микросервисы могут взаимодействовать и работать вместе должным образом. Для поддержания качества кода используйте непрерывную интеграцию (CI) и автоматическое тестирование.
-
Документация. Ведите полную документацию для каждого микросервиса, включая документацию по API и руководство по использованию для разработчиков, которые будут взаимодействовать с сервисами.
Как микросервисы обмениваются данными друг с другом?
Обмен данными между сервисами — важный аспект, который следует учитывать при создании микросервисов. Поэтому, какой бы подход вы ни выбрали, важно обеспечить, чтобы такая передача данных была эффективной и надежной.
-
Обмен данными между сервисами
-
Обмен данными внутри сервиса
Обмен данными между сервисами
Обмен данными между сервисами в микросервисах касается взаимодействия отдельных микросервисов друг с другом и внутри микросервисной архитектуры.
Асинхронная передача сообщений
Второй подход — асинхронная передача сообщений. В этом случае сервис отправляет сообщение, не дожидаясь немедленного ответа.
Обмен данными внутри сервиса
Обмен данными внутри сервиса в микросервисах — это взаимодействие и обмен данными внутри одного микросервиса, с охватом различных компонентов, модулей и уровней, входящих в этот микросервис.
Что такое избыточность в обмене данных микросервисов?
Как используется промежуточный слой в микросервисах?
Промежуточный слой играет решающую роль в микросервисной архитектуре, предоставляя услуги, инструменты и компоненты, которые облегчают обмен данными, интеграцию и управление микросервисами. Давайте обсудим некоторые варианты использования.
-
Связь между сервисами. Промежуточный слой предоставляет коммуникационные каналы и протоколы, которые позволяют микросервисам обмениваться данными друг с другом. Сюда могут входить брокеры сообщений, такие как RabbitMQ, Apache Kafka, платформы RPC, например, gRPC или RESTful API.
-
Обнаружение сервиса. Промежуточный слой для обнаружения сервисов помогает микросервисам находить другие микросервисы и подключаться к ним в динамическом режиме, особенно в динамических или контейнеризированных средах. В этом процессе помогают такие инструменты, как Consul, etcd или функции обнаружения сервисов Kubernetes.
-
API-шлюз. API-шлюз — это компонент промежуточного слоя, который служит точкой входа для внешних клиентов для доступа к микросервисам. Он может осуществлять аутентификацию, авторизацию, маршрутизацию запросов и агрегирование ответов от нескольких микросервисах.
-
Безопасность и аутентификация. Компоненты промежуточного слоя часто предоставляют функции безопасности, такие как аутентификация, авторизация и шифрование, для обеспечения безопасного обмена данными между микросервисами. Для повышения безопасности используются такие инструменты, как шлюзы безопасности OAuth2, JWT и API.
-
Мониторинг и ведение журналов. Промежуточный слой часто включает в себя компоненты мониторинга и ведения журналов, такие как ELK Stack, Prometheus и Grafana, для отслеживания работоспособности, производительности и поведения микросервисов. Это помогает при поиске и устранении неисправностей и оптимизации производительности.
Создание микросервисов с помощью Node.js
Создание микросервисов с помощью Node.js стало популярным выбором благодаря неблокируемой, событийно-ориентированной архитектуре Node.js и обширной экосистеме библиотек и платформ.
Если вы хотите создать микросервисы с помощью Node.js, есть способ значительно ускорить этот процесс за счет использования инструмента Amplication.
Понимание основ REST API.
REST (передача состояния представления) — это архитектурный стиль разработки сетевых приложений. REST APIs (интерфейсы прикладного программирования) — это способ предоставить функциональные возможности системы или сервиса другим приложениям через HTTP-запросы.
Как создать конечную точку REST API?
Существует множество способов разработки REST API. Здесь мы используем инструмент Amplication. Это можно сделать всего за несколько кликов.
Микросервисы + Безопасность
Безопасность — важнейший аспект при создании микросервисов. Только авторизованные пользователи должны иметь доступ к вашим API-интерфейсам. Итак, как вы можете защитить свои микросервисы?
Выберите механизм аутентификации
Централизованный сервис аутентификации
Защищенная связь
Внедрение промежуточного слоя аутентификации
Проверка маркеров
Управление пользователями и ролями
Ролевое управление доступом (RBAC)
Промежуточный слой авторизации
Точное управление доступом
💡Совет от профессионала. Когда вы создаете микросервисы с использованием инструмента Amplication, многие из вышеперечисленных проблем уже решаются автоматически — каждый созданный сервис включает в себя встроенный промежуточный слой аутентификации и авторизации. Вы можете легко управлять ролями и полномочиями для своих API-интерфейсов из интерфейса Amplication, а сгенерированный код уже будет включать соответствующие декораторы промежуточного слоя (охранные условия) для обеспечения авторизации на основе того, что вы задали в Amplication.
Тестирование микросервисов
Модульное тестирование
Тестирование взаимодействия компонентов системы
Развертывание микросервисов в производственной среде
Развертывание микросервисов в производственной среде требует тщательного планирования и выполнения, чтобы обеспечить стабильность, надежность и масштабируемость вашего приложения. Давайте рассмотрим некоторые основные шаги и их особенности.
-
Контейнеризация и оркестрация. Сначала нам нужно контейнеризировать микросервисы, используя такие технологии, как Docker. Контейнеры обеспечивают согласованность в среде разработки, тестовой среде и производственной среде. Для управления контейнерами и их развертывания с поддержкой масштабирования используйте платформы оркестрации контейнеров, такие как Kubernetes.
-
💡 Вы знали? Amplication предоставляет Dockerfile для контейнеризации ваших сервисов в готовом виде и имеет плагин для создания Helm Chart для ваших сервисов, чтобы упростить оркестрацию контейнеров.
-
Инфраструктура, представленная как код (IaC). Определите свою инфраструктуру с помощью кода (IaC) для автоматизации предоставления ресурсов, таких как виртуальные машины, балансировщики нагрузки и базы данных. В этом могут помочь такие инструменты, как Terraform, Pulumi и AWS CloudFormation.
-
Непрерывная интеграция и непрерывное развертывание (CI/CD). Внедрите конвейер сборки для автоматизации сборки, тестирования и развертывания микросервисов. Этот конвейер должен включать модульное тестирование, комплексное тестирование и этапы автоматизированного развертывания.
-
💡 Вы знали? У инструмента Amplication есть плагин для GitHub Actions, который создает начальный конвейер CI для вашего сервиса!
-
Настройка среды. Поддерживайте отдельные настройки среды, такие как разработка, конвейеризация и производство, чтобы обеспечить согласованность и свести к минимуму человеческие ошибки во время развертываний.
-
Управление учетными цифровыми идентификационными данными. Надежное хранение важных параметров конфигурации и учетных цифровых идентификационных данных обеспечивается с помощью таких инструментов, как AWS Secrets Manager или HashiCorp Vault. Избегайте жесткого кодирования учетных цифровых идентификационных данных в коде или файлах конфигурации.
-
Мониторинг и регистрация. Внедряйте решения для мониторинга и ведения журналов, чтобы отслеживать работоспособность и производительность ваших микросервисов в режиме реального времени. Могут помочь такие инструменты, как Prometheus, Grafana и ELK Stack (Elasticsearch, Logstash, Kibana).
-
💡 Правильно! Вы угадали! У инструмента Amplication есть плагин для OpenTelemetry, который отслеживает созданные вами сервисы и отправляет их в Jaeger
Масштабирование микросервисов
Масштабирование микросервисов включает в себя настройку мощности вашего приложения на основе микросервисов для обработки возросших нагрузок, трафика или объема данных при сохранении производительности, надежности и оперативности. Масштабирование может осуществляться вертикально (увеличение масштаба) и горизонтально (уменьшение масштаба). Ключевым преимуществом микросервисной архитектуры по сравнению с монолитной архитектурой является возможность индивидуального масштабирования каждого микросервиса, что обеспечивает экономичную работу (как правило, высокая нагрузка влияет только на отдельные микросервисы, а не на все приложение).
Вертикальное масштабирование
Горизонтальное масштабирование
Распространенные проблемы и лучшие методы
Микросервисная архитектура предлагает множество преимуществ, но имеет и свои проблемы.
Масштабируемость
-
Проблема. Масштабирование отдельных микросервисов при сохранении общей производительности системы может оказаться сложной задачей.
-
Лучшие методы. Внедрите автоматическое масштабирование на основе метрических показателей в режиме реального времени. Для эффективного масштабирования используйте платформы оркестрации контейнеров, такие как Kubernetes. Проведите тестирование производительности для выявления узких мест.
Защита
-
Проблема. Обеспечение безопасности нескольких микросервисов и управление аутентификацией и авторизацией может быть сложной задачей.
-
Лучшие методы. Внедрите модель безопасности на основе нулевого доверия с надлежащей аутентификацией, например OAuth 2.0, и авторизацией, например RBAC. Используйте API-шлюзы для обеспечения безопасности. Регулярно обновляйте и исправляйте зависимости для устранения уязвимостей безопасности.
Развертывание и DevOps
-
Проблема. Координация развертываний и управление конвейером сборки для большого количества микросервисов может оказаться сложной задачей.
-
Лучшие методы. Внедрите надежный конвейер сборки с автоматизированными процессами тестирования и развертывания. Используйте контейнеризацию, например Docker, и оркестрацию контейнеров, например Kubernetes, для обеспечения согласованности и масштабируемости. Убедитесь, что каждый микросервис полностью автономен с точки зрения развертывания.
Управление версиями и API
-
Проблема. Управление версиями API и обеспечение обратной совместимости имеют решающее значение, когда от API зависят несколько сервисов.
-
Лучшие методы. Используйте версионированный API-интерфейс и по возможности вносите обратно совместимые изменения. Для управления версиями и преобразования внедрите шлюзы API.
Мониторинг и отладка
-
Проблема. Отладка и мониторинг микросервисов в распределенной системе затруднены. Гораздо проще отслеживать поток запроса в монолите, чем отслеживать запрос, обрабатываемый распределенно.
Обработка транзакций базы данных
Обработка транзакций базы данных в микросервисной архитектуре может быть сложной из-за распределенного характера системы.
DevOps с микросервисами
Методологии DevOps необходимы при работе с микросервисами, чтобы обеспечить слаженное сотрудничество между командами разработки и операционными группами, автоматизировать процессы и поддерживать гибкость и надежность, необходимые в микросервисной архитектуре.
Автоматизация
Непрерывная интеграция (CI)
Контейнеризация
Мониторинг микросервисов
Стратегии развертывания
Заключение
В этом подробном руководстве мы углубились в мир микросервисов, рассмотрели концепции, архитектуру, преимущества и проблемы этого революционного подхода к разработке программного обеспечения. Микросервисы предлагают гибкость, масштабируемость и оптимизированную пригодность для обслуживания, но они также требуют тщательного планирования, проектирования и управления для полной реализации своего потенциала. Разбивая монолитные приложения на более мелкие, независимо развертываемые сервисы, организации могут быстрее и гибче реагировать на меняющиеся потребности бизнеса.