فهم مفاهيم OSGi. حاول اتباع نهج اللغز

نشرت: 2013-04-20

أصبحت OSGi شائعة جدًا اليوم ، بفضل نهجها المعياري وقدرتها على فرض الحدود المنطقية بين الوحدات. عندما نكتشفها في المرة الأولى ، فإن السؤال هو من أين نبدأ في فهم كيفية عملها؟

لفهم مفاهيم OSGi ، سنحاول اتباع نهج اللغز ، والفكرة هي البدء بالجزء التافه من هذه التقنية ، والبحث عن الأجزاء الأخرى المتعلقة بالأجزاء الموجودة. ولتجميع اللغز ، سوف يساعدنا JArchitect في اكتشاف تصميم OSGi الداخلي.

لكي نكون أكثر واقعية ، نحلل مع JArchitect تطبيقًا يستخدم تقنية OSGi ، يتعلق الأمر بـ Eclipse IDE الشهير الذي يستخدم اعتدال حاوية OSGi.

لنبدأ بتعريف OSGi النموذجي:

يقلل OSGi من التعقيد من خلال توفير بنية معيارية للأنظمة الموزعة واسعة النطاق اليوم بالإضافة إلى التطبيقات الصغيرة المضمنة. أنظمة البناء من الوحدات الداخلية وغير الجاهزة تقلل بشكل كبير من التعقيد وبالتالي تكاليف التطوير والصيانة. نموذج برمجة OSGi يحقق وعود الأنظمة القائمة على المكونات.

الجزء التافه من OSGi هو النمطية ، دعنا نكتشف ما هي وحدات OSGi؟

تسمى وحدات OSGI الحزم وبالتالي يتكون كل تطبيق من حزمة واحدة على الأقل.
يتم تنفيذ هذه الحزم داخل حاوية ، وبما أن كل نهج معياري حيث تدير حاوية الوحدات النمطية ، فإن السؤال هو ما هو العقد الذي يجب أن ينفذ كل وحدة ليتم دمجها في الحاوية؟

لنأخذ كمثال الحزمة org.eclipse.equinox.jsp.jasper ونبحث عن جميع الواجهات المنفذة ، لذلك يمكننا تنفيذ طلب CQLinq التالي:

كسوف 4

تم تنفيذ واجهة BundleActivator من حزمة OSGi ، وتحتوي هذه الواجهة على طريقتين من البداية والتوقف مفيدة لتخصيص بدء وإيقاف الحزمة.

خصوصية أخرى للحزمة هي ملف البيان الخاص بها ، وهذا جزء من ملف البيان org.eclipse.equinox.jsp.jasper:

كما يمكننا أن نلاحظ أن هذا البيان يحتوي على بعض المعلومات الوصفية التي تحتاجها الحاوية ، مثل تحديد فئة منشط الحزمة التي تنفذ واجهة BundleActivator.

تمثل الحزمة الجزء الأول من اللغز ، وهنا تمثيل مبسط للحزمة:

كسوف 7

ولمجرد الحصول على فكرة عن جميع الحزم التي يستخدمها الكسوف ، فلنبحث عن جميع الفئات التي تطبق واجهة BundleActivator.

كسوف 2

من يدير الحزمة ويستدعي طرق BundleActivator؟

لاكتشاف ذلك ، دعونا نبحث عن طرق تستدعي بشكل مباشر أو غير مباشر BundleActivator.start

كسوف 6

يتم تنشيط الحزمة بواسطة إطار عمل OSGi عند إطلاقها. يتم بدء فئة إطار العمل بواسطة حاوية الاعتدال. ولفهم ما يحدث عند بدء تشغيل الحاوية بشكل أفضل ، إليك بعض الإجراءات التي يتم تنفيذها عند بدء تشغيل الحاوية:

كسوف 31

عندما يتم تشغيل الحاوية ، تقوم بتهيئة إطار عمل OSGi ، ويحصل إطار العمل على جميع الحزم المثبتة ، ولكل منها يتم إنشاء مثيل من فئة BundleHost ، وتخزين الحزمة الموجودة في المستودع.

تقوم فئة BundleHost بتطبيق واجهة الحزمة ، والتي تحتوي على طرق مثل البدء والإيقاف وإلغاء التثبيت والتحديث ، وهذه الطرق ضرورية لإدارة دورة حياة الحزمة.

إذن قطعة اللغز الثانية هي حاوية OSGi ، تم إطلاقها بواسطة Equinoxlauncher ، والتي تهيئ إطار العمل. فئة الإطار هي المسؤولة عن تحميل الحزم وتنشيطها.

بعد اكتشاف بعض المفاهيم الأساسية حول الحزمة والحاوية ، دعنا نتعمق في الحزم ونكتشف كيف تعمل داخليًا.

لنأخذ كمثال حزمة org.eclipse.equinox.http.servlet ونبحث عن الطرق التي تستدعيها طريقة البدء لفئة Activator الخاصة بها.

كسوف 1

تنشئ هذه الحزمة خدمة وتقوم بتسجيلها في الحاوية. يتم تعريف الخدمة في OSGi بواسطة فئة أو واجهة Java قياسية. عادةً ما يتم استخدام واجهة Java لتحديد واجهة الخدمة. الخدمة هي الطريقة المفضلة التي يجب أن تستخدمها الحزم للتواصل فيما بينها.

فيما يلي بعض السيناريوهات المفيدة لاستخدام الخدمات:

  • وظائف التصدير من حزمة إلى حزم أخرى.
  • وظائف الاستيراد من الحزم الأخرى.
  • تسجيل المستمعين للأحداث من الحزم الأخرى.

ملاحظة أخرى من الرسم البياني السابق للتبعية هي أنه يتم استخدام مصنع الخدمة لإنشاء مثيل الخدمة.

الجزء الثالث من اللغز لدينا هو طبقة خدمات OSGi ، يمكن لكل حزمة استخدام أو الإعلان عن بعض الخدمات ، ما يفرض نهج تصميم المكون ، وهنا التمثيل الجديد لحزمة OSGi.

كسوف 8

إذا كانت الحزمة تستخدم خدمات للتواصل مع الحزم الأخرى ، فكيف تتواصل مع الجرار الأخرى؟

إذا قمنا بتطوير حزمة وحاولنا استخدام فئة من جرة أخرى ، فيمكننا أن نندهش من أنها لن تعمل كما هو متوقع ، والسبب هو أن ClassLoader مرتبط بحاوية OSGi ، للتحقق من ذلك دعونا نبحث عن الطريقة التي تستدعي java. lang.Thread.setContextClassLoader.

الكسوف 9

تستدعيه العديد من الطرق بما في ذلك EquinoxLauncher. لذلك في كل مرة تحاول الحزمة إنشاء مثيل فئة ، ستتحقق حاوية OSGi مما إذا كان مسموحًا للشفرة بتنفيذ هذا الإجراء أم لا ، وهنا يأتي دور الحزمة المستوردة والمصدرة في ملف البيان.

تعلن الحزمة صراحةً عن الحزمة المصدرة والمستوردة ، وللتحقق من ذلك ، دعنا نبحث عن الحزم التي تستخدمها حزمة org.eclipse.equinox.http.servlet ونتحقق مما إذا كانت تستخدم الحزمة المستوردة فقط.

كسوف 10

كما يمكننا أن نلاحظ أن جميع الحزم المستخدمة محددة في ملف البيان ، في قسم حزمة الاستيراد.
ومع ذلك ، تمثل الحزمة المصدرة الحزمة التي يمكن استخدامها من الحزم الأخرى. يتم تمثيله بواجهة ExportedPackage ، ويمكننا البحث عن فئات الحاوية باستخدام هذه الواجهة.

كسوف 12

ما يثير الاهتمام بهذه الإمكانية الجديدة ، هو أن الحزمة سيكون لها حدود محددة جيدًا ، وما تستخدمه وما تعرضه كخدمات محدد جيدًا للغاية.

يمكننا فرض التحقق من استخدام الحزم المستوردة باستخدام أدوات أخرى ، على سبيل المثال مع CQLinq يمكننا كتابة بعض القواعد التحذيرية في كل مرة يستخدم فيها المشروع حزمًا أخرى غير الحزم المحددة ، ولكن من الأفضل أن يكون هذا التحقق في بيئة التنفيذ ، لذلك المطور لا يمكن كسر هذه القواعد.

تتم إدارة هذه القدرة على معالجة الحزم المستوردة والمصدرة من خلال طبقة وحدات OSGi وكانت هذه هي القطعة الرابعة من اللغز.

دعنا نعود إلى حاوية OSGi ونكتشف الخدمات التي تقدمها؟

خدمات الحاويات

كما اكتشفنا قبل إطلاق الحاوية بواسطة فئة EquinoxLauncher ، تقوم فئة إطار العمل بتهيئة الحزم وتشغيلها ، لاكتشاف الخدمات المقدمة ، فلنبحث عن جميع الفئات المستخدمة في طريقة تهيئة إطار العمل.

كسوف 11

تم اكتشاف بعض الفئات بالفعل من قبل مثل BundleRepository و BundleHost و PackageAdminImpl و ServiceRegistry.

ماذا عن الفصول الأخرى:

  • StartLevelManager:
    ترتبط كل حزمة OSGi بمستوى بدء يمكّن الخادم من التحكم في ترتيب بدء وإيقاف الحزم النسبي. فقط الحزم التي تحتوي على مستوى بدء أقل أو يساوي مستوى البدء النشط لإطار عمل الخادم يجب أن تكون نشطة. عادةً ما تبدأ الحزمة ذات مستوى البدء الأصغر في وقت مبكر.
  • الأمن
    تتعامل طبقة الأمان مع جوانب الأمان من خلال تقييد وظائف الحزمة على الإمكانات المحددة مسبقًا.
  • مدير الحدث:
    توفر خدمة مسؤول الأحداث نموذج اشتراك للنشر للتعامل مع الأحداث. يتم تحقيق ذلك وفقًا لمواصفات خدمة مسؤول أحداث OSGi. ترسل خدمة مسؤول الأحداث الأحداث بين ناشري الأحداث والمشتركين في الأحداث (معالجات الأحداث) من خلال التداخل مع قناة الحدث. ينشر الناشرون الأحداث على القناة وتحدد قناة الحدث المعالجات التي يجب إخطارها. وبالتالي ، لا يمتلك الناشرون والمعاملون معرفة مباشرة ببعضهم البعض ، مما يبسط إدارة الأحداث.

الصورة الكاملة OSGi

دعنا نجمع كل قطع الألغاز الموضحة من قبل ، وسيكون لدينا صورة OSGi التالية:
طبقات- osgi

هذه الهندسة لها الفوائد المثيرة للاهتمام التالية:

  • بسيط.
  • تعقيد أقل.
  • سهولة النشر.
  • يؤمن.

ما يجعلها جذابة للغاية وتستحق الالتفاف ، ولن تضيع وقتك إذا درستها بعمق.