Top Banner
Embrace Change OSGi A Developer's Quickstart Carsten Ziegeler [email protected] Apache Con US Presentation – November 2009 - Oakland
79

Embrace Change - Embrace OSGi

May 10, 2015

Download

Technology

My OSGi presentation from ApacheCon US 2009, November, in Oakland, CA.
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: Embrace Change - Embrace OSGi

Embrace ChangeOSGi

A Developer's Quickstart

Carsten [email protected]

Apache Con US Presentation – November 2009 - Oakland

Page 2: Embrace Change - Embrace OSGi

About• Member of the ASF

– Sling, Felix, Cocoon, Portals, Sanselan, Excalibur, Incubator

– PMC: Felix, Portals, Sling, Incubator, Excalibur (Chair)

• RnD Team at Day Software• Article/Book Author, Technical Reviewer• JSR 286 Spec Group (Portlet API 2.0)

2

Page 3: Embrace Change - Embrace OSGi

Agenda1 Motivation2 And Action...3 Why OSGi?4 Apache Felix 5-7 Bundles, Services, Dynamics8 Famous Final Words

3

Page 4: Embrace Change - Embrace OSGi

Example Application

1 Motivation1 Motivation

4

Page 5: Embrace Change - Embrace OSGi

Motivation• Modularity is key

– Manage growing complexity– Support dynamic extensibility

• No solution in standard Java– OSGi: tried and trusted

• Embrace change – Embrace OSGi– Only a few concepts – easy to get started

5

Page 6: Embrace Change - Embrace OSGi

Example Application

2 And Action...2 And Action...

6

Page 7: Embrace Change - Embrace OSGi

Paint Program• Swing-based paint program• Interface SimpleShape for drawing

– Different implementations– Each shape has name and icon properties– Available shapes are displayed in tool bar

• Select shape and then select location– Shapes can be dragged, but not resized

• Support dynamic deployment of shapes

7

Page 8: Embrace Change - Embrace OSGi

Shape Abstraction• Conceptual SimpleShape interface

public interface SimpleShape{ /** * Method to draw the shape of the service. * @param g2 The graphics object used for * painting. * @param p The position to paint the shape. **/ public void draw(Graphics2D g2, Point p);}

8

Page 9: Embrace Change - Embrace OSGi

Paint Program Mock Up

9

Page 10: Embrace Change - Embrace OSGi

High-Level Architecture

DrawingFrame

ShapeComponent

DefaultShape

SimpleShape

1 1ShapeTracker

1 *

1

1 1

* 1

1

10

Page 11: Embrace Change - Embrace OSGi

High-Level Architecture

DrawingFrame

ShapeComponent

DefaultShape

SimpleShape

1 1 1 *

1

1 1

* 1

1

ShapeTracker

Best practice – Try to centralize interaction with OSGi API so that

other components remain POJOs...only Shape Tracker will

interact with OSGi API.

11

Page 12: Embrace Change - Embrace OSGi

High-Level Architecture

ShapeComponent

DefaultShape

SimpleShape

1 1 1 *

1

1 1

* 1

1

ShapeTracker

DrawingFrame

Main application window – gets

dynamically injected with available shapes

from the Shape Tracker.

12

Page 13: Embrace Change - Embrace OSGi

DrawingFrame

High-Level Architecture

ShapeComponent

1 1 1 *

1

1 1

* 1

1

ShapeTracker

DefaultShape

SimpleShapeActual shape

implementation.

13

Page 14: Embrace Change - Embrace OSGi

DrawingFrame

High-Level Architecture

ShapeComponent

1 1 1 *

1

1 1

* 1

1

ShapeTracker

DefaultShape

SimpleShape

Injected “proxied” shape implementation to hide aspects of dynamism and provide a default

implementation.

Actual shape implementation.

14

Page 15: Embrace Change - Embrace OSGi

SimpleShape

DefaultShape

DrawingFrame

High-Level Architecture

1 1 1 *

1

1 1

* 1

1

ShapeTracker

ShapeComponent

Component that draws the shape in parent frame; looks up shape via Drawing Frame

rather than having a direct reference.

15

Page 16: Embrace Change - Embrace OSGi

Example Application

LIVE DEMO

16

Page 17: Embrace Change - Embrace OSGi

Example Application

3 Why OSGi?3 Why OSGi?

17

Page 18: Embrace Change - Embrace OSGi

Class Path Hell

• Can you spot some potential problems?

18

Page 19: Embrace Change - Embrace OSGi

Class Path Hell

• What libs are used? Versions?• Which jar is used? Version?• No difference between private and public

classes

19

Page 20: Embrace Change - Embrace OSGi

Java's Shortcomings• Simplistic version handling

– “First” class from class path– JAR files assume backwards compatibility at

best• Implicit dependencies

– Dependencies are implicit in class path ordering

– JAR files add improvements for extensions, but cannot control visibility

20

Page 21: Embrace Change - Embrace OSGi

Java's Shortcomings• Split packages by default

– Class path approach searches until it finds, which leads to shadowing or version mixing

• Limited scoping mechanisms– No module access modifier– Impossible to declare all private stuff as

private• Missing module concept

– Classes are too fine grained, packages are too simplistic, class loaders are too low level

• No deployment/lifecycle support21

Page 22: Embrace Change - Embrace OSGi

Java Dynamism Limitations• Low-level support for dynamics

– Class loaders are complicated to use and error prone

• Support for dynamics is still purely manual– Must be completely managed by the

programmer– Leads to many ad hoc, incompatible

solutions• Limited deployment support

22

Page 23: Embrace Change - Embrace OSGi

OSGi Technology• Adds modularity and dynamics

– Module concept• Explicit sharing (importing and exporting)

– Automatic management of code dependencies

• Enforces sophisticated consistency rules for class loading

– Life-cycle management• Manages dynamic deployment and configuration

• Service Registry– Publish/find/bind

23

Page 24: Embrace Change - Embrace OSGi

OSGi Alliance• Industry consortium• OSGi Service Platform specification

– Framework specification for hosting dynamically downloadable services

– Standard service specifications• Several expert groups define the

specifications– Core Platform Expert Group (CPEG)– Mobile Expert Group (MEG)– Vehicle Expert Group (VEG)– Enterprise Expert Group (EEG)

24

Page 25: Embrace Change - Embrace OSGi

Example Application

4 Apache Felix4 Apache Felix

25

Page 26: Embrace Change - Embrace OSGi

Apache Felix• Top-level project (March 2007)• OSGi R4 (R4.2) implementation

– Framework (frequent releases)– Services (continued development)

• Log, Package Admin, Event Admin,Configuration Admin, Declarative Services,Meta Type, Deployment Admin (and more)

– Moving towards completing R4.2• Tools

– Maven Plugins, Web Console, iPojo– Karaf, Sigil

26

Page 27: Embrace Change - Embrace OSGi

Apache Felix• Growing community

– Diverse and healthy!– Several code grants and contributions– Various (Apache) projects use Felix / have

expressed interest in Felix and/or OSGi• e.g., ServiceMix, Directory, Sling, Tuscany

• Roadmap– Continue toward R4.2 compliance– New Tools (Karaf, Sigil)

27

Page 28: Embrace Change - Embrace OSGi

Example Application

5 OSGi – Part 15 OSGi – Part 1 BundlesBundles

28

Page 29: Embrace Change - Embrace OSGi

OSGi Architectural Overview

HardwareDriver Driver Driver

Operating SystemJava

OSGi

Framew

ork

Bundle

29

Page 30: Embrace Change - Embrace OSGi

OSGi Framework Layering

CDCCDC

ExecutionEnvironment

L0 - •OSGi Minimum Execution Environment•CDC/Foundation•JavaSE

MODULEL1 - Creates the concept of modules (aka. bundles) that use classes from each other in a controlled way according to system and bundle constraints

LIFECYCLEL2 - Manages the life cycle of bundle in a bundle repository without requiring the VM be restarted

SERVICE MODEL L3 – Provides a publish/find/bind service model to decouple bundles

30

Page 31: Embrace Change - Embrace OSGi

OSGi Framework• Component-oriented framework• Module concept: Bundles

– Separate class loader -> graph– Package sharing and version management– Life-cycle management and notification

• Dynamic!– Install, update, and uninstall at runtime

• Runs multiple applications and services in a single VM

31

Page 32: Embrace Change - Embrace OSGi

OSGi Modularity• Explicit code boundaries and

dependencies– Package imports and exports

• Multi-version support– Version ranges for dependencies

• Class space is managed by OSGi• Managed life cycle

– Dynamic install, update, uninstall

32

Page 33: Embrace Change - Embrace OSGi

OSGi Modularity - Example• Dynamic module deployment and

dependency resolution

OSGi framework

Provided package

existingbundle

33

Page 34: Embrace Change - Embrace OSGi

OSGi Modularity - Example• Dynamic module deployment and

dependency resolution

OSGi framework

existingbundle

installbundle.jar

34

Page 35: Embrace Change - Embrace OSGi

OSGi Modularity - Example• Dynamic module deployment and

dependency resolution

OSGi framework

existingbundleresolve

bundle

35

Page 36: Embrace Change - Embrace OSGi

OSGi Modularity - Example• Dynamic module deployment and

dependency resolution

OSGi framework

existingbundle

automatic packagedependency

resolution

36

Page 37: Embrace Change - Embrace OSGi

Creating a Bundle• Plain old JAR with additional metadata in

the manifest– Bundle identifier, version, exports, imports

• Tools– Text editor (Manifest)– Eclipse (PDE)– Bundle packaging tools

• BND from Peter Kriens• Apache Felix maven-bundle-plugin based on

BND

37

Page 38: Embrace Change - Embrace OSGi

Maven is Your Friend• Apache Felix Maven Bundle Plugin• Creates metadata based on POM

– Automatically: import packages– Manually: export and private packages

• Analyses classes for consistency• Allows to include dependencies• Creates final bundle JAR file

38

Page 39: Embrace Change - Embrace OSGi

Maven Bundle Plugin Sample <artifactId>org.apache.sling.engine</artifactId> <packaging>bundle</packaging> <version>2.0.7-SNAPSHOT</version> <build> <plugins> <plugin> <groupId>org.apache.felix</groupId> <artifactId>maven-bundle-plugin</artifactId> <extensions>true</extensions> <configuration> <instructions> <Export-Package> org.apache.sling.engine;version=${pom.version} </Export-Package> <Private-Package> org.apache.sling.engine.impl </Private-Package> <Embed-Dependency> commons-fileupload </Embed-Dependency> </instructions>

39

Page 40: Embrace Change - Embrace OSGi

Maven Bundle Plugin Sample <artifactId>org.apache.sling.engine</artifactId> <packaging>bundle</packaging> <version>2.0.7-SNAPSHOT</version> <build> <plugins> <plugin> <groupId>org.apache.felix</groupId> <artifactId>maven-bundle-plugin</artifactId> <extensions>true</extensions> <configuration> <instructions> <Export-Package> org.apache.sling.engine;version=${pom.version} </Export-Package> <Private-Package> org.apache.sling.engine.impl </Private-Package> <Embed-Dependency> commons-fileupload </Embed-Dependency> </instructions>

40

Page 41: Embrace Change - Embrace OSGi

Maven Bundle Plugin Sample <artifactId>org.apache.sling.engine</artifactId> <packaging>bundle</packaging> <version>2.0.7-SNAPSHOT</version> <build> <plugins> <plugin> <groupId>org.apache.felix</groupId> <artifactId>maven-bundle-plugin</artifactId> <extensions>true</extensions> <configuration> <instructions> <Export-Package> org.apache.sling.engine;version=${pom.version} </Export-Package> <Private-Package> org.apache.sling.engine.impl </Private-Package> <Embed-Dependency> commons-fileupload </Embed-Dependency> </instructions>

41

Page 42: Embrace Change - Embrace OSGi

Maven Bundle Plugin Sample <artifactId>org.apache.sling.engine</artifactId> <packaging>bundle</packaging> <version>2.0.7-SNAPSHOT</version> <build> <plugins> <plugin> <groupId>org.apache.felix</groupId> <artifactId>maven-bundle-plugin</artifactId> <extensions>true</extensions> <configuration> <instructions> <Export-Package> org.apache.sling.engine;version=${pom.version} </Export-Package> <Private-Package> org.apache.sling.engine.impl </Private-Package> <Embed-Dependency> commons-fileupload </Embed-Dependency> </instructions>

42

Page 43: Embrace Change - Embrace OSGi

Be Modular!• Create clean package spaces

– public vs private• Provide Bundles

– Add manifest information• Think about dependencies

– Additional bundle vs include– Optional– Version ranges

• Manage releases and versions properly• Benefits even without OSGi

43

Page 44: Embrace Change - Embrace OSGi

Example Application

6 OSGi – Part 26 OSGi – Part 2 ServicesServices

44

Page 45: Embrace Change - Embrace OSGi

OSGi Services (1/3)• Service-oriented architecture

– Publish/find/bind– Possible to use modules without services

Publish Find

Interact

ServiceRegistry

ServiceProvider

ServiceRequester

ServiceDescription

45

Page 46: Embrace Change - Embrace OSGi

OSGi Services (2/3)• An OSGi application is...

– A collection of bundles that interact via service interfaces

– Bundles may be independently developed and deployed

– Bundles and their associated services may appear or disappear at any time

• Resulting application follows a Service-Oriented Component Model approach

46

Page 47: Embrace Change - Embrace OSGi

OSGi Services (3/3)• Dynamic service lookup

OSGi framework

Provided service

Provided package

existingbundle

component

47

Page 48: Embrace Change - Embrace OSGi

OSGi Services (3/3)• Dynamic service lookup

OSGi framework

existingbundle

componentinstallbundle.jar

48

Page 49: Embrace Change - Embrace OSGi

OSGi Services (3/3)• Dynamic service lookup

OSGi framework

existingbundle

componentactivatebundle

49

Page 50: Embrace Change - Embrace OSGi

OSGi Services (3/3)• Dynamic service lookup

OSGi framework

existingbundle

component

automatic packagedependency resolution

50

Page 51: Embrace Change - Embrace OSGi

OSGi Services (3/3)• Dynamic service lookup

OSGi framework

existingbundle

component

manual servicedependency resolution

51

Page 52: Embrace Change - Embrace OSGi

OSGi Services Advantages• Lightweight services

– Lookup is based on interface name– Direct method invocation

• Good design practice– Separates interface from implementation– Enables reuse, substitutability, loose coupling,

and late binding

52

Page 53: Embrace Change - Embrace OSGi

OSGi Services Advantages• Dynamic

– Loose coupling and late binding• Application's configuration is simply the set of

deployed bundles– Deploy only the bundles that you need

53

Page 54: Embrace Change - Embrace OSGi

OSGi Services Issues• More sophisticated, but more complicated

– Requires a different way of thinking• Things might appear/disappear at any moment

– Must manually resolve and track services• There is help

– Service Tracker• Still somewhat of a manual approach

– Declarative Services, Blueprint, iPOJO• Sophisticated service-oriented component

frameworks• Automated dependency injection and more• More modern, POJO-oriented approaches

54

Page 55: Embrace Change - Embrace OSGi

Example Application

7 OSGi – Part 37 OSGi – Part 3 DynamicsDynamics

55

Page 56: Embrace Change - Embrace OSGi

Everything is a Bundle• How to structure bundles?

– API vs implementation bundle– Fine-grained vs coarse-grained– No “One Size Fits All”

• Simple Rules– Stable code vs changing code– Optional parts

56

Page 57: Embrace Change - Embrace OSGi

Third Party Libraries• Use them as bundles

– Project delivers already a bundle• Apache Commons, Apache Sling etc.

– Use special bundle repositories• Felix Commons, Spring etc.• But check included metadata!

– Create your own wrapper• Easy with the Felix maven bundle plugin

• Include classes in your bundle– Again: easy with the Felix maven bundle

plugin

57

Page 58: Embrace Change - Embrace OSGi

Everything is Dynamic• Bundles can come and go!

– Packages– Services

• Services can come and go!• Be prepaired!

– Application code must handle dynamics!

58

Page 59: Embrace Change - Embrace OSGi

Dynamic Services• OSGi Declarative Services Specification

– XML Configuration • Contained in bundle• Manifest entry pointing to config(s)

– Publishing services– Consuming services

• Policy (static,dynamic), cardinality (0..1, 1..1, 0..n)– Default configuration– Service Lifecycle management

• Various Implementations– Apache Felix SCR

59

Page 60: Embrace Change - Embrace OSGi

Dynamic Services Configuration<scr:component enabled="true" name="org.apache.sling.event.impl.DistributingEventHandler">

<implementation class="org.apache.sling.event.impl.DistributingEventHandler"/>

<service servicefactory="false"> <provide interface="org.osgi.service.event.EventHandler"/> </service>

<property name="repository.path" value="/var/eventing/distribution"/> <property name="cleanup.period" type="Integer" value="15"/>

<reference name="threadPool" interface="org.apache.sling.event.ThreadPool" cardinality="1..1" policy="static" bind="bindThreadPool" unbind="unbindThreadPool"/>

60

Page 61: Embrace Change - Embrace OSGi

Dynamic Services Configuration<scr:component enabled="true" name="org.apache.sling.event.impl.DistributingEventHandler">

<implementation class="org.apache.sling.event.impl.DistributingEventHandler"/>

<service servicefactory="false"> <provide interface="org.osgi.service.event.EventHandler"/> </service>

<property name="repository.path" value="/var/eventing/distribution"/> <property name="cleanup.period" type="Integer" value="15"/>

<reference name="threadPool" interface="org.apache.sling.event.ThreadPool" cardinality="1..1" policy="static" bind="bindThreadPool" unbind="unbindThreadPool"/>

61

Page 62: Embrace Change - Embrace OSGi

Dynamic Services Configuration<scr:component enabled="true" name="org.apache.sling.event.impl.DistributingEventHandler">

<implementation class="org.apache.sling.event.impl.DistributingEventHandler"/>

<service servicefactory="false"> <provide interface="org.osgi.service.event.EventHandler"/> </service>

<property name="repository.path" value="/var/eventing/distribution"/> <property name="cleanup.period" type="Integer" value="15"/>

<reference name="threadPool" interface="org.apache.sling.event.ThreadPool" cardinality="1..1" policy="static" bind="bindThreadPool" unbind="unbindThreadPool"/>

62

Page 63: Embrace Change - Embrace OSGi

Dynamic Services Configuration<scr:component enabled="true" name="org.apache.sling.event.impl.DistributingEventHandler">

<implementation class="org.apache.sling.event.impl.DistributingEventHandler"/>

<service servicefactory="false"> <provide interface="org.osgi.service.event.EventHandler"/> </service>

<property name="repository.path" value="/var/eventing/distribution"/> <property name="cleanup.period" type="Integer" value="15"/>

<reference name="threadPool" interface="org.apache.sling.event.ThreadPool" cardinality="1..1" policy="static" bind="bindThreadPool" unbind="unbindThreadPool"/>

63

Page 64: Embrace Change - Embrace OSGi

Declarative Services• Reads XML configs on bundle start• Registers services• Keeps track of dependencies

– Starts/stops services• Invokes optional activation and

deactivation method– Provides access to configuration

• Caution: A service is by default only started if someone else uses it!– Immediate flag forces a service start

64

Page 65: Embrace Change - Embrace OSGi

Example Service protected ThreadPool threadPool;

protected void activate(ComponentContext context) throws Exception { @SuppressWarnings("unchecked") final Dictionary<String, Object> props = context.getProperties(); this.cleanupPeriod = (Integer)props.get("cleanup.period"); super.activate(context); }

protected void bindThreadPool(ThreadPool p) { this.threadPool = p; }

protected void unbindThreadPool(ThreadPool p) { if ( this.threadPool == p ) { this.threadPool = null; } }

65

Page 66: Embrace Change - Embrace OSGi

Config Admin and Metatype• OSGi Config Admin

– Configuration Manager– Persistence storage– API to retrieve/update/remove configs– Works with Declarative Services

• OSGi Metatype Service– Description of bundle metadata– Description of service configurations

• Various Implementations– Apache Felix

66

Page 67: Embrace Change - Embrace OSGi

Maven SCR Plugin• Combines everything (DS, ConfigAdmin,

Metatype, Maven)• Annotation-based (even for 1.4)• Annotate components

– Properties with default values– Service providers– Services references (policy and cardinality)

• Generates DS XML• Generates Metatype config• Generates Java code

67

Page 68: Embrace Change - Embrace OSGi

SCR Plugin Sample/** * @scr.component * @scr.property name="repository.path" value="/var/eventing/distribution" private="true" * @scr.service interface="EventHandler" */public class DistributingEventHandler implements EventHandler {

protected static final int DEFAULT_CLEANUP_PERIOD = 15;

/** @scr.property valueRef="DEFAULT_CLEANUP_PERIOD" type="Integer" */ protected static final String PROP_CLEANUP_PERIOD = "cleanup.period";

/** @scr.reference */ protected ThreadPool threadPool;

protected void activate(ComponentContext context) throws Exception { final Dictionary<String, Object> props = context.getProperties(); this.cleanupPeriod = (Integer)props.get(PROP_CLEANUP_PERIOD); }

68

Page 69: Embrace Change - Embrace OSGi

Alternatives• Manually through bundle activator• Apache Felix iPojo

– Next session in this track!• Blueprint Container Specification

– Apache Aries (Incubator)

69

Page 70: Embrace Change - Embrace OSGi

Handling extensibility• Two basic implementation strategies

– Service-based approach– Extender model

70

Page 71: Embrace Change - Embrace OSGi

Service Whiteboard Pattern• Clients register a service interface• Service tracker for registered services• Simple, more robust, leverages the OSGi

service model• Service whiteboard pattern

– It is an Inversion of Control pattern

71

Page 72: Embrace Change - Embrace OSGi

Externder Model• Bundles contain manifest entries

– Like available service classes• Custom bundle tracker

– Keeps track of bundles– Specifically, STARTED and STOPPED events– Checks bundles manifest data

• Creates/removes services

72

Page 73: Embrace Change - Embrace OSGi

Example Application

8 Famous8 Famous Final WordsFinal Words

73

Page 74: Embrace Change - Embrace OSGi

Apache Felix Karaf• OSGi based kernel• Includes a preset of bundles• File based deployment and configuration• Assemblies• Extensible shell console• Download and go solution

74

Page 75: Embrace Change - Embrace OSGi

Apache Felix Sigil• OSGi centric development tools• Property configuration file• Integration with Ivy and Eclipse

– Dependency Analysis– Repository browser– Respects private packages of dependencies– Quick fix support

• Roadmap– Maven support– Extension points

75

Page 76: Embrace Change - Embrace OSGi

Suggestions for Development• Think about modularity!

– Clean package space• Think about dynamics!• Consider OSGi• Check out the spec and other projects

– Attend today's OSGi/Felix track• Minimize dependencies to OSGi

– but only if it makes sense

76

Page 77: Embrace Change - Embrace OSGi

Suggestions for Using OSGi• Think about dynamics

– Optional bundles– Optional services– Handle these cases

• Use your preferred logging library– LogManager takes care

• Use available tooling• Be part of the community!

77

Page 78: Embrace Change - Embrace OSGi

Check It Out• Read the OSGi spec

– Framework– Config Admin, Metatype, Declarative

Services– Deployment Admin, OBR

• Download Apache Felix– Try tutorials and samples– Quickstart with Apache Felix Karaf

• Download Apache Sling :)• Explore the web – embrace OSGi

78

Page 79: Embrace Change - Embrace OSGi

Questions?Questions?Embrace Change

OSGi