Pull to refresh

Comments 9

Когда говорят слово "микросервисы", часто забывают уточнить о каких именно аспектах микросервисности идёт речь. Независимые билды/деплойменты? Изоляция разных команд друг от друга? Использование разных ЯП для разных сервисов?

Если всё гарантированно пишется на джаве, лежит в одном репозитории, билдится и деплоится как монолит - можно просто сразу делать монолитную кодовую базу, в которой взаимодействие между модулями, в зависимости от профиля сборки, либо "напрямую" (обычные вызовы внутри ЯП), либо "через транспорт".

Такой подход упрощает разработку, потому что программируется фактически монолит - легко переиспользовать код, легко рефакторить, легко заставить работать локально, легко отлаживать, легко писать интеграционные тесты, а "микросервисность" появляется только при деплойменте.

Так вы любую внешнюю зависимость под монолит подведёте.

Собрать набор общих для многих проектов классов в мавен не делает проект монолитом.

Если изменения в одном сервисе требуют каскадных изменений в других, то это не микросервисы, а распределённый монолит.
А всякие переиспользование кода между именно микросервисами через общие зависимости де-факто не отменяет того, что придётся править в нескольких местах, т.к. как минимум надо поднимать версии в зависимостях и вносить правки в код, использующий эти самые общие библиотеки.

ИМХО - это слишком радикальный критерий. Например изменение API одного из микросервисов с потерей обратной совместимости гарантированно приведёт к каскадным изменениям в других микросервисах вне зависимости от того, используют они общие библиотеки или нет. Понятно, что обратную совместимость нужно всеми силами стараться сохранить. Но, жизнь штука сложная, и далеко не всегда получается это сделать.

Так об этом и речь. А если изменений всё равно не избежать, то и шарить общие библиотеки смысла нет.

Очень интересная мысль. Как то раньше я об этом не задумывался. Следуя вашей логике нам так же стоит отказаться от Maven'а с Gradle'ом. Ведь изменений в публичных open source библиотеках все равно не избежать! Зачем же нам тогда их шарить и управлять зависимостями? Скопипастить код библиотек в микросервисы - и дело с концом!

  1. Только ситхи всё возводят в абсолют.

Скопипастить код библиотек в микросервисы - и дело с концом!

Такой подход также может быть вполне оправдан, например, в commons-lang куча полезных утилитных классов, но для чего тащить эту зависимость в свой сервис, если из этой кучи используется один-два даже не класса, а метода?

При большом количестве микросервисов в проекте приходится сталкиваться с тем, что в некоторых из них нужно дублировать один и тот же код, а обнаружив баг в одном месте, искать и исправлять его везде. При этом, если микросервисы поддерживаются разными разработчиками, то каждый будет исправлять баг по-своему и в дальнейшем будет сложнее привести всё к единообразию

Исходные предположения мне показались не совсем верными, поэтому и логика всей статьи нарушена.
Микросервис это прежде всего функциональная независимость и самостоятельность, причём и функциональная, и кодовая. И именно "дублировать один и тот же код", "исправлять его везде" и приводить "всё к единообразию" как раз не нужно !
А при переиспользовании общего кода исправление найденного в нём бага уж точно будет не по-своему, а сообща и согласованно всеми разными разработчиками ).

Но сама тема общей кодовой база в микросервисах кажется интересной и требует дополнительного раскрытия.

По-моему, я уже видел на Хабре похожую статью про попытки сделать переиспользуемый код микросервисов, ушедшую в минусы. А, да, это же ваша статья про управления зависимости в микросервисах!

Sign up to leave a comment.

Articles