Contenu connexe
Similaire à Elsass JUG - OSGi
Similaire à Elsass JUG - OSGi (20)
Elsass JUG - OSGi
- 1. OSGi
11 octobre 2012
François Fornaciari
Zenika © 2012 1
- 2. François Fornaciari
Membre du Board de l’OSGi Users’ Group France
Consultant Zenika
Spécialiste Java EE / RIA
Formateur OSGi
Ancien développeur JOnAS
@fornacif
francois.fornaciari@zenika.com
Zenika © 2012 2
- 3. OSGi
Définition
« Une plate-forme de déploiement et
d’exécution de services Java »
Zenika © 2012 3
- 4. OSGi
Spécifications
Standards décomposés en plusieurs volets
Core
Plateforme minimale
Détail du fonctionnent d’un framework OSGi
Définition des services obligatoires
Compendium
Définition de l’ensemble des services additionnels
Enterprise
Définition des services estampillés « Enterprise »
Portage de composants Java EE
Zenika © 2012 4
- 5. OSGi
Historique
Fondation de l'OSGi Alliance en 1999
Historique des Releases
R1.0 R2.0 R3.0 R4.0
• mai 2000 • octobre 2001 • mars 2003 • août 2005
R4.2 R4.2 R4.1 R4.0.1
Compendium Core • avril 2007 • juillet 2006
• août 2009 • juin 2009
R4.2 R4.3 R4.3 R5.0
Enterprise Core Compendium Core + Ent.
• mars 2010 • avril 2011 • janvier 2012 • mars 2012
Zenika © 2012 5
- 6. OSGi
Objectifs
Modularité des applications
Meilleur découpage des applications
Isolation des modules
Chargement / déchargement de code sans interruption de la plate-
forme
Résolution des dépendances versionnées de code
Architecture orientée service
Couplage faible
Configuration dynamique des applications
Exemple d’utilisation : architectures à base de plugins
Zenika © 2012 6
- 7. OSGi
Implémentations open source
Apache Felix
Eclipse Equinox (RI)
Knopflerfish
Zenika © 2012 7
- 8. Specification R1.0
Bundle
Bundle
Unité de déploiement : JAR + MANIFEST
Unité fonctionnelle (offre des services)
Provided res Required
services classes services
Exported Imported
packages manifest
packages
Application
Ensemble de bundles
Livrés dynamiquement
Eventuellement partagés avec d’autres applications
Zenika © 2012 8
- 9. Specification R1.0
MANIFEST
# Package(s) requis
Import-Package: com.zenika.interface;version=1.1.0
# Package(s) fournis
Export-Package: com.zenika.util;version=2.0.0
# Identifiant du bundle : unique pour la plate-forme
Bundle-SymbolicName: com.zenika.example
# Version du bundle
Bundle-Version: 2.1.0
# Nom du bundle
Bundle-Name: Exemple
# Nom de la classe Activator (équivalent de la classe Main)
Bundle-Activator: com.zenika.internal.Activator
Zenika © 2012 9
- 10. Specification R1.0
BundleActivator
Interface BundleActivator
import org.osgi.framework.Bundle;
import org.osgi.framework.BundleActivator;
import org.osgi.framework.BundleContext;
public class Activator implements BundleActivator {
public void start(BundleContext bundleContext) throws Exception {
Bundle[] bundles = bundleContext.getBundles();
for (Bundle bundle : bundles) {
System.out.println(bundle.getSymbolicName());
}
}
public void stop(BundleContext bundleContext) throws Exception {
System.out.println("Bundle is stopping");
}
}
Zenika © 2012 10
- 11. Specification R1.0
BundleContext
Point d'accès vers le framework OSGi
Un BundleContext par bundle
Enregistrement de services
Recherche de services
Souscription aux évènements du framework
FrameworkListener, BundleListener, ServiceListener
Accès au framework
Liste des bundles / services disponibles
Installation / mise à jour / désinstallation de bundles
Zenika © 2012 11
- 12. Specification R1.0
Services (1/2)
Service
broker
Lookup Register
Specification
Binding
Consumer Provider
Zenika © 2012 12
- 13. Specification R1.0
Services (2/2)
Publication
PrintService service = new PrintServiceImpl();
Dictionary<String, String> props = new Hashtable<String, String>();
props.put("color", "true");
sr = bundleContext.registerService(PrintService.class, service, props);
Recherche
ServiceReference<PrintService> serviceReference =
bundleContext.getServiceReference(PrintService.class);
// Si on trouve une référence, on récupère le service
if (serviceReference != null) {
PrintService printService = bundleContext.getService(serviceReference);
}
Zenika © 2012 13
- 14. Specification R1.0
Services additionnels
LogService
Implémentation de loggers dynamiques
HttpService
Service permettant d'enregistrer des servlets et des ressources et
de les publier via HTTP
Et quelques autres…
Zenika © 2012 14
- 16. Specification R2.0
Abstraction de la dynamicité
BundleListener et ServiceListener : gestion bas niveau
Exemple de complexité
Un bon gestionnaire de services nécessite la récupération des services existants
et ceux qui vont apparaitre ou disparaitre au « runtime »
ServiceTracker
Factorisation de la récupération des services et des notifications
Possède des méthodes utilitaires
PrintService service = serviceTracker.getService();
BundleTracker sur le même principe
Introduit lors d’une release postérieure
Zenika © 2012 16
- 17. Specification R2.0
Services additionnels (1/2)
Configuration Admin Service
Configuration dynamique d’un bundle
Notification de la MAJ de la configuration
Exemple
Chaque service JOnAS possède sa propre configuration
La présence d’une configuration déclenche le démarrage du service
Metatype Service
Description de la structure d’une configuration (types, valeurs par
défaut, …)
Utilisé par les interfaces d’administration par exemple
Zenika © 2012 17
- 19. Eclipse 3.0
2004 : Première version d’Eclipse basée sur OSGi
Les plugins sont des bundles OSGi
Exemple d’utilisation massive d’OSGi
Zenika © 2012 19
- 20. Specification R4.0
Event Admin Service
Basé sur le modèle publication-souscription d'évènements
synchrones ou asynchrones
postEvent
(topics)
EventAdmin
Publisher
« service »
EventHandler handleEvent
« service » (topics)
Zenika © 2012 20
- 21. Specification R4.0
Gestion de la complexité
La plateforme OSGi permet de créer des applications
dynamiques et extensibles
Cependant, la gestion de la dynamicité est complexe
Les développeurs veulent se focaliser sur le code métier et non sur
les mécanismes OSGi de bas niveau
Solutions : canevas d'exécution de composants orientés
service
Declarative Services (Compendium)
Zenika © 2012 21
- 22. Specification R4.0
Declarative Services (1/2)
Modèle de programmation par composants
Composant DS : POJO Java
Capacité d’un composant
Possède son propre cycle de vie (dépend de l’état du bundle)
Requière des services
L’activation d’un composant peut être liée à la résolution de ses dépendances de
service
Fournit des services
Possède une configuration
Intégration possible avec Configuration Admin Service
Déclaration des composants
XML
Annotations
Programmatique
Zenika © 2012 22
- 23. Specification R4.0
Implémentations
Implémentations Declarative Services
Apache Felix : Service Component Runtime (SCR)
Eclipse Equinox : DS
Ecosystème
Chaque communauté implémente un ensemble de services
Compendium
Possible d’utiliser une implémentation différente du framework
d’exécution
Zenika © 2012 23
- 24. Apache Felix iPOJO
Alternative à Declarative Services
Framework complet, léger et extensible
Attention : non standard
Zenika © 2012 24
- 26. Serveurs d’applications Java EE
2006 : premier prototype de JOnAS basé sur OSGi
2008 : sortie de JOnAS 5
Refonte complète de l’architecture
Introduction de la notion de profils
Passage des autres acteurs du marché à OSGi
Glassfish, JBoss, Apache Geronimo, Websphere, …
Introduction des modèles de programmation hybrides
Java EE / OSGi
Déploiement de WAR/JAR/EAR/RAR ou de bundles
EJB exposés sous forme de services OSGi
Récupération de services OSGi depuis JavaEE
Zenika © 2012 26
- 27. Spring Dynamic Modules
2008 : sortie de la version 1.0 de Spring DM
Portage du modèle de programmation Spring sur OSGi
Objectifs visés
Abstraction d’OSGi aux développeurs d’applications Spring
Tire parti du standard sans être intrusif durant les développements
Mais également possibilité d’interagir avec l’environnement OSGi
depuis les applications
Beaucoup de serveur d’applications basés sur OSGi ne fournissait pas un
modèle de programmation OSGi au développeur
OSGi limité à l’architecture interne du produit
Zenika © 2012 27
- 28. Specification R4.2
Core et Compendium
Service Hooks
Spécification permettant d'interagir avec le « service engine »
Connaître les services requis par les bundles
Limiter la visibilité de certains services
Mettre facilement en œuvre des proxies de services
Remote Services
Rendre accessible des services OSGi depuis un autre framework
(serveur distant)
Fournit un mécanisme d'exposition de services
Création d'un endpoint par service
Le protocole de communication n'est pas spécifié
Basé sur des technologies Web Service, JMS, ....
Zenika © 2012 28
- 29. Specification R4.2
Enterprise (1/2)
Première spécification délivrée en 2010 par l'OSGi Alliance
Enterprise Expert Group (EEG)
Bien que destinée à l'origine au domaine de l'embarqué, la
spécification OSGi couvre désormais le domaine de l'entreprise
Décrit un ensemble de services orientés « entreprise »
JMX Management Model
JDBC Service / JPA Service / JTA Transaction Service
JNDI Service
Web Applications
…
Permet aux applications OSGi de s'appuyer sur un modèle
de développement basé sur des services Java EE
Réutilisation de standards éprouvés en entreprise
Zenika © 2012 29
- 30. Specification R4.2
Enterprise (2/2)
Implémentations
Apache Aries
Eclipse Gemini
Zenika © 2012 30
- 31. Specification R4.2
Enterprise (2/2)
Blueprint
Standard issu du modèle de programmation Spring
Framework à composants
Intégration plus poussée avec OSGi Enterprise
Implémentations
Apache Aries Blueprint
Eclipse Gemini Blueprint
Suite à l’abandon de Spring DM par SpringSource en 2010, scission du projet en
Eclipse Blueprint et Eclipe Virgo
Zenika © 2012 31
- 32. OSGi Kernels
Frameworks OSGi comprenant un ensemble de
fonctionnalités additionnelles
Console, logging, provisioning, gestion des composants, extension
du shell, sécurité, ...
Apache Karaf
Eclipse Virgo
Zenika © 2012 32
- 35. Specification R4.3
Core (2/2)
Weaving Hooks
Permet d'intercepter le chargement de classe des bundles et de
manipuler le bytecode avant chargement
Resolver Hook
Permet d'intercepter le mécanisme de résolution de packages et
d'influencer le resolver
Exemple : limiter la visibilité de certains packages
Bundle Hook
Permet d'intercepter les évènements du framework à propos du
cycle de vie des bundles (Event Hook)
Permet de limiter la visibilité de certains bundles (Find Hook)
Zenika © 2012 35
- 37. Specification R5.0
Enterprise
Resolver Service
Utilisable par des outils d’administration pour calculer les
ressources nécessaires au déploiement d’un bundle
Simulation de l’impact d’une mise à jour
Repository Service
Standardisation de l’actuel OBR
Subsystem
Isolation d’un groupe de bundles
Définition des interactions avec les autres bundles du framework
Zenika © 2012 37
- 38. Références
Demo: https://github.com/fornacif/osgi-console.git
OSGi Alliance : http://www.osgi.org
OSGi Wiki : http://en.wikipedia.org/wiki/OSGi
Apache Felix : http://felix.apache.org
Apache Karaf : http://karaf.apache.org
Apache Aries : http://aries.apache.org
Eclipse Equinox : http://www.eclipse.org/equinox
Eclipse Virgo : http://www.eclipse.org/virgo
Eclipse Gemini : http://www.eclipse.org/gemini
Eclipse Libra : http://www.eclipse.org/libra
Bndtools : http://njbartlett.name/bndtools.html
Zenika © 2012 38