Що вирішує OSGi?


279

Я читав у Вікіпедії та інших сайтах про OSGi , але насправді не бачу великої картини. Це говорить про те, що це платформа на основі компонентів, і ви можете перезавантажувати модулі під час виконання. Також "практичним прикладом", наведеним скрізь, є платформа Eclipse Plugin.

Мої запитання:

  1. Яке чітке та просте визначення OSGi?

  2. Які поширені проблеми це вирішує?

Під "загальними проблемами" я маю на увазі проблеми, з якими ми стикаємося щодня, наприклад "Що OSGi може зробити для того, щоб зробити нашу роботу більш ефективною / веселою / простою?"

Відповіді:


95

які переваги надає компонентна система OSGi?
Ну, ось досить список:

Зменшена складність - Розробка за допомогою технології OSGi означає розробку пакетів: компонентів OSGi. Пачки - це модулі. Вони приховують свою внутрішню інформацію від інших пакетів і спілкуються через чітко визначені сервіси. Приховувати внутрішні засоби означає більше свободи змінитись згодом. Це не тільки зменшує кількість помилок, але й робить його більш простими в розробці, оскільки правильно розміщені пакети реалізують частину функціональності через чітко визначені інтерфейси. Є цікавий блог, в якому описано, що зробили технології OSGi для процесу їх розробки.

Повторне використання - модель компонентів OSGi дозволяє дуже просто використовувати багато компонентів сторонніх програм у додатку. Зростаюча кількість проектів з відкритим кодом забезпечує їхні JAR готові до OSGi. Однак комерційні бібліотеки також стають доступними як готові пакети.

Реальний світ -Основа OSGi динамічна. Він може оновлювати пачки на ходу, а служби можуть надходити та йти. Розробники, які звикли до більш традиційної Java, розглядають це як дуже проблематичну особливість і не бачать переваги. Однак виявляється, що реальний світ є надзвичайно динамічним, а динамічні послуги, які можуть приходити та йти, робить ці послуги ідеальними для багатьох сценаріїв реального світу. Наприклад, сервіс може моделювати пристрій у мережі. Якщо пристрій виявлено, сервіс реєструється. Якщо пристрій вимкнеться, сервіс незареєстрований. Існує дивовижна кількість реальних сценаріїв, які відповідають цій динамічній моделі обслуговування. Тому програми можуть повторно використовувати потужні примітиви реєстру сервісів (зареєструвати, отримати, перелічити з експресивною мовою фільтра та очікувати появи та зникнення служб) у власному домені. Це не тільки економить код написання, але й забезпечує глобальну видимість, інструменти налагодження та більше функціональних можливостей, ніж було б реалізовано для спеціалізованого рішення. Написання коду в такому динамічному середовищі звучить як кошмар, але, на щастя, існують класи підтримки та рамки, які позбавляють більшості, якщо не всіх, болю від цього.

Простота розгортання - технологія OSGi не просто стандарт для компонентів. Він також визначає спосіб встановлення та управління компонентами. Цей API використовується багатьма пакетами для надання агента управління. Цей агент управління може бути таким же простим, як командна оболонка, драйвер протоколу управління TR-69, драйвер протоколу OMA DM, інтерфейс хмарних обчислень для EC2 Amazon або система управління IBM Tivoli. Стандартизований API управління полегшує інтеграцію технології OSGi в існуючі та майбутні системи.

Динамічні оновлення - компонентна модель OSGi - це динамічна модель. Пакети можна встановлювати, запускати, зупиняти, оновлювати та видаляти, не збиваючи всієї системи. Багато розробників Java не вірять, що це можна зробити надійно і тому спочатку не використовують це у виробництві. Однак, використовуючи це в розробці протягом деякого часу, більшість починає розуміти, що це насправді працює і значно скорочує час розгортання.

Адаптивна - модель компонентів OSGi розроблена з самого початку, щоб забезпечити змішування та узгодження компонентів. Це вимагає, щоб залежності компонентів були визначені, і це вимагає, щоб компоненти жили в середовищі, де їх необов'язкові залежності не завжди доступні. Реєстр сервісів OSGi - це динамічний реєстр, де пакети можуть реєструвати, отримувати та прослуховувати послуги. Ця динамічна модель сервісу дозволяє пакетам дізнатися, які можливості доступні в системі та адаптувати функціональні можливості, які вони можуть надати. Це робить код більш гнучким та стійким до змін.

Прозорість - Пакети та послуги є першокласними громадянами в середовищі OSGi. API управління забезпечує доступ до внутрішнього стану пакету, а також до того, як він підключений до інших пакетів. Наприклад, більшість фреймворків надають командну оболонку, яка показує цей внутрішній стан. Частину програм можна зупинити, щоб налагодити певну проблему, або ввести діагностичні розшарування. Замість того, щоб дивитися на мільйони рядків виходу журналу та тривалий час перезавантаження, програми OSGi часто можуть бути налагоджені живою командною оболонкою.

Версії версій - Технологія OSGi вирішує пекло JAR. Адже JAR пекло - проблема, що бібліотека A працює з бібліотекою B; версія = 2, але бібліотека C може працювати лише з B; версія = 3. У стандартній Java вам не пощастило. У середовищі OSGi всі пакети ретельно впорядковані, і лише ті групи, які можуть співпрацювати, з'єднуються в одному просторі класу. Це дозволяє обидва пакети A і C функціонувати з власною бібліотекою. Хоча не рекомендується проектувати системи з цією версією версій, в деяких випадках це може врятувати життя.

Простий - API OSGi напрочуд простий. Основний API - це лише один пакет і менше 30 класів / інтерфейсів. Цього основного API достатньо для запису пакетів, їх встановлення, запуску, зупинки, оновлення та видалення та включає всі слухачі та класи безпеки. Є дуже мало API, які забезпечують стільки функціональних можливостей для так мало API.

Невеликий - OSGi Release 4 Framework може бути реалізований у файлі JAR розміром близько 300 Кб. Це невеликі накладні витрати на кількість функціональних можливостей, які додаються до програми, включаючи OSGi. Таким чином, OSGi працює на великому діапазоні пристроїв: від дуже маленьких, до малих, до мейнфреймів. Він лише просить запустити мінімальний Java VM і додає дуже мало його зверху.

Швидкий - Однією з головних обов'язків основи OSGi є завантаження класів з пакетів. У традиційній Java JAR повністю видимі та розміщені у лінійному списку. Пошук класу вимагає пошуку за цим списком (часто дуже довгий, 150 - це не рідкість). На відміну від цього, OSGi попередньо з'єднує зв'язки і знає для кожного пакета, який саме пакет забезпечує клас. Ця відсутність пошуку є важливим фактором прискорення роботи при запуску.

Ледачий - Ледачий у програмному забезпеченні хороший, а в технології OSGi є багато механізмів, щоб робити речі лише тоді, коли вони справді потрібні. Наприклад, пакети можна запускати з нетерпінням, але вони також можуть бути налаштовані так, щоб починатись лише тоді, коли інші пакети використовують їх. Послуги можуть бути зареєстровані, але створені лише тоді, коли вони використовуються. Технічні характеристики були оптимізовані кілька разів, щоб забезпечити подібний тип лінивих сценаріїв, які можуть заощадити величезні витрати на виконання.

Безпечний - Java має дуже потужну дрібнозернисту модель безпеки в нижній частині, але, як виявилося, це важко налаштувати на практиці. Результат полягає в тому, що більшість захищених програм Java працює з двійковим вибором: відсутність безпеки або обмежені можливості. Модель безпеки OSGi використовує тонкозернисту модель безпеки, але покращує зручність використання (а також зміцнення оригінальної моделі) за рахунок того, щоб розробник пакету вказував потрібні деталі безпеки у легко перевіреній формі, в той час як оператор навколишнього середовища залишається повністю відповідальним. В цілому, OSGi, ймовірно, забезпечує одне з найбезпечніших прикладних середовищ, яке все ще може бути недоступним для обчислювальних платформ, захищених апаратним забезпеченням.

Ненав'язливі - Програми (пакети) в середовищі OSGi залишаються своїми. Вони можуть використовувати практично будь-який об'єкт VM, не обмежуючи їх OSGi. Найкраща практика в OSGi - писати звичайні старі об’єкти Java, і з цієї причини для служб OSGi не потрібен спеціальний інтерфейс, навіть об’єкт Java String може виступати як служба OSGi. Ця стратегія полегшує код програми легше переносити в інше середовище.

Бігає скрізь - ну, це залежить. Початкова мета Java - бігти куди завгодно. Очевидно, що неможливо запустити весь код скрізь, тому що можливості Java VM відрізняються. Віртуальний мобільний телефон у мобільному телефоні, ймовірно, не підтримуватиме ті самі бібліотеки, що і основний модуль IBM, який працює з банківською програмою. Є два питання, про які слід подбати. По-перше, API OSGi не повинні використовувати класи, які доступні не у всіх середовищах. По-друге, пакет не повинен запускатися, якщо він містить код, який недоступний у середовищі виконання. Обидва ці питання були вирішені в специфікаціях OSGi.

Джерело: www.osgi.org/Technology/WhyOSGi


2
Мені здається, що можна досягти хоча б деяких цих переваг, просто використовуючи SOA (без громадянства / штату). Коли я розгортаю виправлену / оновлену версію компонента в іншу (версійну) кінцеву точку, я можу просто мати залежний компонент, переключитися та використовувати виправлену службу в новій кінцевій точці. Оскільки я можу одночасно розгортати та працювати як стару, так і нову версію, я також можу мати залежний компонент використовувати різні частини як старої, так і нової версії за потребою.
MikeM

1
Схоже, люди переживають пекло багато проблем, щоб зробити мікросервіси та SOA, щоб (сподіваємось) отримати на 20% більше функціональності, ніж OSGi. Компанії повинні двічі подумати, скільки OSGi дає за так мало додаткової роботи. Усі сервіси в одному JVM в рамках одного процесу, де можна скористатися декількома службами в режимі офлайн або модернізувати за потребою
Тедді

Пакети OSGi можуть бути просто найближчою абстракцією до невловимого "компонента", який люди шукали протягом віку!
Тедді

SOA та мікросервіси можуть забезпечити деякі переваги, але за значно більших витрат. В обох випадках вся комунікація відбувається по мережі, що є дуже дорогим порівняно з місцевими дзвінками. Управління версіями в SOA та мікросервісах також є досить кошмаром. Виклик служби OSGi порівняно такий же дешевий, як і будь-який виклик методу Java.
Крістіан Шнайдер

90

Я знайшов такі переваги від OSGi:

  • Кожен плагін - це артефакт, що має власний завантажувач класів.
  • Кожен плагін залежить як від конкретних банок, які він містить, так і від інших конкретних модулів із версією.
  • Через версій та ізольованих завантажувачів класів різні версії одного артефакту можуть завантажуватися одночасно. Якщо один компонент вашої програми покладається на одну версію плагіна, а інша залежить від іншої версії, вони можуть бути завантажені одночасно.

Завдяки цьому ви можете структурувати свою програму у вигляді набору артефактів із плагінами, які завантажуються на вимогу. Кожен плагін є окремим компонентом. Так само, як Maven допомагає вам структурувати свою збірку, так що вона повторюється і визначається набором конкретних версій артефактів, створених нею, OSGi допомагає робити це під час виконання.


14
Однією з найбільших переваг цього сильного механізму версій є те, що залежності перевіряються під час розгортання, це означає, що ви отримуєте невирішені помилки залежності під час розгортання замість NoClassDefFoundErrors під час виконання. Крім модульної системи, сервісний рівень OSGi заслуговує на згадку. Почати це не так просто, оскільки це впливає на вашу архітектуру (і використовувати її не завжди доцільно), але після її прийняття це дуже потужна система.
Баренд

58

Мене не надто хвилює гаряча підключення модулів OSGi (принаймні, зараз). Це більше примусова модульність. Не маючи в будь-який час мільйонів "публічних" класів, доступних на класній стежці, добре захищає від кругових залежностей: Вам потрібно по-справжньому подумати про свої публічні інтерфейси - не лише з точки зору конструкції мови java "public", а з точки зору вашої бібліотеки / module: Які (саме) компоненти, які ви хочете зробити доступними для інших? Які (саме) інтерфейси (інших модулів) вам справді потрібні для реалізації своєї функціональності?

Приємно, що горяча штепсельна виставка входить разом із цим, але я б краще перезапустити свої звичайні програми, ніж тестувати всі комбінації гарячої підключення ...


9
Ви можете досягти того ж, використовуючи Guice та пакети, експортуючи лише інтерфейси та модулі та позначивши все інше - приватне
Pablo Fernandez

20
  • Можна, аналогічно кажучи, змінити мотор свого автомобіля, не вимикаючи його.
  • Ви можете налаштувати складні системи для клієнтів. Побачити силу затемнення.
  • Ви можете повторно використовувати цілі компоненти. Краще, ніж просто предмети.
  • Ви використовуєте стабільну платформу для розробки додатків на основі компонентів. Переваги від цього величезні.
  • Ви можете створювати компоненти за допомогою концепції чорного поля. Іншим компонентам не потрібно знати про приховані інтерфейси, вони бачать лише опубліковані інтерфейси.
  • Ви можете використовувати в одній і тій же системі кілька рівних компонентів, але в різних випусках, без шкоди для програми. OSGi вирішує проблему Jar Hell.
  • З OSGi ви розвиваєте мислення для архітекторських систем з CBD

Є багато переваг (я нагадав саме зараз), доступних для всіх, хто використовує Java.


15

відредаговано для наочності. Сторінка OSGi дала кращу просту відповідь, ніж моя

Проста відповідь: Сервісна платформа OSGi забезпечує стандартизоване, орієнтоване на компоненти обчислювальне середовище для співпраці мережевих служб. Ця архітектура значно зменшує загальну складність створення, обслуговування та розгортання програм. Сервіс-платформа OSGi пропонує функції динамічно змінювати склад на пристрої різних мереж, не вимагаючи перезавантаження.

Скажімо, в одній структурі програми, скажімо, Eclipse IDE, перезапустити не варто, встановивши новий плагін. Використовуючи повністю реалізацію OSGi, ви повинні мати змогу додавати плагіни під час виконання, отримувати новий функціонал, але зовсім не потрібно перезапускати затемнення.

Знову ж таки, не велика справа на кожен день, невелике використання додатків.

Але, коли ви починаєте дивитися на багатокомп'ютерні, розподілені рамки додатків, саме тут і починає цікаво. Коли вам доведеться мати 100% часу роботи для критичних систем, корисна можливість переходу компонентів або додавання нових функціональних можливостей під час виконання. Зрозуміло, є можливості зробити це зараз здебільшого, але OSGi намагається поєднати все в хороший маленький фреймворк із загальними інтерфейсами.

Чи вирішує OSGi загальні проблеми, я не впевнений у цьому. Я маю на увазі, це може, але накладні витрати можуть не коштувати цього для більш простих проблем. Але це щось, що слід враховувати, коли ви починаєте мати справу з більшими, мережевими програмами.


Ви хочете сказати, що OSGi забезпечує механізм між JVM для виявлення послуг у розподіленому середовищі? На моє власне запитання ( stackoverflow.com/questions/375725/… ) відповіли так, ніби OSGi є одиночним VM
oxbow_lakes

Що ви маєте на увазі під "мережами" в "динамічно змінювати склад на пристрої різних мереж"?
Тіло

Чи не мікросервіси вирішують подібні проблеми?
Вібха

12

Кілька речей, які мене змушують на OSGi:

1) Виконання та їх завантажувачі контексту мають багато примх до них і можуть бути дещо асинхронізованими (ми використовуємо фелікс всередині злиття). Порівняно з чистою весною (без DM), де [main] в значній мірі працює через усе синхронізацію.

2) Заняття після рівного навантаження не рівні. Скажімо, наприклад, у вас є режим кешу тангосолу в сплячому режимі. Він заповнений Fork.class, поза сферою OSGi. Ви завантажуєте нову банку, і Fork не змінився. Клас [Fork]! = Клас [Fork]. Це також з'являється під час серіалізації з тих самих основних причин.

3) Кластеризація.

Ви можете обійти ці речі, але це головний біль, і ваша архітектура виглядає недосконалою.

А тим, хто рекламує гарячу підключення .. Клієнт №1 OSGi? Затемнення. Що робить Eclipse після завантаження пакета?

Він перезавантажується.


Не забудьте зазначити, що Eclipse може навіть не завантажуватися, оскільки графік залежності OSGi був розбитий цим новим пакетом.
Мартін Висний

6

OSGi робить ваш код кидок NoClassDefFoundErrorі ClassNotFoundExceptionбез видимих причин (швидше за все тому , що ви забули експортувати пакет в файлі конфігурації OSGi); оскільки у нього є ClassLoaders, це може зробити ваш клас com.example.Fooне в змозі передатиcom.example.Foo оскільки це фактично два різних класи, завантажені двома різними завантажувачами класів. Після встановлення плагіна Eclipse він може зробити ваше завантаження Eclipse на консоль OSGi.

Для мене OSGi лише додав складності (тому що він додав ще одну ментальну модель для того, щоб я захоплювався), додав роздратування через винятки; Мені ніколи дуже не була потрібна динамічність, яку вона "пропонує". Це було настирливим, оскільки вимагало конфігурації пакета OSGi для всіх модулів; це було точно не просто (у більшому проекті).

Через мій поганий досвід я схильний триматися осторонь цього чудовиська, дуже дякую. Я вважаю за краще страждати від пекельної залежності, оскільки такий спосіб легше зрозумілий, ніж пекло OSGi, яке запроваджує.


5

Я ще не буду фанатом OSGi ...

Я працював із корпоративним додатком у компаніях Fortune 100. Нещодавно продукт, який ми використовуємо, "оновився" до реалізації OSGi.

запуск локальної розгорнутої системи ... [2/18/14 8: 47: 23: 727 EST] 00000347 CheckForOasis

остаточно розгорнуто, і "наступні пакети будуть припинені, а потім перезапущені" [2/18/14 9: 38: 33: 108 EST] 00000143 AriesApplicat I CWSAI0054I: як частина операції з оновлення програми

51 хвилина ... щоразу змінюється код ... Попередня версія (не для OSGi) розгортається менше ніж на 5 хвилин на старих розробниках.

на машині з 16 гіга-рам та 40 вільним диском гіга та процесором Intel i5-3437U 1,9 ГГц

"Користь" цього оновлення була продана як вдосконалення (виробництво) розгортання - діяльність, яку ми робимо приблизно 4 рази на рік, можливо, 2-4 невеликих розгортання виправлення на рік. Додаючи 45 хвилин на день до 15 людей (QA та розробники), я не можу уявити, що колись це виправдовується. У великих корпоративних програмах, якщо ваш додаток є основним додатком, то це правильно змінюється (невеликі зміни мають потенціал для далекосяжних наслідків - потрібно повідомляти і планувати споживачам по всьому підприємству), монументальна діяльність - неправильна архітектура OSGi. Якщо ваша програма не є корпоративним додатком - тобто кожен споживач може мати власний індивідуальний модуль, який, можливо, потрапить на власний силос даних у власній базі даних силос і працює на сервері, на якому розміщено багато програм, то, можливо, подивіться на OSGi. Принаймні,


4
OSGi не може змусити розгортання тривати від 5 до 51 хвилини, оскільки у нього практично немає накладних витрат. Це збільшення часу запуску повинно бути спричинене чимось іншим, або, серіалізацією ініціалізації, шляхом активації синхронно активаторів. Це не вина OSGi, оскільки в цілому люди отримують менший час запуску.
Пітер Кріенс

Цікава відповідь. Я просто читаю про OSGi зараз ... так, пізніше. Але я хвилююся щодо даних у корпоративному контексті. Подібне питання у мене з мікросервісами.
Білл Росмус

4

Якщо додаток на базі Java вимагає додавання або видалення модулів (розширення базової функціональності програми), не вимикаючи JVM, можна застосувати OSGI. Зазвичай, якщо вартість відключення JVM більше, просто для оновлення або для підвищення функціональності.

Приклади :

  1. Eclipse : надає платформу для плагінів для встановлення, видалення, оновлення та взаємозалежності.
  2. AEM : додаток WCM, де зміна функціональності буде керована бізнесом, яка не може дозволити собі скоротити час обслуговування.

Примітка : Весняна рамка перестала підтримувати весняні розшарування OSGI, вважаючи це зайвою складністю для додатків на основі транзакцій або для певного моменту в цих рядках. Я особисто не вважаю OSGI, якщо це абсолютно не потрібно, у чомусь великому, як, наприклад, створення платформи.


3

Я працював з OSGi майже 8 років або близько того, і я повинен сказати, що ви повинні розглянути питання про OSGi лише у тому випадку, якщо у вас є бізнес необхідність оновити, видалити, встановити або замінити компонент під час виконання. Це також означає, що ви повинні мати модульну думку та розуміти, що означає модульність. Є деякі аргументи, що OSGi легкий - так, це правда, але є й інші рамки, які легкі та простіші в обслуговуванні та розвитку. Те саме стосується забезпечення джава-бла-бла.

OSGi вимагає коректного використання міцної архітектури, і досить просто зробити OSGi-систему, яка могла б так само легко бути автономною банку, не залучаючи жодного OSGi.


2

OSGi надає наступні переваги:

■ Портативне та безпечне середовище виконання, засноване на Java

■ Система управління послугами, яка може використовуватися для реєстрації та обміну послугами між пакетами та від’єднанням постачальників послуг від споживачів послуг

■ Динамічна система модулів, яка може бути використана для динамічного встановлення та видалення модулів Java, які OSGi називає пакетами

■ Легке та масштабоване рішення


1

Він також використовується для забезпечення додаткової мобільності програмного забезпечення та додатків на мобільній стороні. Мобільна сторона доступна, наприклад, для WinMo, Symbian, Android. Як тільки відбудеться інтеграція з функціями пристрою, можна роздробитися.


1

Принаймні, OSGi змушує задуматися про модульність, повторне використання коду, версію та загалом про сантехніка проекту.


Це не змушує вас думати про це, це може просто вас збити з пантелику, це брехня, що вона вирішує всі проблеми (тільки ви можете їх вирішити), це просто приносить пекло залежності, коли ваш проект перевищує ~ 50 плагінів, і зазвичай вам потрібно зробити багато хитрощів для завантажувачів. Тож ваш код набагато брудніший, тому що вам потрібно зробити кілька злому осгі, і всі біси у вашій команді повинні зрозуміти ці хаки, щоб зрозуміти код. Цей вплив настільки великий, що впливає на вашу архітектуру таким чином, що ви дуже погано справляєтеся зі своїм кодом, це пекло.
Кшиштоф Чичоцький

1

Інші вже детально окреслили переваги, я пояснюю практичні випадки використання, які я бачив або використовував OSGi.

  1. В одному з наших додатків у нас потік на основі подій визначається в плагінах на базі платформи OSGi, тому завтра, якщо хтось клієнт хоче іншого / додаткового потоку, тоді йому просто потрібно розгорнути ще один плагін, налаштувати його з нашої консолі, і він виконаний .
  2. Він використовується для розгортання різних роз'ємів магазину, наприклад, припустимо, у нас вже є роз'єм Oracle DB, і завтра потрібно підключити mongodb, потім написати новий роз'єм і розгорнути його та налаштувати деталі через консоль, і знову ви закінчите. розгортання коннекторів обробляється платформою OSGi.

1

На його офіційному сайті вже є досить переконливе твердження, можу сказати

Основна причина настільки успішної технології OSGi полягає в тому, що вона забезпечує дуже зрілу компонентну систему, яка насправді працює в дивовижній кількості середовищ. Компонентна система OSGi фактично використовується для створення дуже складних додатків, таких як IDE (Eclipse), серверів прикладних програм (GlassFish, IBM Websphere, Oracle / BEA Weblogic, Jonas, JBoss), рамок прикладних програм (Spring, Guice), промислової автоматизації, житлових шлюзів, телефони та багато іншого.

Що стосується переваг для розробника?

РОЗВИТКИ: OSGi знижує складність, надаючи модульну архітектуру для широкомасштабних сьогодні розподілених систем, а також для невеликих вбудованих додатків. Будівництво систем із внутрішніх та нестандартних модулів значно зменшує складність, а отже, витрати на розробку та обслуговування. Модель програмування OSGi реалізує обіцянки компонентних систем.

Будь ласка, перевірте деталі в Переваги використання OSGi .

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.