Основано на книге: Микросервисы. "Паттерны разработки и рефакторинга" - Ричардсон Крис.
Масштабирование
Архитектура, сравнение, связанность
Межпроцессное взаимодействие и их типы
REST
Предоставляет набор архитектурных ограничений, которые, если их применять как единое целое, делают акцент на масштабируемости взаимодействия между компонентами, обобщенности интерфейсов, независимом развертывании компонентов и промежуточных компонентах, чтобы снизить латентность взаимодействия, обеспечить безопасность и инкапсулировать устаревшие системы
gRPC
Это фреймворк для написания многоязычных клиентов и серверов (см. ru.Wikipedia.org/wiki/Удалённый-ВызоВ-Процедур). gRPC представляет собой двоичный протокол на основе сообщений. Как вы помните из обсуждения двоичных форматов, это означает, что проектирование сервиса должно начинаться с его API. API в gRPC описывается с помощью языка IDL на основе Protocol Buffers — многоязычного механизма сериализации структурированных данных от компании Google.
Восстановление и обнаружение
Управление транзакциями в микросервисной архитектуре
Повествования, основанные на хореографии
Хореография — это один из способов реализации повествований. Она не предусма тривает центрального координатора, который выдает участникам команды. Вместо этого участники подписываются на события друг друга и реагируют соответству ющим образом.![](/images/17.png)
Повествования на основе оркестрации
Оркестрация — это еще один способ реализации повествований. Она подразумевает определение класса-оркестратора, единственной задачей которого является рассыл ка инструкций участникам. Оркестратор взаимодействует с участниками в стиле «команда/асинхронный ответ».![](/images/18.png)
Моделирование оркестраторов повествований в виде конечных автоматов
Конечный автомат — это хорошая модель для оркестратора повествования. Он со стоит из набора состояний и переходов между ними, которые инициируются с по мощью событий. У каждого перехода может быть какое-то действие, которое в кон тексте повествования означает вызов участника.![](/images/19.png)
Шаблоны организации бизнес-логики
- Правило 1. Ссылайтесь только на корень агрегата Оно требует, чтобы корневая сущность была единственной частью агрегата, на которую могут ссылаться внешние классы. Для обновления агрегата клиенту необходимо вызвать метод из его корня.
-
Правило 2. Межагрегатные ссылки
должны применять первичные ключи
I [равило состоит в том, что агрегаты ссылаются друг на друга по уникальному зна
чению, например по первичному ключу, а не по объектным ссылкам.
- Правило 3. Одна транзакция создает или обновляет один агрегат транзакция может создать или обновить только один агрегат
Шаблон "Агрегат"
Агрегат — это кластер доменных объектов, с которыми можно обращаться как с еди ным целым. Он состоит из корневой сущности и иногда одной или нескольких сущ ностей и объектов значений.![](/images/24.png)
Правила для агрегатов
![](/images/26.png)
Разработка бизнес-логики с порождением событий
Шаблон "Порождение событий"
Сохраняет агрегат в виде последовательности доменных событий, которые представляют изменения состояния: см https://microservices.io/patterns/data/event-sourcing![](/images/30.png)
Развитие доменных событий
Существует вероятность того, что приложению придется иметь дело с несколь кими версиями событий. Например, у сервиса, загружающего агрегат Order, может возникнуть необходимость в сохранении разных версий событий.
![](/images/31.png)
Реализация хранилища событий
Хранилище событий — это гибрид базы данных и брокера сообщений. Оно ведет себя как БД, потому что у него есть API для вставки и извлечения событий агрегата по первичному ключу. Но оно похоже и на брокер сообщений, потому что у него есть API, который позволяет подписываться на события.
![](/images/32.png)
Реализация запросов в микросервисной архитектуре
Тестирование микросервисов
- модульные тесты, которые тестируют небольшую часть сервиса, такую как класс;
- интеграционные тесты, которые проверяют, может ли сервис взаимодействовать с инфраструктурными компонентами, такими как базы данных и другие сервисы приложения;
- компонентные тесты — приемочные тесты для отдельного сервиса;
- сквозные тесты — приемочные тесты для целого приложения.