Ответ 1
Я рекомендую прочитать документ The Twelve-Factor App, вдохновленный шаблонами архитектуры корпоративных приложений и рефакторинга Мартина Фаулера. Он предлагает следующее:
- Для каждого приложения должно быть codebase (система управления версиями), а также множество развертываний приложения в разных средах (разработка, постановка, производство).
- Dependencies должны быть явно объявлены и изолированы (никогда не полагаясь на неявное существование общесистемных пакетов или системных инструментов).
- Config (все, что может варьироваться в зависимости от развертывания) должны храниться в среде, никогда в коде.
- Резервные службы (включая другие приложения) должны рассматриваться как подключенные ресурсы, доступ к которым осуществляется через локаторы/учетные данные, хранящиеся в Config.
- Сборка, выпуск и запуск должны быть строго отделены друг от друга.
- Приложение должно выполняться как один или несколько безстоящих и share-nothing processes (состояние никогда не должно храниться в "липких сеансах", но в хранилище данных который предлагает время истечения срока действия.)
- Приложение должно быть полностью автономным (обычно добавляя в приложение библиотеку веб-сервера), экспортируя HTTP в качестве службы привязки к порту.
- Из-за разветвленной природы приложения с двенадцатью коэффициентом processes, добавив больше concurrency должны быть просто и надежно достигнуты с помощью модели процесса.
- Приложение должно обрабатывать disposability, обеспечивая быстрый запуск и грациозное завершение работы.
- Разработки, настройки и производственные среды должны быть как можно более похожими (Dev/prod parity).
- Приложение должно обрабатывать logs как потоки событий, никогда не относящиеся к его маршрутизации или хранению.
- Процессы администратора должны выполняться как одноразовые процессы.
Там также статья о Microservices Джеймса Льюиса и Мартина Фаулера, в которой перечислены некоторые из перечисленных выше идей.
Что касается упаковки и развертывания, то следующие рекомендации:
-
Приложения (и их микросервисы) должны быть реализованы как компоненты вне процесса (а не внутрипроцессные библиотеки), которые могут быть независимо заменены, обновлены и развернуты. Компоненты обеспечивают более явный интерфейс компонента, используя явные механизмы удаленного вызова.
-
Организован вокруг возможностей бизнеса
Каждый компонент должен быть организован вокруг бизнес-возможностей для конкретной бизнес-области, осуществляя реализацию дорожного стека программного обеспечения, включая пользовательский интерфейс, постоянное хранилище и любые внешние взаимодействия. Этот подход также позволяет проекту кросс-команды работать вместе над одним и тем же компонентом (и владеть продуктом в течение всего его жизненного цикла).
-
Интеллектуальные конечные точки и немые трубы
Приложения, созданные из микросервисов, должны быть поставлены с использованием простых протоколов RESTish. Двумя наиболее часто используемыми протоколами являются HTTP-запрос-ответ с API-интерфейсом ресурсов и легкая передача сообщений по немой шине (например, RabbitMQ или ZeroMQ).
-
Операционная сложность построения, развертывания и эксплуатации микросервисов может быть уменьшена путем автоматизации с помощью Непрерывной доставки или ее предшественника Непрерывный Интеграция.