39
Zenika © 2012 1 OSGi 11 octobre 2012 François Fornaciari

Elsass JUG - OSGi

Embed Size (px)

Citation preview

Zenika © 2012 1

OSGi

11 octobre 2012

François Fornaciari

Zenika © 2012 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

[email protected]

Zenika © 2012 3

OSGi Définition

« Une plate-forme de déploiement et d’exécution de services Java »

Zenika © 2012 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 5

OSGi Historique

Fondation de l'OSGi Alliance en 1999

Historique des Releases

R1.0

•mai 2000

R2.0

•octobre 2001

R3.0

•mars 2003

R4.0

•août 2005

R4.0.1

• juillet 2006

R4.1

•avril 2007

R4.2 Core

• juin 2009

R4.2 Compendium

•août 2009

R4.2 Enterprise

•mars 2010

R4.3 Core

•avril 2011

R4.3 Compendium

• janvier 2012

R5.0 Core + Ent.

•mars 2012

Zenika © 2012 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 7

OSGi Implémentations open source

Apache Felix

Eclipse Equinox (RI)

Knopflerfish

Zenika © 2012 8

Specification R1.0 Bundle

Bundle

Unité de déploiement : JAR + MANIFEST

Unité fonctionnelle (offre des services)

Application

Ensemble de bundles Livrés dynamiquement

Eventuellement partagés avec d’autres applications

Required services

Provided services

Imported packages

Exported packages

classes

manifest

res

Zenika © 2012 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 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 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 12

Specification R1.0 Services (1/2)

Service broker

Consumer Provider

Register Lookup

Binding

Specification

Zenika © 2012 13

Specification R1.0 Services (2/2)

Publication

Recherche

PrintService service = new PrintServiceImpl(); Dictionary<String, String> props = new Hashtable<String, String>(); props.put("color", "true"); sr = bundleContext.registerService(PrintService.class, service, props);

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 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 15

Specifications R1.0 Demo

Zenika © 2012 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

BundleTracker sur le même principe

Introduit lors d’une release postérieure

PrintService service = serviceTracker.getService();

Zenika © 2012 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 18

Specifications R2.0 Demo

Zenika © 2012 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 20

Specification R4.0 Event Admin Service

Basé sur le modèle publication-souscription d'évènements synchrones ou asynchrones

Publisher EventAdmin « service »

postEvent (topics)

EventHandler « service »

handleEvent (topics)

Zenika © 2012 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 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 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 24

Apache Felix iPOJO

Alternative à Declarative Services

Framework complet, léger et extensible

Attention : non standard

Zenika © 2012 25

Specification R4.0 Demo

Zenika © 2012 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 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 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 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 30

Specification R4.2 Enterprise (2/2)

Implémentations

Apache Aries

Eclipse Gemini

Zenika © 2012 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 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 33

Specification R4.2 Demo

Zenika © 2012 34

Specification R4.3 Core (1/2)

Bundle Wiring API

Start Level API

Zenika © 2012 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 36

Specification R4.3 Demo

Zenika © 2012 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 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 39