Spring Dynamic Module (springDM)
Download
Report
Transcript Spring Dynamic Module (springDM)
OSGi
and
Spring Dynamic Module
وحید شیخعلی زاده
فرشاد زینالی
استاد راهنما:مهندس امیرسام بهادر
بهار۹۲
SpringDm
SpringDmیک فریم ورک جدید است که در واقع استفاده از مدل برنامه نویسی قدرتمن ِد
Springدر بستر فریم ورک OSGiمیباشد.
همانطور که از تعریف هم بر میاید برای شناخت هرچه بهتره این فریم ورک ابتدا نیاز است بدانیم
OSGiچیست.
به همین منظور در ادامه با فریم ورک OSGiآشنا میشویم و علل ظهور این فریم ورک را برسی
میکنیم.
OSGi
فریم ورک OSGiتوسط شرکت OSGi Allianceپایه گذاری شد تا بتواند عالوه بر پشتیبانی از
مدل برنامه نویسی سرویس گرا (، )SOPقابلیت برنامه نویسی ماژوله را به زبان جاوا اضافه کند.
علی رغم موفقیت چشم گی ِر زبان برنامه نویسی جاوا ،از برنامه برای تلفنهای همراه گرفته تا
سازمانهای بسیار بزرگ،این زبان به صورت خاص از مدل برنامه نویسی ماژوله پشتیبانی نمیکند.
OSGiپلتفرم استانداردی است که ارائه شده است تا بتواند این خ ٔ
ال را در زبان برنامه نویسی جاوا
پوشش دهد.
Java limitation
جاوا نوع محدودی از modularityرا پشتیبانی میکند که همان object-orientedاست که
این مدل ایرادهای زیر را دارد:
کنترل دسترسی( :)code visibilityاگرچه جاوا قابلیت دسترسی را برای ما فراهم
.۱محدودیت در
ِ
میکند( )public,private,protectedاما این قابلیت تنها capsulationسطح پایین OOرا
پاسخگو است.
.۲مشکل دیگر مفهومی به نام classloaderمیباشد:برنامهها به یک سری libraryنیاز دارند
ورژن آنها نمیکند.در این شرایط
ولی classloaderتوجهی به ویژگیهای این الیبرریها از جمله
ِ
ورژن درست JVM،دیگر پیغام خطا به ما ندهد.
راه حل آزمون و خطا میباشد که تا با انتخاب
ِ
OSGi Solution
OSGiمیتواند در موارد زیر این مشکالت را حل کند:
:Class Not Found Exception.۱
OSGiاین اطمینان را به شما میدهد که تا زمانی که وابستگی کدها برطرف نشده برنامه اجرا نشود.
:Execution-Time Error.۲
ورژن اشتباه libraryدر classpath
دلیل
به ِ
ِ
.۳قابلیت اعمال تغییرات در برنامه به صورت Dynamic
.۴امکان توسعه برنامه به صورت موازی
.۵استفاده مجدد از کدهای نوشته شده()reusability
Real-time developement.۶
Container
: معروف وجود داردcontainer ۳,OSGi برای پیاده سازی برنامههای مبتنی بر
equinox(Eclipse).۱
Apache Felix.۲
Knopflerfish .۳
Bundle
-واحد سازند در :OSGi
واحد سازند در bundle , OSGiمیباشد bundle .در واقع همان jarفایلهای ما هستند که
عالوه بر محتویات jarفایل استاندارد دارای پوش ٔه META-INFمیباشند که محتویات این پوشه فایل
MANIFEST.MFاست و اطالعات مربوط به آن jarفایل را دارا میباشد.
Bundle
: اجزای سازنده
.class
Resources
MANIFEST.MF
Overview
OSGi Layers
OSGiو معماری الیه ی:
OSGiاز ۳الیه مفهومی تشکیل شده است و هر کدام از این الیهها قابلیتی را به برنام ٔه ما اضافه
میکنند.
نکته:مانند سایر مدلهای الیه الیه اینجا نیز
هر الیه به الیه زیرین خود وابسته است.
Module
:Moduleوظیفه ی بستهبندی ( )packagingو همچنین به اشتراک گذاری کدها مربوط به این
الیه میباشد()code visibility
MANIFEST.MF
: دسته تقسیم میشود۳ بهmanifest.mf اطالعات فایل
.human-readable information.1
.bundle identification.2
.code visibility.3
Import and Export
چه packageهایی دیده شوند؟
چه packageهایی مورد نیاز است؟
پاسخ بهینه به این ۲سال
Lifecycle
را در زمانbundle میباشد و مدیریتbundle این الیه در واقع همان چرخه حیاط:Lifecycle
)internal to application( اجرا بر عهد دارد
uninstall وupdate، stop ،start،OSGi درbundle وعملیات شامل نصب
.)external to application( آن
Lifecycle
Lifecycle
bundle :installدرون container OSGiبا استفاده از دستور
> Install file :< directoryنصب میشود و یک Idواحد به آن اختصاص داده میشود.
:Resolveپس از نصب ، bundleهنگامی که هم ٔه وابستگیهای آن رفع شد باندل به صورت
خودکار در وضعیت resolveقرار میگیرد.
:startپس از اینکه وابستگیهای bundleبرطرف شد میتوان آن را با دستور >start <id
راهاندازی کرد.
bundle :Activeشروع به کار کرده و هم اکنون در حال اجرا است.
:Stopدستوری است که صادر میشود و باندل مورد نظر را متوقف میکنیم.
Lifecycle API
:را تشکیل میدهندlifecycle که در واقع روح اصلی الیهinterface ۳-
:BundleActivator.۱
در واقع.تعامل کردosgi framework میتوان باinterface کردن اینimplement با
۱ فریم ورک، این اینترفیس فراخوانی میشودstart() نصب شده و متدbundle وقتی
instance روی یکstop () وstart() در واقع متدهای.از این کالس میسازدinstance
.یکسان از آن کالس اجرا میشوند
public void start(BundleContext context) throws Exception;
public void stop(BundleContext context) throws Exception;
Lifecycle API
:BundleContext.۲
: دست تقسیم میشوند۲ بهinterface متدهای این
)lifecycle management(هاbundle مدیریت چرخه حیاط.۱
.تعامل با سرویس ها.۲
از طریق این اینترفیس میتوان به.استbundle جاریobject ,BundleContext در واقع
.سرویس رجیستری دسترسی پیدا کرد
void
void
void
void
addBundleListener(BundleListener listener);
removeBundleListener(BundleListener listener);
addFrameworkListener(FrameworkListener listener);
removeFrameworkListener(FrameworkListener listener);
Lifecycle API
:Bundle.۳
ایجاد میکند تا از لحاظbundle Object یکframework نصب شدهbundle برای هر
bundle را بر اساسbundle هرframework در واقع. را بیان کندbundle آنlogical
.ایجاد شده میشناسدObject
در زمان اجراOSGi نکته جالب این است که
long getBundleId();
Dictionary getHeaders();
. استbundle خود به صورت
Dictionary getHeaders(String locale);
(system bundle)
String getLocation();
int getState();
String getSymbolicName();
services
کاری که برای دیگری انجام میشود.
وظیفه این الیه تامل و ارتباط میان bundleها است،اینگونه که Aسرویس Xرا رجیستر میکند و B
سرویس Xرا مصرف میکند
با استفاده از مدل برنامه نویسی بر پای ٔه interfaceها،وابستگی میان سرویس دهنده و سرویس
گیرنده از بین میرود
services
مزایای برنامه نویسی سرویس گرا :
.۱وابستگی کمتر قطعه کد ها
.۲برنامه نویسی با interfaceها.
metadata.۳اضافه)(Filter
.۴چند پیاده سازی
Whiteboard Pattern
Listening for Services
osgiاز یک ListenerAPIبرای مدیریت Eventها استفاده میکند.
۳مدل Eventداریم:
:registered.۱سرویس رجیستر شده و میتوان از آن استفاده کرد
: modified.۲سرویس metaDataتغییر کرده است.
:unregistering.۳سرویس در حال unregisterشدن است.
Details
. کندimplement راinterface serviceListener بایدlistener هر کالس
نکت ٔه جالب در این باره این است که بر اساس.میتواند چند پیاده سازی داشته باشدinterface هر
چنین قابلیتی در فریم. انجام دادfiltering بدست آماده میتوان روی پیاده سازیها عملmetaData
!ورک های وجود ندارد و صرفا از روی پیاده سازی می توان فیلتر کرد نه عملکرد
ServiceRegistration registration =
bundleContext.registerService(serviceName, new IMP(),
metadata);
Dictionary metadata =new Properties();
Metadata. setProperties(key,value);
Enterprise OSGi
مزایایی که E-OSGiمیتواند به web applicationبیاورد:
الی ٔه moduleساختار بندی physicalو logicalبهتری برای web appها میاورد.
الی ٔه lifecycleاین قابلیت را ایجاد میکند که بتوان مدیریت دینامیک روی web appداشته
باشیم.
الی ٔه serviceوابستگی کمتر بین بخشهای مختلف و امکان استفاده آنها در سایر پروژه ها فراهم
میکند.
WAB
war فایلی است که از metadata osgiپشتیبانی میکند و به الی ٔه lifecycleفریم
ورک osgiبرای دسترسی به منابعش نیازمند است.
Apache Aries
یکی از Application Serverهایی است که از EOپشتیبانی میکند و هم یک web server
است و هم یک servlet containerو این قابلیت را دارد که به سادگی با سایر فریم ورکها آمیخته
شود)...،Clustering،JNDI،JMX،osgi،websocket( .
روند کار اینگونه است که WebContainerدرون پوش ٔه WEB-INF/web.xmlرا میگردد تا
ببیند چه سرولتهایی توسط باندل فراهم شده و OSGiContainerدرون پوش ٔه META-
INF/MANIFEST.MFبه دنبال اطالعات مربوط به خود باندل میگردد.
classloader
Apache Aries
معرفی Spring dynamic module
Spring DMترکیبی از Springو OSGIاست
Spring DMمدل برنامه نویسی Springدر برنامه های تحت OSGIمی باشد
Spring DMیک راه حل بر مبنای ماژول بندی کردن برنامه پیشنهاد می دهد که به وسیله آن می توانیم از تمام ویژگی
های OSGIدر قالب Springاستفاده کنیم .
در واقع هدف اصلی Spring DMاین است که OSGIو Springبتوانند به ساده ترین شکل با هم در تعامل باشند تا به
این شکل بتوانند ضعف های همدیگر را پوشش دهند.
Spring DMدارای یک extenderمی باشد که وظیفه ی extenderاین است که با بررسی شرایط OSGI
Bundleها به آنها به صورت اختصاصی یک Spring application contextبدهد که با این کار OSGI
Bundleها به Spring powered bundleتغییر نوع می هند ( در این رابطه به صورت مفصل تر در قسمت
های آتی صحبت خواهد شد )
چرا Spring dynamic module
با تمام فواید و مزایایی که Spring Frameworkبه همراه دارد از جمله IOCو AOPبودن ،اما
Springمشکالتی هم دارد از جمله :
زمانی بر روی پروژه های بزرگ و پیچیده کار می کنیم به تعداد خیلی زیادی Beanنیاز داریم که
configو مدیریت کردن آنها بسیار مشکل است.
Springتوانایی moduleبندی کردن برنامه را ندارد .برای مثال هیچ روشی برای اینکه
Bean ، Visiilityها را کنترل کرد وجود ندارد و هر Beanتوانایی مشاهده ی سایر beanها را
دارد .حتی اگر به صورت مستقیم هم از beanها استفاده نکنیم با استفاده از Spring
application contextمی توانیم به دنبال beanمورد نظر باشیم.
ادامه
configureکردن مجدد dependency graphبرای وابستگی های اعمال شده
(: )dependency injectionمشکل سوم به وابستگی هایی که بین beanها وجود دارد بر
می گردد برای مثال :فرض کنید bean Aاز bean Bاستفاده می کند در این صورت Aبه B
وابستگی پیدا می کند .حال زمانی را فرض کنید که برنامه ما دارای چند صد beanباشد و بین آنها
وابستگی وجود داشته باشد که در dependency graphمشخص شده باشد ،حال اگر برنامه
در حال اجرا باشد و ما بین beanها وابستگی های جدیدی به وجود آوریم ،این وابستگی ها تا زمانی
که تمام برنامه یک بار restartنشود اعمال نخواهد شد و دلیل آن این است که مشخص شدن وابستگی
بین beanها فقط یکبار صورت می گیرد و آن هم در زمان start upشدن spring
containerاست و امکان updateوابستگی ها در حین اجرا وجود ندارد .و مدیریت
dependencyها تماما به وسیله ی Springانجام می شود و developerنمی تواند مدیریت
را خود کنترل نمایید .
ادامه
در این حال OSGIهم دارای کمبود هایی بود ،از جمله :
دارای قابلیت IOCو AOPنمی باشد
به خاطر همین کمبود ها تکنولوژی جدیدی به نام Spring DMبه وجود آمد
با استفاده از spring dmشما می توانید از تمام ویژگی ها و قدرت فریم ورک springدر برنامه های
تحت استفاده ی osgiبهره ببرید.
Spring dm توانایی این را دارد که تمام bundleها را شناسایی کند و به صورت کامال مدیریت شده
برای هر کدام از آنها یک spring application contextاختصاصی ایجاد کند
ادامه
spring dmیک نوع خاصی از bundleها را معرفی می کند به نام Spring powered bundles:
:Spring powered bundleاین نوع از bundleها توانایی این را دارند که به صورت اتوماتیک یک spring
application contextاختصاصی داشته باشند که تماما توسط spring dmمدیریت می شوند و می توانند از تمام
ویژگی های springاستفاده کنند
Spring powered bundleها همانند osgi bundleها می توانند packageهای مورد نیاز خود را
importو exportکنند
Spring powered bundleها از spring containerو توانایی های spring dmاستفاده می کند تا با
osgi containerدر ارتباط باشند ،و این تعامل می تواند به دو روش باشد annotation )2 xml base )1 :
base
ادامه
در مبحث osgiبا استفاده از یک ،Bundle Activatorباندل خود را تعریف ،مقدار دهی اولیه و
serviceثبت کرده و یا از serviceها استفاده کنیم.
Spring powered bundleدرون خود شامل یک instanceاز spring containerمی
باشد ،که با استفاده از این containerمی توانیم از ویژگی های IOCو AOPاستفاده کنیم و
دیگر نیازی به Bundle Activatorنمی باشد زیرا spring containerبه صورت اتوماتیک
توسط spring dmفراخوانی می شود.
Spring DM’s extender
mechanisms
Spring DM یک extender bundleبه وجود می آورد که وظیفه آن گوش دادن به bundleهایی
است که می خواهند بر روی osgi containerنصب شوند ،اگر این bundleها دارای شرایط الزم
بودند extender ،آنها را به spring powered bundleتبدیل می کند .و برای هر کدام به
صورت اختصاصی یک spring application contextایجاد می کند.
سوال spring extender :چگونه تصمیم می گیرد که کدام bundleباید به spring powered
bundleتبدیل شود ؟ برای اینکه یک bundleبتواند به spring powered bundleتبدیل شود
باید شامل 2ویژگی باشد :
(1
باید دارای دایرکتوری META-INF/springباشد که داخل دایرکتوری springباید یک فایل xmlبرای
configureکردن springداشته باشد
(2
در داخل فایل MANIFEST.MFواقع در دایرکتوری META-INFدارای یک headerبه نام
Spring-Contextباشد ،که در واقع مقدار این headerمشخص کننده محل فایلی است که spring
را configureخواهد کرد
Kinds of supported bundles
2 Spring DMنوع bundleرا ساپورت می کند :
(1
standard Spring-powered bundles
(2
web bundles
در اسالیدهای قبلی ما با یک نوع از spring extender bundleآشنا شدیم که در واقع تنها برای
standard Spring-powered bundlesمورد استفاده قرار می گیرد ،اما نوع دیگری از
extenderها وجود دارند که از آنها برای web bundleها استفاده می شوند که اصطالحا به آنها
می گویند ، web extenderکه از web extenderبرای پیاده سازی bundleها در سمت
web applicationها استفاده می شود.
Kinds of supported bundles
2 Spring DMنوع bundleرا ساپورت می کند :
(1
standard Spring-powered bundles
(2
web bundles
در اسالیدهای قبلی ما با یک نوع از spring extender bundleآشنا شدیم که در واقع تنها برای
standard Spring-powered bundlesمورد استفاده قرار می گیرد ،اما نوع دیگری از
extenderها وجود دارند که از آنها برای web bundleها استفاده می شوند که اصطالحا به آنها
می گویند ، web extenderکه از web extenderبرای پیاده سازی bundleها در سمت
web applicationها استفاده می شود.
Equinox container for web
را ساپورتOSGI ها بر روی محیطweb application پیاده سازی، به بعدversion 1.1 ازSpring DM
.می کند
ها تا حدودی متفاوت است و نیازمند یکdesktop application ها نسبت بهweb application پیاده سازی
. می باشدweb container
web container وosgi container مشابه پلی عمل می کند میانspring dm در واقع
ها راweb bundle استفاده می کند تا به وسیله ی آنweb extender ازspring dm ، web در سمت
شناسایی و نصب کند
: ساپورت می کندweb container ، 2 ازweb در سمتSpring DM
Tomcat is the default container in Spring DM
به بعد5.5 از ورژنApache Tomcat
(1
Jetty
(2
Packaging a web bundle
(1
(2
در سمت web applicationها برای استفاده از web bundleبر روی web containerنیازمند 2مرحله
هستیم :
Deployکردن web bundleبر روی osgi containerهمانند یک bundleمعمولی
واسط قرار گرفتن spring dm web extenderبرای توانایی برقراری ارتباط بین osgi containerو
web container
برای اینکه spring dm web extenderبتواند bundleرا بر روی deploy ، web containerکند ،
bundleمورد نظر باید دارای 2ویژگی باشد :
(1
پسوند فایل .warباشد
(2
فایل شامل دایرکتوری WEB-INFباشد
که در این مقاله bundleهای ما دارای شرط دوم می باشند
Spring DM standard extender
mechanisms
یکی از وظایف اصلی Spring dm standard extenderگوش دادن به bundleهایی است
که می خواهند بر روی osgi containerقرار بگیرند تا در صورت داشتن شرایط الزم
extenderآنها را به powered bundleتبدیل کند
Extenderعالوه بر bundleهایی که می خواهند بر روی containerنصب شوند به spring
powered bundleهایی که بر روی osgi containerنصب هستند و یا حتی در حالت
activeنیز می باشند گوش می دهد و شرایط آنها را مرتبا بررسی می کند
از دیدگاه osgi containerهیچ تفاوتی میان osgi bundleو standard powered
bundleوجود ندارد زیرا هر دو از packageهای یکسانی استفاده می کنند و هر دو jarفایل
هایی هستند که دارای دایرکتوری META-INF/MANIFEST.MFمی باشند .
ادامه
: چیز است2 داشتنpowered bundle از ویژگی های
استxml که شامل یک فایلMETA-INF/spring
(1
Spring-Context manifest header
(2
بود از آنxml را چک می کند اگر شامل فایلMETA-INF/spring ابتداSpring extender
configure مربوط بهxml اما اگر فایل، استفاده می کندspring کردنconfigure فایل برای
. خواهد دادexception از آن نمی تواند استفاده بکند وextender نباشدspring کردن
استSpring-Context manifest header اولویت با
HOW SPRING DM CREATES
APPLICATION CONTEXTS
Spring powered bundleهیچگونه نگرانی در رابطه با createو یا destroyکردن
spring application contextندارد و این کار جزو وظایف spring extenderمی باشد
Spring dm extenderجزو اولین bundleهایی است که به حالت activeمی رود ،به این
دلیل که باید در حالت activeباشد تا بتواند سایر bundleها را شناسایی کند و به آنها spring
application contextاختصاص دهد
Spring dm extenderتوانایی این را دارد که bundleهایی که قبل خودش در container
نصب شده اند را شناسایی کند و به آنها در صورت لزوم spring application context
اختصاص دهد
ادامه
Usually, Spring-powered bundles are deployed after the Spring extender.
هایی اختصاص دهد کهbundle را بهspring application context تالش می کند تاSpring extender
هستندactive در حالت
: پس روال کار به این ترتیب است
active در حالتSpring extender
(1
active در حالتOsgi bundle
(2
bundle بهspring application context اختصاص
(3
انجام می شوندTread base تمام مراحل باال