Микросервисы и общие библиотеки


9

Мы разрабатываем систему на основе независимых микросервисов (подключенных через шину RabbitMq). Код будет (по крайней мере для первых компонентов) написан на python (как python2, так и python3). У нас уже есть монолитное приложение, реализующее некоторую бизнес-логику, которую мы хотим реорганизовать как микросервисы и расширить. Один вопрос, который меня беспокоит:

Каков наилучший способ обмена кодом между различными микросервисами. У нас есть общие вспомогательные функции (обработка данных, ведение журнала, анализ конфигурации и т. Д.), Которые должны использоваться несколькими микросервисами.

Сами микросервисы будут разрабатываться как отдельные проекты (git-репозитории). Общие библиотеки также могут быть разработаны как самостоятельный проект. Как я могу поделиться этими библиотеками между микросервисами?

Я вижу несколько подходов:

  • скопируйте версию библиотеки, которая требуется для каждого микросервиса, и обновите при необходимости
  • освободить общие библиотеки для внутреннего PyPi и перечислить эти библиотеки как зависимости в требованиях микросервиса
  • включить хранилище библиотеки как подмодуль git

Я хотел бы прочитать немного больше о предлагаемых подходах, лучших практиках, прошлом опыте, прежде чем принять решение о том, как действовать дальше. У вас есть предложение или ссылка?


Я не очень хорошо разбираюсь в микросервисах (моя компания недавно начала делать что-то подобное), чтобы ответить, но вот ссылка на презентацию о том, почему то, что вы описываете, является красным флагом и может привести к «распределенному монолиту» , Микросервисы не должны иметь общих библиотек. На самом деле они должны обмениваться данными только между четко определенными API, такими как Swagger (теперь он называется Open API ).
— Капитан Мэн

@CaptainMan: Конечно, но допустим, у вас есть эта простая функция: fib(n)(реализация ряда Фибоначчи). Вы не хотите повторять эту реализацию в каждом микросервисе. Это принадлежит utilsбиблиотеке (версионной, для функций и исправлений). Это не распределенный монолит, это просто слой общей функциональности. Мой вопрос, как обрабатывать этот уровень на уровне реализации?
— BlueFast

Наши микросервисы имеют общие библиотеки, чтобы обеспечить одинаковый обмен данными со всеми другими микросервисами в нашей системе. Я не уверен, как можно было бы сделать это с не-общими библиотеками; Как минимум, всем потребуются некоторые библиотеки манипуляций с XML / JSON / etc. Я еще не смотрел эту презентацию, но вы имели в виду более конкретное значение «общей библиотеки», чем то, о котором я думаю?
— Ixrec

1
@ jeckyll2hide Мы используем C ++, но наша инфраструктура для этого примерно эквивалентна вашему второму пункту: отдельный репозиторий, каждый объявляет свои зависимости, стандартная система сборки, которая знает, как найти эти зависимости во время сборки и т. д.
— Ixrec

1
Я чувствую себя как дурачок, ваш вопрос на самом деле не о микросервисных библиотеках, а о том, как поделиться библиотеками вашей команды с командой. Я знаю об этом достаточно, чтобы опубликовать ответ.
— Капитан Мэн

Ответы:


5

Ваш второй вариант, безусловно, путь. Разбейте общие библиотеки и установите их на свой локальный сервер PyPi.

Вариант 1 ужасен, потому что усовершенствования библиотек будет трудно распространить среди тех, кто может их использовать.

Вариант 3 аналогичен варианту 1.

Обычный шаблон заключается в настройке Jenkins так, что когда вы нажимаете на master для репозитория библиотеки, он выполняет сборку Python и автоматически загружает его в репозиторий PyPi. После того, как вы напишете этот скрипт сборки, вам больше не придется беспокоиться об упаковке библиотек и загрузке их вручную в PyPi. И с этой опцией все обновления библиотеки будут мгновенно доступны для возможного обновления на другие микросервисы.

Настроить свой собственный сервер PyPi очень просто. Мне нравится это руководство


1
Я согласен, что вариант 2 является лучшим, но вариант 3 с подмодулями имеет гораздо больше общего с вариантом 2, чем с вариантом 1.
— 8bittree

@ 8bittree: да, вариант 3 аналогичен варианту 2, но наличие git-сервера («центрального» удаленного) является механизмом распространения пакетов. С одной стороны, он использует git для чего-то, что не предназначено для (управления зависимостями), с другой стороны, он уменьшает количество компонентов (нет необходимости в частном PyPi)
— blueFast

2

Не Python парень, но сервер PyPi кажется лучшим вариантом. Быстрое поиск в Google создает видимость, что это аналогично наличию репозитория Nexus для Java-файлов команды.

Действительно, пока он развертывается в каком-то центральном хранилище (в офисе / команде), с которым может работать ваш предпочтительный инструмент управления зависимостями (чтение и развертывание), это хороший вариант.

Вариант 1 действительно худший, вам никогда не придется вручную разбираться с зависимостями. Это боль. В колледже до того, как я узнал о Maven, и когда я подумал, что Git слишком сложен, мы делали все вручную, от объединения кода каждого пользователя до настройки путей к классам и получения зависимостей. Это была боль, я бы серьезно не хотел, чтобы кто-то пережил хотя бы небольшую часть этой проблемы, особенно в рабочей среде, где важна эффективность.

Вариант 3, вероятно, будет работать нормально, но он не имеет никаких реальных преимуществ по сравнению с локальным PyPi (кроме того, что может быть проще в настройке, но преимущества реальной системы управления зависимостями намного лучше).


1

Прежде всего, разбить монолит на микросервисы всегда будет сложно. См. Децентрализованное управление данными - инкапсуляция баз данных в микросервисы, чтобы понять почему.

Тем не менее, есть несколько рецептов, как сделать это относительно разумно. Одним из них является http://12factor.net/ . Можно сказать, что вы должны поддерживать каждую библиотеку и приложение независимо, а затем явно управлять зависимостями. Если вы пойдете по этому пути, то я НАСТОЯТЕЛЬНО рекомендую вам иметь простую команду, которая обновляет все зависимости до текущей, и вы регулярно запускаете ее для каждого микросервиса. Важно иметь нормальный процесс выпуска, при котором вы блокируете версии библиотек в работе. Однако вы действительно, действительно , действительно не хотите находиться в положении, когда зависимости устаревают, и вы не знаете, что там происходит.

Также сосредоточьтесь на том, чтобы сделать ваши вспомогательные библиотеки максимально тесными и целенаправленными Всегда будет естественная тяга, чтобы начать добавлять материал в основные библиотеки для легкого обмена. Сделайте это, и вы быстро вытяните весь шарик существующих спагетти в общие библиотеки и эффективно вернетесь к тому беспорядку, который у вас есть сейчас. Поэтому лучше переоценить другой способ.


0

Вы должны быть в состоянии обойтись без сервера, указав непосредственно из файла зависимостей пакета Python на частные репозитории GitHub, содержащие библиотеки. Пипенв и Поэт оба поддерживают это, я полагаю.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.