Thématiques principales

mercredi 27 février 2019

OSGI : Karaf ServiceMix

On est presque à la fin du mois et je n’ai écrit qu’un seul article! Heureusement j’ai un sujet au chaud pour combler le vide.

On avait parlé du framework OSGI Felix [osgi-felix] la dernière fois et nous avions vu dans un précédent article qu’il en existe d’autres packages sous la forme de serveur d’application (comme le serait un Jboss [jboss] ou un Weblogic [weblogic]).

Nous allons justement nous intéresser à deux de ses serveurs:
  • Karaf [karaf]
  • ServiceMix [servicemix]

Bien sur ceux les connaissant diront que c’est grosso merdo la même chose, et effectivement, ServiceMix s’appuie sur Karaf mais en apportant un ensemble de bundle dédié à la communication et aux services, c’est à dire les WebServices et les services de messageries (SMTP, JMS, etc…). Il était donc important de le connaître également.



Rentrons directement dans le vif du sujet. Commençons par tester ces serveur avec les bundles que nous avions construit dans l’article sur Felix.

On va dans un premier temps construire une image docker contenant chacun de ces deux framework:


FROM openjdk:8-jre-alpine
RUN wget http://apache.crihan.fr/dist/karaf/4.2.2/apache-karaf-4.2.2.tar.gz \
&& tar zxvpf apache-karaf-4.2.2.tar.gz && rm apache-karaf-4.2.2.tar.gz

COPY . /
CMD cd /apache-karaf-4.2.2/bin; ./karaf


et pour servicemix:


FROM openjdk:8-jre-alpine

RUN wget http://apache.crihan.fr/dist/servicemix/servicemix-7/7.0.1/apache-servicemix-7.0.1.zip \
&& unzip apache-servicemix-7.0.1.zip && rm apache-servicemix-7.0.1.zip

COPY . /
CMD cd /apache-servicemix-7.0.1/bin; ./servicemix


Ensuite nous allons les démarrer pour explorer un peu leur utilisation basiques:


$ docker run -it --rm --name karaf collonvtom/karaf
        __ __                  ____
       / //_/____ __________ _/ __/
      / ,<  / __ `/ ___/ __ `/ /_
     / /| |/ /_/ / /  / /_/ / __/
    /_/ |_|\__,_/_/   \__,_/_/

  Apache Karaf (4.2.2)

Hit '<tab>' for a list of available commands
and '[cmd] --help' for help on a specific command.
Hit '<ctrl-d>' or type 'system:shutdown' or 'logout' to shutdown Karaf.

karaf@root()> shell:ls
BUILDING.md      NOTICE           RELEASE-NOTES.md data             etc              instances        lib              system
LICENSE          README.md        bin              deploy           examples         karaf.pid        lock
karaf@root()>


et pour servicemix:


$ docker run -it --rm --name smix collonvtom/servicemix
Please wait while Apache ServiceMix is starting...
100% [========================================================================]

Karaf started in 0s. Bundle stats: 9 active, 9 total
 ____                  _          __  __ _
/ ___|  ___ _ ____   _(_) ___ ___|  \/  (_)_  __
\___ \ / _ \ '__\ \ / / |/ __/ _ \ |\/| | \ \/ /
 ___) |  __/ |   \ V /| | (_|  __/ |  | | |>  <
|____/ \___|_|    \_/ |_|\___\___|_|  |_|_/_/\_\

  Apache ServiceMix (7.0.1)

Hit '<tab>' for a list of available commands
and '[cmd] --help' for help on a specific command.
Hit '<ctrl-d>' or 'system:shutdown' to shutdown ServiceMix.

karaf@root>shell:exec ls
LICENSE
NOTICE
README
RELEASE-NOTES
bin
data
deploy
etc
examples
instances
karaf.pid
lib
licenses
lock
system
karaf@root>


Ok du coup on note que les commandes ne sont pas tout à fait les même que sur Felix, mais que ces deux serveurs d’applications offrent un large panel de composants déjà installés.

Entre autre, on notera que si Karaf fourni essentiellement un environnement OSGI booster avec des services utilitaires afin de fournir un contexte d’utilisation et de développement ergonomique, ServiceMix va vraiment plus loin de incorporant des outils comme [Jackson], [Camel], [ActiveMQ] et anecdotiquement [Scala].

Retournons à nos moutons, je ne sais pas si vous l’avez remarqué mais nos deux serveurs ne fonctionnement pas nativement sur l'implémentation Felix de OSGI…. c’est possible de le faire bien su, mais c’est l’occasion d’introduire une autre implémentation (que nous recroiserons) qu’est [Equinox].

Ainsi en conséquence, il va falloir changer la dépendance maven vers le framework OSGI choisi:


<dependency>
 <groupId>org.eclipse.tycho</groupId>
 <artifactId>org.eclipse.osgi</artifactId>
 <version>3.11.2.v20161107-1947</version>
 <scope>compile</scope>
</dependency>


On rebuild avec maven (je ne refais pas de topo la dessus je vous invite à consulter l’article précédent).

Maintenant il va falloir ajouter nos assembly à nos images docker…. pas de soucis pour ça…. on refait comme avec Felix, on surcharge les images que nous venons de créer en y incorporant les jar (à noter que nous déposons nos assemblies dans le répertoire deploy des serveurs respectifs):


FROM collonvtom/karaf:latest

COPY . /apache-karaf-4.2.2/deploy/
CMD cd /apache-karaf-4.2.2/bin; ./karaf


et pour ServiceMix:


FROM collonvtom/servicemix:latest

COPY . /apache-servicemix-7.0.1/deploy/
CMD cd /apache-servicemix-7.0.1/bin; ./servicemix


et on les exécute:


$ docker run -it --rm --name smix karaf-helloworld
Demarrage du bundle Provider
Enregistrement du service World
Demarrage du bundle Consumer
Inside WorldServiceTracker.addingService tc-osgi-bundle-hello-world-provider [13]
Obtention du service WorldServiceFactory
Hello World
        __ __                  ____
       / //_/____ __________ _/ __/
      / ,<  / __ `/ ___/ __ `/ /_
     / /| |/ /_/ / /  / /_/ / __/
    /_/ |_|\__,_/_/   \__,_/_/

  Apache Karaf (4.2.2)

Hit '<tab>' for a list of available commands
and '[cmd] --help' for help on a specific command.
Hit '<ctrl-d>' or type 'system:shutdown' or 'logout' to shutdown Karaf.

karaf@root()> list
START LEVEL 100 , List Threshold: 50
ID │ State  │ Lvl │ Version        │ Name
───┼────────┼─────┼────────────────┼─────────────────────────────────────────────────────────────────────────────────────────────────────────────────
13 │ Active │  80 │ 0.2.0.SNAPSHOT │ tc-osgi-bundle-hello-world-provider-0.2.0-SNAPSHOT
14 │ Active │  80 │ 0.2.0.SNAPSHOT │ tc-osgi-bundle-hello-world-consumer-0.2.0-SNAPSHOT
25 │ Active │  80 │ 4.2.2          │ Apache Karaf :: OSGi Services :: Event
karaf@root()>
Relachement du service WorldServiceFactory


et pour ServiceMix:


$ docker run -it --rm --name smix smix-helloworld
Please wait while Apache ServiceMix is starting...
100% [========================================================================]

Karaf started in 0s. Bundle stats: 9 active, 9 total
Demarrage du bundle Provider
Enregistrement du service World
Demarrage du bundle Consumer
Inside WorldServiceTracker.addingService tc-osgi-bundle-hello-world-provider [10]
Obtention du service WorldServiceFactory
Hello World
 ____                  _          __  __ _
/ ___|  ___ _ ____   _(_) ___ ___|  \/  (_)_  __
\___ \ / _ \ '__\ \ / / |/ __/ _ \ |\/| | \ \/ /
 ___) |  __/ |   \ V /| | (_|  __/ |  | | |>  <
|____/ \___|_|    \_/ |_|\___\___|_|  |_|_/_/\_\

  Apache ServiceMix (7.0.1)

Hit '<tab>' for a list of available commands
and '[cmd] --help' for help on a specific command.
Hit '<ctrl-d>' or 'system:shutdown' to shutdown ServiceMix.

karaf@root>^Dkaraf@root>
Inside WorldServiceTracker.removedService tc-osgi-bundle-hello-world-provider [10]
Relachement du service WorldServiceFactory


Ok donc on constate que nos bundles sont démarrés lors du démarrage des serveurs et que l’ensemble fonctionne… ok on est iso avec Felix

Voila, nous venons de rapidement faire le tour de Karaf/ServiceMix avec le vieil exemple du Hello world. Dans le prochain article, nous regarderons comment simplifier la construction de nos bundles et de nos services en passant rapidement sur [SpringDM] et [Blueprint].

Edit*: depot git-hub du code de l'article https://github.com/collonville-tom/tc-hello-world

References

[osgi-felix] https://un-est-tout-et-tout-est-un.blogspot.com/2019/02/osgi-felix.html
[jboss] http://www.jboss.org/
[weblogic] https://www.oracle.com/fr/middleware/weblogic/
[karaf] http://karaf.apache.org/manual/latest/#_overview
[servicemix] http://servicemix.apache.org/
[Jackson] https://www.baeldung.com/jackson
[Camel] http://camel.apache.org/
[ActiveMQ] http://activemq.apache.org/
[Scala] https://www.scala-lang.org/
[Equinox] http://www.eclipse.org/equinox
[SpringDM] https://docs.spring.io/spring-osgi/docs/current/reference/html/

Aucun commentaire:

Enregistrer un commentaire