Совместно используемая библиотека привносит определенную связанность между применяющими ее сервисами. Вызванные сервисом A изменения в библиотеке, возможно, не требуются в сервисе B. Нужно ли будет менять сервис B в соответствии с новой версией библиотеки, хотя ему она, строго говоря, и не требуется? Если модифицировать сервис B, в нем появится не используемый им код и, что еще хуже, сервис B будет подвергаться риску возникновения вызываемых этим кодом ошибок. Если же не модифицировать, то у вас будет несколько версий библиотеки в производственной среде, что еще больше затруднит ее сопровождение. Оба сценария приводят к определенным сложностям или в сервисе B, или в общем ландшафте сервиса.
Подходят ли микросервисы для этих создаваемых с нуля проектов? Все зависит от обстоятельств. Вот вопросы, которые следует задать себе в таком случае. • Пойдет ли этой системе на пользу возможность раздельного развертывания подсистем? • Сможете ли вы создать довольно сильно автоматизированную систему развертывания? • Достаточно ли хорошо вы знакомы с предметной областью, чтобы правильно распознать и разделить различные независимые бизнес-возможности системы? • Достаточно ли широка сфера действия системы, чтобы оправдать сложность распределенной архитектуры? • Достаточно ли широка сфера действия системы, чтобы оправдать затраты на создание системы автоматизации развертывания? • Просуществует ли проект достаточно долго, чтобы оправдать предварительные вложения средств в автоматизацию и развертывание?
Более того, микросервисы предпочитают асинхронное взаимодействие с помощью событий и придают особое значение отказоустойчивости везде, где требуется синхронное взаимодействие. Эти свойства при надлежащей реализации обеспечивают высокую доступность и хорошую масштабируемость системы.
Каждый грамотно спроектированный микросервис обеспечивает единственную функциональную возможность. Не две и не три — только одну.
• У микросервиса имеется собственное хранилище данных. Никакие другие сервисы не могут взаимодействовать с хранилищем данных микросервиса. Этот факт, а также типичный объем кода микросервиса означают, что можно охватить весь микросервис одним взглядом и сразу понять, что он собой представляет.
• Для грамотно написанных микросервисов могут и должны быть созданы всесторонние автоматизированные тесты.
С точки зрения эксплуатации в обеспечении удобства сопровождения микросервисов играют роль два фактора.
• Небольшая команда разработчиков может сопровождать несколько микросервисов. Микросервисы должны быть спроектированы в расчете на эффективную эксплуатацию, из чего следует, что должна существовать возможность легко определять текущее состояние любого микросервиса.
• Все микросервисы можно разворачивать по отдельности.