Почему я должен предпочесть OSGi Services по экспортируемым пакетам?

Я пытаюсь получить голову вокруг OSGi Services. Основной вопрос, который я продолжаю задавать сам: каково преимущество использования сервисов вместо того, чтобы работать с пакетами и их экспортируемыми пакетами?

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

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

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

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

Подвести итог моих вопросов:

Каковы ключевые преимущества использования OSGi Services, которые делают их выше экспорта и импорта пакетов?


Дополнение

Я попытался собрать дополнительную информацию об этой проблеме и придумать некоторое сравнение между простым экспортом/импортом пакетов и сервисами. Возможно, это поможет нам найти удовлетворяющий ответ.

  1. Запустить/Остановить/Обновить

    Оба, пакеты (следовательно пакеты) и сервисы, могут быть запущены и остановлены. В дополнение к этому они могут быть отчасти обновлены. Сервисы также связываются с самим жизненным циклом пакета. Но в этом случае я просто имею в виду, можно ли начать и остановить сервисы или пакеты (так, чтобы экспортируемые пакеты "исчезли").

  2. Отслеживание изменений

    ServiceTracker и BundleTracker позволяют отследить и реагировать на изменения в доступности пакетов и сервисов.

  3. Определенные зависимости к другим пакетам или сервисам.

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

    Import-Package: net.jens.helloworld
    

    Был бы net.jens.helloworld предоставлять услугу, я должен был бы также импортировать пакет для получения интерфейса.

    Так в обоих случаях их было бы своего рода "плотное соединение" с более или менее определенным пакетом.

  4. Способность иметь больше чем одну реализацию

    Определенные пакеты могут быть экспортированы больше чем одним пакетом. Мог быть пакет net.jens.twitterclient, который экспортируется пакетом A и пакетом B. То же относится к сервисам. Интерфейс net.jens.twitterclient. TwitterService мог быть опубликован пакетом A и B.

Подвести итог этого здесь короткое сравнение (Экспортируемые пакеты/сервисы):

  1. ДА/ДА
  2. ДА/ДА
  3. ДА/ДА
  4. ДА/ДА

Таким образом, нет никакого различия.

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

сопроводительный текст http://img688.imageshack.us/img688/4421/bundleservicecomparison.png

Таким образом, если нет никакой реальной разницы между экспортируемыми пакетами и сервисами, каково преимущество использования сервисов?

Мое объяснение:

Использование сервисов кажется более сложным. Но сами сервисы, кажется, более легки. Это должно быть различие (с точки зрения производительности и ресурсов), если Вы запускаете/останавливаете целый пакет или если Вы только запускаете и останавливаете определенный сервис.

С архитектурной точки зрения я также предполагаю, что пакеты могли быть просмотрены как основа приложения. Основа не должна часто изменяться с точки зрения запуска и остановки пакетов. Функциональность обеспечивается сервисами этого, упаковывает в некотором динамическом слое выше "слоя пакета". Этот "уровень служб" мог подвергнуться частым изменениям. Например, сервис для запросов базы данных не зарегистрирован, если база данных идет офлайн.


Каково твое мнение? Я начинаю получать смысл сервисов, или я все еще думаю неправильный путь? Есть ли вещи, которые я пропускаю, который сделал бы сервисы намного более привлекательными по экспортируемым пакетам?

12
задан Jens 12 May 2010 в 00:24
поделиться

4 ответа

Я думаю, эта отличная статья могла бы ответить на многие ваши вопросы: OSGi, и как это случилось .

0
ответ дан 2 December 2019 в 21:02
поделиться

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

http://equinoxosgi.org/

Моя компания обычно создает более 100 пакетных приложений с использованием сервисов. Основные преимущества, которые мы получаем от использования сервисов:

1) Слабая связь между реализацией производителя и потребителя

2) Поставщики услуг с возможностью горячей замены

3) Более чистая архитектура приложения

4
ответ дан 2 December 2019 в 21:02
поделиться

Когда вы начинаете работать с OSGi, всегда проще начать с подхода export-package, он, конечно, кажется более похожим на java. Но когда ваше приложение начинает расти и вам требуется немного динамичности, сервисы - это то, что нужно.

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

Питер Криенс объясняет, почему он считает, что сервисы - это смена парадигмы так же, как в свое время ОО. см. µServices и Duct Tape.

За весь мой опыт работы с OSGi мне еще не доводилось реализовывать сложные сервисы (т.е. более одного уровня), и, безусловно, аннотации кажутся подходящим вариантом. Вы также можете использовать Spring dynamic module, чтобы облегчить боль от работы с сервис-трекерами. (и многие другие варианты, такие как iPOJO, и Blueprint)

2
ответ дан 2 December 2019 в 21:02
поделиться

Это довольно просто: Пакеты просто предоставляют классы, которые вы можете использовать. Используя импорты/экспорты, вы можете защитить видимость и избежать (например) конфликтов версий. Сервисы - это экземпляры классов, которые удовлетворяют определенному контракту (интерфейсам).

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

Когда вы просто хотите положиться на Bundle Layer OSGi, вы легко вводите сквозные зависимости к конкретным реализациям, которые вам обычно никогда не нужны. (читайте ниже об DI)

Это не является особенностью только OSGi - просто хорошая практика.

В мире, отличном от OSGi, вы можете использовать фреймворки Dependency Injection (DI), такие как Guice, Spring или подобные. OSGi имеет сервисный слой, встроенный в фреймворк, и позволяет фреймворкам более высокого уровня (Spring, Guice) использовать этот слой. - Так что в итоге вы обычно не используете OSGi Service API напрямую, а используете DI адаптеры из дружественных фреймворков (Spring-->Spring DM, Guice-->Peaberry и т.д.).

HTH, Toni

7
ответ дан 2 December 2019 в 21:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: