Pull to refresh

Comments 23

У меня тоже был опыт работы с OSGI. Например Spring поддерживается версии 3 - это 2010 год. То есть на технологию забили уже 14 лет. Ни одна современная бибилотека не поддерживает OSGI. Попытка что-то использовать выливается в перманентное сражение, и не факт что успешное. Да и OSGI, по моему мнению, стоит рассматривать как динамические сервисы И написание бандлов и вообще использование этой технологии стоит рассматривать именно так. Если у вас нет динамики - оно вам не нужно. А с учетом того, что сейчас бал правят микросервисы и даже application server - уже тоже не в почете, то что говорить о OSGI.

Поэтому перед использованием, следует не 10 а 1000 раз подумать, и выбрать что-то другое.

Karaf OSGi Runtime 4.4.5

January 10, 2024

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

Судя по тому, что вы говорите про Karaf, вы не знаете что такое OSGI, как оно работает, и что я имел ввиду, говоря про его поддержку.

Разъясняю: Karaf - это ядро/движок. К нему нужны бандлы, без них он никому не нужен. А бандлы перестали делать как раз, наверное, в году 2010.

Евли у вас все самописное, как например Eclipse, то все прекрасно. А если вам нужно что-то из современных библиотек и технологий - то тут все печально.

Очень смешно. У меня уже третий проект на нем. Начиная с 2010 года я с маленькими перерывами на нем работаю. А судя по тому что ни одной статьи про OSGI у вас нет (в отличие от меня), то я вами и спорить не стану. Оставайтесь при своем мнении.

в плане небиблиотечных зависимостей можно посмотреть как сделаны сервисы в Liferay. Мне показалось очень крутой возможность переопределять любые сервисы ядра без патчинга и "плагинов" и межмодульное взаимодействие как при использовании локального контекста.

Автор, а зачем вы берете Felix в чистом виде? Есть же Karaf и Fuse. И ServiceMix. Там все сильно удобнее. Или я вас не так понял?

Я хотел бы поделиться опытом реализации микроядерной архитектуры (microkernel) на Java с помощью OSGI (Open Service Gateway Initiative). Этот подход является промежуточным вариантом между микро-сервисной и монолитной архитектурой. С одной стороны присутствует разделение между компонентами на уровне VM с другой - межкомпонентное взаимодействие происходит без участия сети, что ускоряет запросы.

А разве микроядра - это не про операционки? Что значит промежуточный вариант, что за котопес? Без участия сети можно организовать компоненты и без OSGi. Вы точно понимаете о чем пишете?.. без обид

Я хоть OSGI и не трогал, но всегда думал, что это технология для изоляции нескольких программных модулей в рамках одной JVM. Т.е. можно, например, использовать разные несовместимые версии одной и той же библиотеки в разных модулях и это не сломается. Как бы вы организовали такое без OSGI? Shading?

Верно, краеугольный камень OSGi - свой загрузчик классов для каждого 'модуля'.
Поэтому, даже одноименные классы из разных модулей - это разный код в JVM.

И, приложение, реализованное на базе OSGi - проще конструировать/сопровождать, чем в концепции JAR hell, пусть, даже с использованием модулей Java.

OSGi не так прост, как кажется.
Стандарт OSGi настолько широк, что включает, например, спецификацию XML парсера...
А вот, короткая статья про ECF, реализацию спецификации удаленных OSGi-сервисов:
http://samolisov.blogspot.com/2011/06/eclipse-indigo-ecf.html

OSGi, говорят, использовался для создания встроенных систем (в частности, для автомобилей BMW).
Если интересно - посмотрите перевод книги "OSGi and Equinox. Creating Highly Modular Java Systems". http://vfedorov.info:7070/OSGiEquinox/
В ней, в качестве примера - приложение GPS трекера.
wiki книги спросит пользователь/пароль, соответственно ответить: anybody/123123

А разве микроядра - это не про операционки?

Нет, это architecture patterns.

Вы точно понимаете о чем пишете?

Я думаю, что да. Могу предложить исследовать статью oreilly, посвещенную этому вопросу, https://www.oreilly.com/content/software-architecture-patterns/. В статье представлен общий экскурс в architecture patterns. Надеюсь, что вы считаете это издание достаточно авторитетным.

Для тех кто живёт в экосистеме Spring выглядит попроще. Встроенный loader позволяет подгрузить любые джарки в класс пасс, главное собрать fat jar. Конечно не в рантайме но если это не нужно то это кажется самый оптимальный способ.

Как раз OSGI упрощает этот процесс сильно. Другое дело, что не всегда это реально нужно. И не всегда можно. Иногда собрать fat.jar таки приходится, но сильно реже, чем если вы собираете простое spring приложение.

Сегодня такое можно сделать не прибегая к сторонним фреймворкам. Java SDK позволяет построить модульный проект с изоляцией модулей на уровне загрузчиков классов и с динамической загрузкой/выгрузкой.

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

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

Что вы понимаете под разными частями проекта? Если эти части возможно выделить в отдельные модули и загрузить паралельно, то вполне себе возможно использовать разные версии guava в них.

Если интересно то советую посмотреть доклад Липского https://youtu.be/aw6YJLJG5hw?si=F0qDmPZivPw63-c1

В нем он кстати приводит недостатки OSGI.

Я уже делал подобную систему на Jigsaw и это работает.

В процессе исследований я обратил внимание на доклад Липского, но у меня не получилось на основе этой технологии реализовать одновременное использование разных версий guava в разных сервисах.

Root Service 
    ||
    ||====> Service A ===> Guava 10.0	
    ||
    ||====> Service B ===> Guava 33.1.0-jre	

Если вдруг у вас получилось с помощью Jigsaw это реализовать, пожалуйста, подскажите пример демо проекта / статьи с описанием реализации.

Заставлять нас искать кусок про OSGI в довольно длинном видео - это садизм :)

Можете примерно сказать, на какой минуте про OSGI? Все прочие доклады что я видел на эту тему, страдали тем, что авторы не понимали OSGI с практической стороны, т.е. никогда не использовали в жизни. Чистые теоретики.

Вопрос не в том, прибегая или нет. Вопрос скорее в том, как проще. И ответ на него не всегда одинаковый. Скажем, я не встречал тех проблем, что автор тут описывает, зато например split package, когда один пакет определен в двух разных jar, это как правило геморрой с гарантией.

Но в большинстве классических случае использования зависимостей (и конфликтов в процессе) в OSGI контейнере выглядит как-то примерно так (у меня опыт работы с чистым karaf. Fuse и ServiceMix, они все основаны на карафе же):

  • загружаем в контейнер очередной наш модуль

  • выясняем, что он не стартует, потому что зависимости не разрешились - нет каких-то пакетов

  • выясняем, откуда эти пакеты

  • устанавливаем зависимости прямо из репозитория maven

  • обновляем наш компонент

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

То есть, по сути это выглядит как добавление зависимостей при сборке проекта в pom.xml или чем мы там собираем - только в рантайме.

Безусловно все зависит от задач, но проекты на OSGI (в частности Apache Karaf) – это для неповоротливых монолитов, которые не перезапускаются месяцами, когда для деплоя мы подключаемся к консоли по ssh и выгружаем / загружаем модули вручную, когда перенос данных со стенда на стенд – это испытания и боль, когда отладка – это бессонные ночи. В современном мире с ci/cd, с kubernetes и микросервисами использовать Karaf – это боль. Говорю по собственному опыту. Но как упомянул все зависит от проекта, интересно узнать, что вас сподвигло на использование этого подхода?

У нас точно такая же нога, и не болит (с).

Не вижу причин, почему не использовать, если все что вы описываете, к нам неприменимо? Вас смущает отсутствие перезагрузки месяцами - а как по мне, это признак стабильности. Что в этом плохого-то, особенно в ситуации, когда бандлы можно перезагрузить на лету?

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

Упоминание же микросервисов меня вообще смутило. Для меня бандл это и есть микросервис. Понятно что не любой, я не могу написать бандл на Go. Но мне это и не нужно.

Возможно все ваши боли, или значительная их часть - от того, что вы не сами технологию выбрали, а вам она досталась, и была непривычной?

Sign up to leave a comment.

Articles