Я пытаюсь разобраться с OSGi Services. Основной вопрос, который я постоянно задаю себе: в чем преимущество использования сервисов вместо работы с пакетами и их экспортированными пакетами?
Насколько мне известно, концепция Late Binding как-то связана с этим. Зависимости пакета связываются вместе при запуске пакета, так что, я думаю, они довольно исправлены. Но с услугами это, кажется, почти то же самое. Пакет запускает и регистрирует сервисы или связывается с сервисами. Конечно, службы могут приходить и уходить когда угодно, и вы должны отслеживать эти шансы. Но основная идея не кажется мне другой.
Другим аспектом этого является то, что услуги более гибкие. Для одного конкретного интерфейса может быть много реализаций. С другой стороны, может быть много разных реализаций для определенного экспортируемого пакета.
В другом тексте я прочитал, что недостатком использования экспортируемых пакетов является то, что они делают приложение более хрупким, чем сервисы. Автор написал, что если вы удалите один пакет из графа зависимостей, другие зависимости больше не будут встречаться, что может вызвать эффект домино на всем графе. Но не может ли то же самое случиться, если служба отключится? Мне кажется, что сервисные зависимости не лучше, чем пакетные.
До сих пор я не мог найти запись в блоге, книгу или презентацию, в которой можно было бы четко описать, почему услуги лучше, чем просто демонстрация функциональности путем экспорта и импорта пакетов.
Подводя итог моим вопросам:
Каковы основные преимущества использования OSGi Services, которые делают их более выгодными, чем экспорт и импорт пакетов?
Добавление
Я попытался собрать дополнительную информацию об этой проблеме и найти какое-то сравнение между простым экспортом / импортом пакетов и сервисов. Может быть, это поможет нам найти удовлетворительный ответ.
Start / Stop / Update
Как пакеты, так и пакеты, и службы могут быть запущены и остановлены. В дополнение к этому они могут быть отчасти обновлены. Сервисы также связаны с самим жизненным циклом пакета. Но в данном случае я имею в виду, можно ли запускать и останавливать службы или пакеты (чтобы экспортированные пакеты «исчезали»).
Отслеживание изменений
ServiceTracker и BundleTracker позволяют отслеживать и реагировать на изменения в доступности пакетов и услуг.
Конкретные зависимости от других пакетов или услуг.
Если вы хотите использовать экспортированный пакет, вы должны импортировать его.
Import-Package: net.jens.helloworld
Будет ли net.jens.helloworld предоставлять услугу, мне также потребуется импортировать пакет для получения интерфейса.
Таким образом, в обоих случаях это будет своего рода "тесная связь" с более или менее специфической упаковкой.
Возможность иметь более одной реализации
Конкретные пакеты могут быть экспортированы несколькими пакетами. Может существовать пакет net.jens.twitterclient , который экспортируется из пакета A и пакета B. То же самое относится и к услугам. Интерфейс net.jens.twitterclient.TwitterService может быть опубликован пакетами A и B.
Подводя итог, короткое сравнение (экспортируемые пакеты / услуги):
- ДА / ДА
- ДА / ДА
- ДА / ДА
- ДА / ДА
Так что разницы нет.
Кроме того, кажется, что службы увеличивают сложность и вводят еще один уровень зависимостей (см. image ниже).
альтернативный текст http://img688.imageshack.us/img688/4421/bundleservicecomparison.png
Итак, если нет реальной разницы между экспортируемыми пакетами и сервисами, в чем преимущество использования сервисов?
Мое объяснение:
Использование услуг кажется более сложным. Но сами услуги кажутся более легкими. Должна быть разница (с точки зрения производительности и ресурсов), если вы запускаете / останавливаете весь пакет или просто запускаете и останавливаете конкретную службу.
С архитектурной точки зрения я также предполагаю, что пакеты можно рассматривать как основу приложения. Фонд не должен часто меняться с точки зрения запуска и остановки пакетов. Функциональность обеспечивается службами этих пакетов в некотором динамическом слое над «слоем пакета». Этот «уровень обслуживания» может подвергаться частым изменениям. Например, служба запросов к базе данных не регистрируется, если база данных отключается.
Каково ваше мнение? Я начинаю получать весь смысл услуг или я все еще думаю, что неправильно? Есть ли что-то, чего мне не хватает, что сделало бы услуги более привлекательными по сравнению с экспортируемыми пакетами?