15 listopada 2011

Enterprise OSGi? OSGi Blueprint? To może Karaf z Aries?

Trzeba mi było dyskusji z Łukaszem Dywickim (@ldywicki) na twitterze, abym zrozumiał, jak niewiele trzeba, aby OSGi zrzuciło z siebie czar tajemniczości. Całkowicie. Dzięki Łukasz!

Ostatnio, jeśli mówi się o OSGi to raczej w jego wydaniu korporacyjnym, której celem jest połączenie ze standardami spod sztandaru Java EE, tj. Enterprise OSGi. Pisałem o tym niejednokrotnie na blogu. Niejednokrotnie mówiłem o tym na konferencjach oraz "popełniłem" jeden artykuł w temacie - Enterprise OSGi runtime setup with Apache Aries Blueprint.

Teraz jednak okazuje się, że sprawa jest jeszcze bardziej prosta niż mi się poprzednio wydawało. Nie trzeba specjalnych kwalifikacji do zestawienia środowiska Enterprise OSGi. Wystarczy Apache Karaf i sprawa staje się niezwykle trywialna (jeśli założyć, że nauczenie się jego specyficznych poleceń wpasowuje się w to określenie).

Instalacja Karaf sprowadza się do rozpakowania odpowiedniej dystrybucji. Prościzna.

Uruchamiamy Karaf poleceniem bin/karaf. Są inne sposoby i zainteresowanych odsyłam do "producenta".
jacek:~/apps/karaf
$ ./bin/karaf 
        __ __                  ____      
       / //_/____ __________ _/ __/      
      / ,<  / __ `/ ___/ __ `/ /_        
     / /| |/ /_/ / /  / /_/ / __/        
    /_/ |_|\__,_/_/   \__,_/_/         

  Apache Karaf (2.2.4)

Hit '' for a list of available commands
and '[cmd] --help' for help on a specific command.
Hit '' or 'osgi:shutdown' to shutdown Karaf.
Jak instruuje początkowy ekran, wystarczy skorzystać z tabulacji i/lub polecenia help, aby dowiedzieć się wiele o poszczególnych poleceniach. Dodatkowo, w większości (wszystkich?) przypadków sama nazwa polecenia powinna wyjaśnić przeznaczenie.

Weźmy chociażby polecenie features:list (nie zapominamy o tabulacji po pierwszych literach!)
karaf@root> features:
features:addurl              features:info                features:install             features:list
features:listrepositories    features:listurl             features:listversions        
features:refreshurl          features:removerepository    features:removeurl           features:uninstall
karaf@root> features:list
features:list                features:listrepositories    features:listurl             features:listversions
karaf@root> features:list
State         Version           Name                          Repository             Description
[uninstalled] [2.2.4          ] karaf-framework               karaf-2.2.4            
[uninstalled] [2.5.6.SEC02    ] spring                        karaf-2.2.4            
[uninstalled] [2.5.6.SEC02    ] spring-web                    karaf-2.2.4            
[uninstalled] [3.0.6.RELEASE  ] spring                        karaf-2.2.4            
[uninstalled] [3.0.6.RELEASE  ] spring-aspects                karaf-2.2.4            
[uninstalled] [1.2.1          ] spring-dm                     karaf-2.2.4            
[uninstalled] [1.2.1          ] spring-dm-web                 karaf-2.2.4            
[uninstalled] [3.0.6.RELEASE  ] spring-instrument             karaf-2.2.4            
[uninstalled] [3.0.6.RELEASE  ] spring-jdbc                   karaf-2.2.4            
[uninstalled] [3.0.6.RELEASE  ] spring-jms                    karaf-2.2.4            
[uninstalled] [3.0.6.RELEASE  ] spring-struts                 karaf-2.2.4            
[uninstalled] [3.0.6.RELEASE  ] spring-test                   karaf-2.2.4            
[uninstalled] [3.0.6.RELEASE  ] spring-orm                    karaf-2.2.4            
[uninstalled] [3.0.6.RELEASE  ] spring-oxm                    karaf-2.2.4            
[uninstalled] [3.0.6.RELEASE  ] spring-tx                     karaf-2.2.4            
[uninstalled] [3.0.6.RELEASE  ] spring-web                    karaf-2.2.4            
[uninstalled] [3.0.6.RELEASE  ] spring-web-portlet            karaf-2.2.4            
[uninstalled] [2.2.4          ] wrapper                       karaf-2.2.4            
[uninstalled] [2.2.4          ] obr                           karaf-2.2.4            
[installed  ] [2.2.4          ] config                        karaf-2.2.4            
[uninstalled] [7.4.5.v20110725] jetty                         karaf-2.2.4            
[uninstalled] [2.2.4          ] http                          karaf-2.2.4            
[uninstalled] [2.2.4          ] war                           karaf-2.2.4            
[uninstalled] [2.2.4          ] kar                           karaf-2.2.4            
[uninstalled] [2.2.4          ] webconsole-base               karaf-2.2.4            
[uninstalled] [2.2.4          ] webconsole                    karaf-2.2.4            
[installed  ] [2.2.4          ] ssh                           karaf-2.2.4            
[installed  ] [2.2.4          ] management                    karaf-2.2.4            
[uninstalled] [2.2.4          ] eventadmin                    karaf-2.2.4            
[uninstalled] [2.2.4          ] jasypt-encryption             karaf-2.2.4            
[uninstalled] [0.3            ] transaction                   karaf-enterprise-2.2.4 OSGi Transaction Manager
[uninstalled] [0.3            ] jpa                           karaf-enterprise-2.2.4 OSGi Persistence Container
[uninstalled] [0.3            ] jndi                          karaf-enterprise-2.2.4 OSGi Service Registry JNDI access
[uninstalled] [0.3            ] application-without-isolation karaf-enterprise-2.2.4
Jak rozumiem istotę features w Karaf to nic innego jak zestawy funkcjonalne - zbiór pakunków, które razem tworzą pewną funkcjonalną całość. Prześwietlmy sam karaf-framework (ponownie nie zapominamy o tabulacji!)
karaf@root> features:
features:addurl              features:info                features:install             features:list
features:listrepositories    features:listurl             features:listversions
features:refreshurl          features:removerepository    features:removeurl           features:uninstall
karaf@root> features:in
features:info       features:install
karaf@root> features:info kar
kar               karaf-framework   
karaf@root> features:info karaf-framework 
Description of karaf-framework 2.2.4 feature
----------------------------------------------------------------
Feature has no configuration
Feature has no configuration files
Feature has no dependencies.
Feature contains followed bundles:
  mvn:org.ops4j.pax.url/pax-url-mvn/1.2.8
  mvn:org.ops4j.pax.url/pax-url-wrap/1.2.8
  mvn:org.ops4j.pax.logging/pax-logging-api/1.6.3
  mvn:org.ops4j.pax.logging/pax-logging-service/1.6.3
  mvn:org.apache.felix/org.apache.felix.configadmin/1.2.8
  mvn:org.apache.felix/org.apache.felix.fileinstall/3.1.10
  mvn:org.apache.servicemix.bundles/org.apache.servicemix.bundles.asm/3.3_2
  mvn:org.apache.aries/org.apache.aries.util/0.3
  mvn:org.apache.aries.proxy/org.apache.aries.proxy/0.3
  mvn:org.apache.aries.blueprint/org.apache.aries.blueprint/0.3.1
  mvn:org.apache.karaf.shell/org.apache.karaf.shell.console/2.2.4
  mvn:org.apache.karaf.shell/org.apache.karaf.shell.osgi/2.2.4
  mvn:org.apache.karaf.shell/org.apache.karaf.shell.log/2.2.4
  mvn:org.apache.karaf.shell/org.apache.karaf.shell.packages/2.2.4
  mvn:org.apache.karaf.shell/org.apache.karaf.shell.commands/2.2.4
  mvn:org.apache.karaf.shell/org.apache.karaf.shell.dev/2.2.4
  mvn:org.apache.karaf.jaas/org.apache.karaf.jaas.config/2.2.4
  mvn:org.apache.karaf.jaas/org.apache.karaf.jaas.modules/2.2.4
  mvn:org.apache.karaf.jaas/org.apache.karaf.jaas.command/2.2.4
  mvn:org.apache.karaf.features/org.apache.karaf.features.core/2.2.4
  mvn:org.apache.karaf.features/org.apache.karaf.features.command/2.2.4
  mvn:org.apache.karaf.features/org.apache.karaf.features.management/2.2.4
  mvn:org.apache.karaf.management/org.apache.karaf.management.server/2.2.4
  mvn:org.apache.aries.jmx/org.apache.aries.jmx/0.3
  mvn:org.apache.aries.jmx/org.apache.aries.jmx.blueprint/0.3
I od razu wiadomo z czego składa się taka kompletna funkcjonalnie całość. Bystre oko dostrzeże tam Apache Aries Blueprint (mvn:org.apache.aries.blueprint/org.apache.aries.blueprint/0.3.1).

Nie pozostaje nic innego jak sprawdzić działanie Aries Blueprint z przykładowym projektem z...Aries Blueprint. Korzystamy z pomocy Karaf, aby zainstalować pakunek z repozytorium mavenowego - wystarczy skorzystać z polecenia install i odpowiedniego adresu z mvn na przodzie.
karaf@root> install -s mvn:org.apache.aries.blueprint/org.apache.aries.blueprint.sample/0.3.1
Bundle start
Bundle ID: 49
karaf@root> ======== Initializing Foo =========
Service registration notification: 5 -1 707063160: Hello FooBar
org.apache.felix.framework.BundleContextImpl@5e6276e5 [a list element, 5] PLN
Fri Apr 17 00:00:00 CEST 2009 {osgi.service.blueprint.compname=foo, key=value}
Działa! I nie trzeba było wiele. Wystarczy Karaf. Spróbuj sam, a przekonasz się, że "zaawansowane" nie musi oznaczać "niedostępne".

Teraz skoro środowisko jest już zestawione, nie ma już wymówek na brak wiedzy do poznania Enterprise OSGi z kontenerem OSGi Blueprint w roli głównej. Jeśli Spring Framework daje Ci wiele radości, to w połączeniu z OSGi może być jej jeszcze więcej.

Czy pracujesz już z Karaf? A może również i Aries albo Spring-DM? Jakie wrażenia? Jest coś ciekawego, co powaliło Cię na kolana? Chętnie wsłuchałbym się w głos praktyka.

7 komentarzy:

  1. Hej Jacek,
    Cieszę się że Karaf Ci się spodobał. Pisałem o nim raz na swoim blogu (zmigrowanym) - http://dywicki.pl/2010/12/apache-karaf-commands-rediscovered.

    Czy używam i pracuję z Karafem? Tak.
    Czy z Ariesem? Tak.
    Ze Spring-dm? Unikam.
    Wrażenia? Nie wyobrażam sobie pracy z OSGi bez Karafa.

    Co mnie powaliło na kolana? Po pierwsze - toporność konsoli Equinoxa. ;) Praca z Karafem jest o tyle prostsza że polecenia są łatwe do zapamiętania i nie mają milionów switchy. Funkcjonuje grep, więc można sobie odfiltrować wyniki.
    Druga sprawa, bardzo istotna z mojego punktu widzenia - mogę instalować rzeczy z repozytoriów mavena.
    Trzecia, mogę uruchomić aplikację webową.
    Czwarta, nowe polecenia w konsol to też usługi OSGi.
    Piąta, można połączyć się ssh do działającego Karafa (domyślnie port 8101 karaf/karaf).

    Wymieniać dalej? :)

    OdpowiedzUsuń
  2. Druga sprawa do załatwienia przez pax-url z obsługą protokołu mvn.

    Co oznacza, że możesz uruchomić aplikację webową? Zakładam, że skoro możesz na karaf to i na equinox + zestaw pakunków OSGi.

    Nowe polecenia w Equinox są również pakunkami.

    Piąta sprawa już pewnie nietrywialna - do Equinoxa dostajemy się via telnet. O ssh nie słyszałem.

    Praca z karafem upraszcza, ale to jedynie (?) udoskonalona powłoka dla pracy z pakunkami + gotowy zestaw pakunków, które można używać.

    Więcej o karaf niebawem. Możesz spodziewać się wyłącznie krytycznego spojrzenia :)

    OdpowiedzUsuń
  3. Jacek, masz rację mówiąc że jest tam gdzieś pax-url-mvn, bo Karaf to predefiniowany zestaw bibliotek które realizują różne funkcjonalności. Po co męczyć się samemu nad złożeniem środowiska, skoro już ktoś o to się troszczy? To jest cel karafa. :)

    Zespół od pax-* ma wkład w rozwój Karafa (dwóch commiterów paxa jest PMC Karafa).

    Aplikacja webowa?
    features:install war
    i kopiujesz swój plik war do katalogu deploy.

    Chcesz więcej?
    dev:watch bundle-id

    Jak zrobisz install z mavena to wówczas bundle-id zostanie automatycznie zaktualizowany.

    Gdybyś potrzebował na przykład kilku equinoxów i w prosty sposóļ zsynchronizować replikację stanu między nimi (np. instalacja tych samych bundli) przyjrzyj się Cellarowi. :) To podprojekt Karafa.

    OdpowiedzUsuń
  4. Karaf z pewnością zyskuje na popularności dzięki temu, że ServiceMix wykorzystuje go jako OSGi runtime, co zresztą z przyczyn historycznych jest dosyć zrozumiałe. Swoją drogą, w porównaniu do Equinox'a, praca z Karaf'em jest o niebo przyjemniejsza - wspomniana wcześniej konsola Equinox'a raczej nie powala możliwościami.

    OdpowiedzUsuń
  5. Bartek, Karaf != OSGi runtime. To jedynie powłoka upraszczająca (ale równocześnie ukrywająca) środowisko uruchomieniowe, którym może być Felix (domyślnie), Equinox i in. Z resztą zgadzam się.

    Do czego stosujesz Karafa? Czasami brakuje mi inspiracji i poszukuję ich u czytelników.

    OdpowiedzUsuń
  6. Cześć Jacku, w tej chwili eksperymentuję trochę z ServiceMix/Fuse ESB - Karaf sprawia, że można skupić się bardziej na tworzeniu rozwiązania niż na problemach z zestawieniem środowiska.

    OdpowiedzUsuń
  7. Karaf znacznie upraszcza etap testów systemowych w ciągłej integracji. U nas działa to tak, że w jenkinsie mamy dwa joby - pierwszy do zbudowania komponentów w formacie bundle-jar i wysłania ich do lokalnego repozytorium mavena, drugi do zainstalowania komponentów (w postaci osgi features) na instancji karafa i przeprowadzenia testów systemowych. Dzięki karafowi ten ostatni proces jest ograniczony do kilkunastu linijek skryptów.

    OdpowiedzUsuń