Миграция с монолитного приложения Spring на OSGI

За последние 10 лет мы создали два набора приложений, используя Spring в качестве внедрения зависимостей. Мы также используем spring-batch и spring-amqp. Теперь мы собираемся перейти на OSGI, чтобы наши монолитные приложения можно было разделить на пакеты, чтобы мы могли быть более гибкими. Два набора являются веб-приложениями и развертываются как два отдельных файла войны. Мы планируем использовать Apache Karaf в качестве среды выполнения OSGI.

Spring-DM мертв, и похоже, что нам придется преобразовать ВСЕ, чтобы использовать Blueprint для нашей инъекции зависимостей.

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

Любое руководство по этому поводу будет очень признательно.


person Josh Chappelle    schedule 15.02.2016    source источник
comment
Как это сработало для вас?   -  person Adrian Baker    schedule 16.05.2019
comment
Мы не использовали этот подход. Вместо этого мы начали двигаться к микросервисной архитектуре.   -  person Josh Chappelle    schedule 16.05.2019


Ответы (2)


Я предлагаю вам взглянуть на blueprint-maven-plugin. Это позволяет использовать подмножество аннотаций CDI и JEE для определения инъекций, а также транзакций и постоянства. Плагин создает xml чертежа во время сборки, который затем может быть выполнен karaf. Большим преимуществом является то, что эти аннотации также поддерживаются Spring. Таким образом, вы можете переходить и параллельно выпускать в производство, используя spring.

У меня есть полный пример здесь план на основе аннотаций и JPA.

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

person Christian Schneider    schedule 15.02.2016
comment
Спасибо! Это то, что я искал. Я удивлен, что больше нет сообщений в блогах о подобных вещах. Существует масса информации о том, как начать с osgi, но нет информации о переходе с весеннего приложения на osgi. Изучив все это, я склоняюсь к использованию PF4J вместо этого, чтобы нам не пришлось отказываться от наших 10-летних весенних инвестиций. Кроме того, он хорошо интегрируется с Apache Wicket, который является нашей внешней средой (я понимаю, что веб-консоль karaf также использует wicket). Ваш ответ, по крайней мере, дает мне понять, что если мы решим использовать OSGI, это можно сделать постепенно. - person Josh Chappelle; 16.02.2016

Вы можете подумать о том, чтобы сделать проблему выглядящей еще более серьезной и переключиться на DS вместо Blueprint... Чтобы по-настоящему воспользоваться преимуществами модели OSGi, DS намного превосходит Blueprint во всех аспектах. На самом деле, после первого препятствия вы добьетесь гораздо большего прогресса, и ваши успехи будут выше. Хотя Blueprint сделал Spring доступным для OSGi, он так и не «получил» OSGi.

Для стратегии держите свое приложение Spring в виде единого пакета и постепенно удаляйте его. т.е. слоновий подход.

Самый большой выигрыш, который дает OSGi, можно резюмировать следующим образом:

  • Убедитесь, что в модулях есть сервисные API, которые ТОЛЬКО обрабатывают совместную работу. т.е. API каждого сервиса должен быть историей/сценарием того, как действующие лица работают вместе, а не тем, как они возникают и настраиваются.
  • Позвольте администратору конфигурации работать с конфигурацией. т.е. никогда не раскрывайте API конфигурации. В OSGi вы регистрируете экземпляры, а не то, что еще нужно настроить.

Убедитесь, что вы действительно понимаете модель OSGi со службами. Возможно, вы захотите взглянуть на OSGi enRoute, который максимально использует OSGi.

person Peter Kriens    schedule 29.02.2016
comment
Спасибо. Я рассмотрю проект OSGI enRoute. На данный момент я реорганизовал наш код, чтобы иметь API и один плагин. Я использую ServiceLoader API для обеспечения модульности и точек расширения. Я думаю, что это хороший первый старт, и я думаю, что 95% этой работы нужно будет сделать независимо от того, используем ли мы OSGI или какой-либо другой фреймворк. Чтобы сделать наш код более модульным, требуется много времени. На данный момент я развертываю наши плагины в виде uber jar. Я понимаю ограничения этого подхода с зависимостями и всем остальным. Тем временем я продолжу исследовать OSGI. - person Josh Chappelle; 29.02.2016