A történelem modularitás nyelvén java
Tegyük fel, hogy van egy egyre növekvő alkalmazása Java egy meglehetősen érdekes funkciókat. De, sajnos, az idő múlásával egyre nehezebb lesz, hogy új adatokat, a program kezdetét, hogy eresztheti váratlan helyeken. Elég talán, a probléma abban rejlik, hogy nincs modularitás alkalmazásokat. De ne verni magad - akkor nem lehet hibáztatni. Csak hagyományos Java hírhedt csak gyengén szervezett modularitás. De ez nem kell.
Növekvő modularitás, lehetséges, hogy hozzon létre egy skálázható rendszer, kényelmesebb támogatásában és elrendezése. Ha van egy jól meghatározott határ a modulok között, akkor minden rendben van. Bármilyen funkció külön tesztelhető a másik, szinten kód és a munka a csapat nagy, az elv az „oszd meg és uralkodj”. A fejlődés egyre gyorsul, és ilyen nagy sebességű tartjuk nemcsak az első évben a rendszer, hanem annak teljes életciklusa során.
Mi igaz a modularitás? Vannak tárgyak vagy csomagok modul? És ez lehet JAR-fájlokat?
A szerkezetet a programot
Hogyan épít egy valóban moduláris rendszer? A konkrét döntés lesz szó, de most nézzük egyértelműen meghatározzák a probléma előttünk. A modularitás fontos sok absztrakciós szintet. A rendszer felépítése van elhelyezve elve «SOA» (Service Oriented Architecture). Egy jól megtervezett szolgáltatás-orientált architektúra olyan világos és verzióval nyilvános interfész (alapvetően beszélünk web szolgáltatások) közötti lazán csatolt rendszerek, amelyek elrejtik a belső részleteket. Ezek az alrendszerek is jól működik alapján egy teljesen önálló technológia stack, így könnyen ki lehet cserélni anélkül, hogy ez befolyásolná a többi minden egyes alrendszerre.
Azonban, ha létrehoz egyes szolgáltatások vagy alrendszerek Java gyakran nem tud megszabadulni a monolitikus megközelítés. Sajnos, egy tipikus példája ennek a futási környezet Java nyelv, rt.jar. Természetesen, ha össze tudja törni a monolitikus alkalmazás három kötelező szintet, de ez csak egy szánalmas látszatát igaz modularitás. Csak kérdezd meg magadtól: mit kell tennie, hogy távolítsa el az alkalmazást a alapréteg és helyette egy teljesen más szintű végrehajtás? Nagyon gyakran, mint a csere tükröződik a kérelmet. Most gondolkodni, hogyan kell ezt csinálni anélkül, hogy károsítaná a többi alkalmazás, amikor forró csere közvetlenül a futás során. Lehetséges, hogy a SOA-alkalmazások, miért nem működik ez a képesség a mi alkalmazások?
igaz modularitás
Szóval, mi az a „valódi modularitás”, amely már kissé kitér az előző részben? Fogalmazok néhány meghatározó jellemzői a teljes körű modul:
- Modul - egy független telepítési egységéből (lehetővé téve újrahasználat bármilyen összefüggésben);
- modul egy stabil specifikus azonosítási jellemzői (például név és verzió);
- modul előír bizonyos követelményeket (például, függőségek);
- Egy modul használható a többiek, de a belső részek a készülék rejtve marad számukra.
Ideális esetben ezek a modulok léteznie kell egy könnyű futtató környezetet, amely egyesíti a követelményeket és lehetőségeket a modulok, az épület a lehető legnagyobb mértékben az elrendezés illik hozzánk. Röviden, mi elérni modularitás alkalmazásokat, hogy felépüljön a szolgáltatás-orientált architektúra minden előnyével, de azok végrehajtásához sokkal kisebb mértékű. És nem csak a táblán markerek, de írásakor kódot, és a működését a kérelmet. Sőt, modulok készítmény ne legyen statikus: mi szükség van egy rugalmas és bővíthető alkalmazások, amelyek nem maradsz, a kereslet és a teljes átcsoportosítani.
Tárgyak: ez az igazi-inek?
Térjünk át a legalacsonyabb szintű szerkezeti absztrakciók nyelvén Java: osztályok és objektumok. Van objektumorientáltság nem ad egyértelmű azonosítása, információ elrejtés, és laza csatolás - révén interfészek? Igen, bizonyos mértékig. De a személyazonosságát a tárgyak ebben az esetben az efemer, nem verzióval interfészek. Kétségtelen, hogy a Java osztályok nem az úgynevezett „független egység kiépítését.” A gyakorlatban osztályok általában túl zsúfolt „ismerkedés” egymással. «Public» (állami) azt jelenti, „hogy szinte minden osztály” az út (osztályútvonal) feltüntetett JVM. Ez a fajta nyitottság kívánatos gyakorlatilag bármilyen szervezet, kivéve a valóban nyilvános interfész. Tovább ront a helyzeten, a használata módosítók Java láthatóság az előadás során nem feltétlenül szükséges (például a reflexió).
Újrafelhasználás osztályok kívül az eredeti helyzet nehéz, ha senki nem kényszeríti, hogy járulékos költségek implicit külső függőségek. Ez az, amit hallok a fejedben most söpörni a „függőség Injection” és a „Inversion of Control”. Igen, ezek az elvek segítenek abban, hogy osztályok függvényében kifejezett. De, sajnos, az archetipikus végrehajtás Java még mindig kénytelen alkalmazásokat hozzanak létre, melyek hasonlítanak a hatalmas darabok tárgyak statikusan kötött futásidőben és kialakítson egy csúnya design. Azt javasoljuk, olvassa a könyvet «Java Application Architecture: modularitás Patterns», ha igazán meg akarjuk érteni a mintákat a moduláris felépítés. De azt is tudjuk, hogy az alkalmazás ezeket a mintákat a Java, anélkül, hogy megfeleljenek a modularitás futásidőben csak komolyan megnehezíthetik a munkát.
Csomagok lehet, hogy ezek valódi modulok?
Mi van, ha igaz a Java modulok kell keresni valahol félúton a kérelmet, és a tárgyak? Például nem teljes értékű csomagokat, modulok? Kombinált csomag neve, import nyilatkozatok és láthatóságának módosítók (például nyilvános / védett / magán) azt az illúziót kelti, hogy a csomag legalább néhány jellemzőjét a modulokat. Sajnos, a csomagokat tisztán kozmetikai tervez, csak teret adnak az osztály nevét. Még a látszólag egyértelmű hierarchiát illuzórikus.
JAR-fájlok: ez a modul?
Ebben az esetben nem az, hogy a jelenlegi modul Java JAR-fájlt? Nos, igen és nem. Igen - mert a JAR-fájlok független egység telepítési Java-alkalmazások. Nem, mert nem rendelkezik a másik három jellemző. A manifest.mf fájl nevét tartalmazza, és néha - még egy változata a JAR-fájlt. Sem egyik, sem a másik egy részmunkaidős modell végrehajtása, és ezért nem szolgálhat kifejezett tényleges identitás. Akkor nem nyilvánítja a kapcsolatot a különböző JAR-fájlokat. Te magad kell, hogy minden függőség a classpath. By the way, az út - ez csak egy sima gyűjtemény osztályok miatt az eredeti JAR-fájlok is elvesznek. Ez azt is megmagyarázza egy másik nagy kérdés: nyilvános osztálya JAR-fájl látható marad az egész utat, hogy az osztály. Nincs módosító «jar-scope» láthatóság, amely elrejti a végrehajtás részleteit belsejében JAR.
Tehát, JAR-fájlok a szükséges mechanizmus moduláris alkalmazások, de ezek nem elég önmagában. Vannak szakemberek, akik sikeresen építi rendszerét több JAR-fájlok (de a használata egy moduláris felépítésű minták), képes kezelni identitás és a függőség a kedvenc eszközei kifejezetten erre. Hogy legalább egy Netflix API, amely 500 JAR-fájlokat. De, sajnos, a osztályútvonal fordítás során és a végrehajtás szükségszerűen változik megjósolhatatlan módon, és ásít JAR-pokol. Sajnos, ezt el kell tolerálható.
beállítja OSGi
Tehát a szokásos Java nyelv nem biztosít elegendő részletességgel. Ez egy ismert probléma, talán megtalálja őt alternatív megoldás lesz lehetőség keretében Jigsaw. Azonban ő nem írt Java 8. Előtte - Java-7, így a belátható jövőben, akkor meg kell csinálni nélküle. Ha egyáltalán szükséges. Továbbra is OSGi. moduláris platform, amely a Java, már érett, és járatni a harcban. Ezt alkalmazzák az egyes alkalmazási szerverek és IDE, és ez az alapja a skálázható architektúra.

OSGi technológia növeli a modularitás a JVM, ami egyúttal egy első osztályú szempont (első osztályú állampolgár) platform. Ez úgy történik, kiegészítéssel JAR-fájlok és a csomagok megfelelő szemantika, amely lehetővé teszi, hogy teljes mértékben kihasználni a valódi modularitás. OSGi modul is nevezik „beállítani» (köteg), - ez JAR ++. Ez határozza meg a JAR nyilvánvaló további mezőket változat (lehetőleg szemantikai), a készülék neve és a csomagok listáját a készlet, amely exportálni kell. Export csomag azt jelenti, hogy jelöljön ki egy változata a csomag, minden nyilvános osztályok ebben a csomagban lesz látható a többi készletek. Minden osztályban nem exportálják a csomag lesz látható, csak belül a készlet. OSGi biztosítja a munka előrehaladásáról teljesítése során, nem utolsósorban annak a ténynek köszönhető, hogy mindegyik egy külön osztály betöltő. A kit dönt, hogy a csomagok által exportált egy másik - újra fel, amely meghatározza, hogy az importált, attól függően, hogy a nyilvánvaló, a JAR-fájlt. Természetesen, ha az ilyen behozatal meg kell határozni, és a változat (tartomány), amely lehetővé teszi, hogy egy ésszerű függőség és vezet az engedélyezési folyamatot beállta OSGi. Így akkor is egyszerre futtatni több verzió a csomag és osztályok. Egy kis példa a kiáltvány egyes paraméterek OSGi:

Van: OSGi biztosít számunkra függetlenül bevethető JAR stabil identitás, ami szükségessé teheti, vagy javasoljon függőség (azaz, verzióval csomagok). Az összes többi szigorúan zárva a csomagokat. OSGi futtató környezet teljesítményét rendezi az összes árnyalatokat fenntartásához szükséges egyértelmű szétválasztása a munka során. Akkor is hot-swap, hozzáadásával vagy eltávolításával csomagok végrehajtás során!
OSGi szolgáltatások
Tehát a OSGi készletek érvényesíteni függőségek határozzák meg a csomagot szinten határozza meg a dinamikus életciklusa tartalmazó készletek ezeket a csomagokat. Lehet, hogy minden, ami szükséges a végrehajtásához SOA-hasonló megoldások dióhéjban? Majdnem. Van még egy fontos fogalom, amely elválaszt minket a teremtés ilyen moduláris mikroservisov alapuló OSGi-készletek.
Munkavégzés a OSGi készletek, tudjuk programozni, amely a felület, az exportált készlet. De hogyan lehet a végrehajtása a felület? Export végrehajtási osztály - egy rossz döntés, ha ez történik csak példányosíthat azt tételekben fogyaszt. Jól jönne egy gyári minta és a gyári részeként exportálni az API-t. De a kilátás az írás egy gyár minden felület úgy tűnik, egy kicsit ... primitív. Egyáltalán nem jó. De van megoldás: meg kell dolgozni OSGi-szolgáltatásokat. OSGi szolgáltatást nyújt-Névsor mechanizmus regisztrálja végrehajtását annak interfészt a szolgáltatás adatbázis. Általános szabály, akkor regisztrálja szolgáltatás indítási kit, amely a kívánt végrehajtását. Egyéb készletek kérheti egy adott megvalósítása nyilvános interfész a szolgáltató adatbázisában. Ők kapják a megvalósítása a registry, és ez nem is kell tudni, hogy a szülő osztály végrehajtása a kódot. OSGi automatikusan kezeli a függőségeket szolgáltatók és fogyasztók közötti a szolgáltatások ugyanúgy, mint szerint eljárva a csomagot szinten.

Megéri?
Talán Önök is egyetértenek, hogy az épület egy valóban moduláris kódot bázis - ez nagyra törő cél. És persze, hogy e cél elérése érdekében lehetséges és nem OSGi. Az viszont, moduláris OSGi runtime, mintha nem ment egy kódot bázis, ahol a modularitás és nem illata. A végén, modularitás - egy építészeti elv, amely alkalmazható szinte bármilyen anyag, szeretnék. De ahhoz, hogy tervezzen egy moduláris kialakítás könnyű. futtatási környezetet fog működni simán a modulokat csak azzal a feltétellel, hogy a modulokat és a függőségek egy ilyen környezetben, első osztályú entitások, a tervezési fázisban a működési szakaszba.
A gyakorlatban mindez bonyolultnak tűnik? Igen, van, persze, van valami, hogy elolvassa, de nem olyan rossz, mint azt sokan hiszik. Az elmúlt néhány évben, eszköz támogatja a fejlődő stílus OSGi radikálisan javult. Különösen figyelemre méltó a BND és bndtools. Ha azt szeretnénk, hogy megtapasztalják, milyen a teljes fejlesztési moduláris alkalmazások Java, nézd meg ezt a bemutató videót kollégám Paul Bakker.
Moduláris architektúra és tervezési lehetőségeket most vonzza egyre nagyobb az érdeklődés. Ha úgy dönt, hogy nem próbálja a ezeket a technikákat a kódot Java, azt ajánlom, hogy olvassa el az anyagokat, amelyek már fel linkek ebben a cikkben, és új lendületet ad az OSGi. Figyelmeztetem: valójában nehéz lesz. De a mester OSGi igazán, de így valódi modularitás sokkal nehezebb.