Рабочие пространства и микросервисы NPM
Как сделать MonoRepos с микросервисами в NPM?
Репозиторий -›https://github.com/RaulGF92/NpmWorkspaceMicroServices
Введение
В эти недели в моей работе мы говорим о MonoRepos и о том, как это может быть решением наших проблем.
Мы работаем с огромным облаком MicroService, и иногда любое изменение оказывает большое влияние на наш процесс разработки UpVersion -> PullRequest -> CI/CD, который может иметь минимальные изменения. большое усилие (и это выглядит так, что со временем может исчезнуть)
MonoRepo может быть решением этой проблемы, потому что:
- Все разработчики могут знать все микро
- Мы разделяем конфигурации проекта во всех проектах
- Мы могли бы внести «массовые изменения» во многие проекты.
Но у всех есть недостатки, и подход MonoRepo, используемый для того, чтобы иметь представление о монолитном проекте, а не о видении микросервисов, что очень пропитано философией моей компании, но может ли вести себя и то, и другое? Чем хороши MonoRepos и хороши MicroServices? Ответ — да, но вам придется немного повоевать, здесь у вас есть разные программные решения:
- NX.js: они лучше всего подходят для создания монорепозитория в JS, содержат генераторы, и вы можете без особых усилий развернуть их в MicroServices, проблема этого решения слишком сложна, если вы не будете следовать его структура, необходимая для начала создания собственных генераторов и скриптов (также передайте все эти знания команде разработчиков)
Я рекомендую этот блог, действительно полезный для знакомства с NX.js с микро
https://blog.nrwl.io/nx-and-node-microservices-b6df3cd1bad6
- Lerna.js:Lerna может быть хорошим решением, если у вас есть частное репозиторий NPM, Lerna загрузит каждый Micro в NPM, и они будут в вашем докере, вам нужно установить свою библиотеку MS в свой DockerFile, а затем запустить , для меня может быть решением, но очень сложным
Для меня этот блог помогает понять, как работает Lerna https://semaphoreci.com/blog/javascript-monorepos-lerna
- Рабочее пространство TurboRepo/NPM: для меня TurboRepo — лучшее решение не потому, что оно лучшее (на самом деле вам нужно понимать рабочее пространство NPM, чтобы понять TurboRepo), но оно открыто для вашей структуры, и вам нужно только использовать рабочее пространство NPM (в новой версии Lerna оно также используется). TurboRepo оптимизирует ваше выполнение (с разными проектами в одной рабочей области) и создаст кеши, чтобы избежать повторного сброса.
- бесполезные команды.
Начало работы с рабочей областью NPM
Следующая документация по NPM могла бы лучше объяснить вам, как рабочее пространство NPM работает лучше, чем мое, я объясню приложение для использования в MicroServices.
Вся моя структура и проекты находятся в репозитории, посмотрите, если хотите, и у него будет больше характеристик.
Мы собираемся создать рабочее пространство, которое следует этой структуре.
MyProject package.json package-lock.json applications | (Microservices) libs | (common projects)
У нас есть только одно правило! Одно уникальное правило! (Это правило повлияет на будущие CI/CD)
Проекты приложений НИКОГДА не должны импортировать другие проекты из папки приложений, только из папки libs
Установите микросервис
Мы собираемся установить новый MicroService, называемый User-Service (вы можете увидеть мою реализацию в моем репозитории).
npm init -w ./applications/user-service
Также мы собираемся создать общую библиотеку
npm init -w ./libs/hello-i18n
Теперь структура будет выглядеть так:
MyProject package.json package-lock.json applications | (Microservices) user-service package.json | libs | (common projects) hello-i18n package.json |
Дополнительную информацию можно найти внизу статьи, в разделе "Как работает рабочее пространство NPM".
Теперь мы собираемся установить минимальную установку, чем нужны все проекты, в моем случае это будут Express.js, TypeScript (см. в репо) и winston.js, в корневой папке мы выполнили
npm install --workspaces express winston mocha chai
Это установит зависимости в каждом проекте, и это важный ключевой момент: родительские рабочие пространства NPM не делятся зависимостями со своими дочерними элементами (это не совсем так, но это настоящий беспорядок и может быть отлично, на данный момент сказать, что это невозможно)
Пока я писал этот блог, я понял, что мы можем использовать процессор Gulp или Grunt, чтобы дать нам возможность синхронизировать различные пакеты, которые есть у родительского пакета в каждом дочернем пакете.
Чтобы установить определенную зависимость в другом проекте, вы можете установить ее с помощью команды -w:
npm install axios -w user-service
Как развернуть микросервис?
Это то, чем мы здесь занимаемся, и мы попытаемся ответить на этот вопрос. Идея состоит в том, чтобы создать файл DockerFile для каждого приложения или папки микросервиса, в этот файл DockerFile мы собираемся добавить полный монолит, но , мы добавим целевое приложение и всю папку lib, как в этом примере:
Внутри DockerFile мы устанавливаем все зависимости каждого элемента рабочей области и собираем все проекты (в случае монорепозитория машинописи), эти скрипты размещаются в родительской папке и будут содержать флаг с именем — если присутствует и они дают нам возможность не выделять всю рабочую область в каждой реплике, это здорово!
"scripts": { "build-all": "npm run build --workspaces --if-present", "install-all": "npm install --workspaces --if-present", "lint-all": "npm run lint --workspaces --if-present", "lint-fix-all": "npm run lint-fix --workspaces --if-present" },
И с этим моментом мы разрешили уникальное правило, которое было создано для этого решения:
Проекты приложений НИКОГДА не должны импортировать другие проекты из папки приложений, только из папки libs
Это связано с тем, что когда мы создаем микросервис, проект приложения не будет иметь доступа к другому приложению, но да к папке lib (это решение может быть изменено для пользовательской адаптации).
Теперь, если мы хотим развернуть это, мы можем использовать docker-compose или Kubernetes, это пример docker-compose, размещенный в корневой папке:
Так что это основная цель этой записи, я должен провести параллель с этим процессом в GitHub!
Как работает рабочее пространство NPM?
Если вы хотите узнать, как работает рабочее пространство NPM, вам нужно выполнить установку npm в родительской корневой папке, здесь NPM установит package.json из каждого дочернего элемента и внедрит его в родительский node_modules.
Если мы перейдем к package.json, мы увидим рабочую область (да, я использую Windows, но одинаково работает в системе Unix).
"workspaces": [ "applications\\user-service", "libs\\*" ]
И если мы хотим запустить какую-либо команду, например, для тестирования всех наших проектов, мы можем добавить родительский элемент, и родительский элемент выберет все рабочие области.
npm run test --workspaces
или конкретный проект:
npm run test --workspace=user-service