109
μServices By Peter Kriens OSGi Technical Director & Evangelist 1 dinsdag 9 november 2010

µServices

Embed Size (px)

DESCRIPTION

A zen presentation about the process we call modularity. Showing how we apply the same pattern to software over and over, resulting in the latest incarnation: µservices.

Citation preview

Page 1: µServices

µServicesBy Peter Kriens

OSGi Technical Director & Evangelist

1dinsdag 9 november 2010

Page 2: µServices

In the beginnings there were bits ...

2dinsdag 9 november 2010

Page 3: µServices

01001111001100100000000011110000001000010001110010100000010011100010001101111110001000111011111011010010000100111010000001111110000010100000110111000010000011011010000000110010001000111010000001110110

Bits

3dinsdag 9 november 2010

Page 4: µServices

01001111001100100000000011110000001000010001110010100000010011100010001101111110001000111011111011010010000100111010000001111110000010100000110111000010000011011010000000110010001000111010000001110110

Bits

3dinsdag 9 november 2010

Page 5: µServices

117062000360041034240116043176043276322023240176012015302015240062043240166

Oct

al

4dinsdag 9 november 2010

Page 6: µServices

4F32 00 F021 1C A04E237E23BED2 13 A07E0A0DC2 0D A032 23 A076

Hex

5dinsdag 9 november 2010

Page 7: µServices

Code

MOV C,A STA F000H LXI H,A01CH MOV C,M INX H MOV A,M INX H CMP M JNC A013H MOV A,M DCR C JNZ A00DH STA A023H HLT

6dinsdag 9 november 2010

Page 8: µServices

Code

MOV C,A STA F000H LXI H,A01CH MOV C,M INX H MOV A,M INX H CMP M JNC A013H MOV A,M DCR C JNZ A00DH STA A023H HLT

6dinsdag 9 november 2010

Page 9: µServices

Code global = shared;

for (local=0; local<10; local++) shared *= 10;

7dinsdag 9 november 2010

Page 10: µServices

Code global = shared;

for (local=0; local<10; local++) shared *= 10;

7dinsdag 9 november 2010

Page 11: µServices

int global;int shared;int local;

Code global = shared;

for (local=0; local<10; local++) shared *= 10;

7dinsdag 9 november 2010

Page 12: µServices

int global;int shared;int local;

Func

tions

void foo() { global = shared; for (local=0; local<10; local++) shared *= 10;}

8dinsdag 9 november 2010

Page 13: µServices

int global;int shared;int local;

Func

tions

void foo() { global = shared; for (local=0; local<10; local++) shared *= 10;}

8dinsdag 9 november 2010

Page 14: µServices

int global;int shared;int local;

Func

tions void foo() {

global = shared; for (local=0; local<10; local++) shared *= 10;}

void bar() { global = shared; for (local=0; local<10; local++) shared *= 10;}

9dinsdag 9 november 2010

Page 15: µServices

int global;int shared;

Func

tions

void foo() { int local global = shared; for (local=0; local<10; local++) shared *= 10;}

void bar() { int local; global = shared; for (local=0; local<10; local++) shared *= 10;}

10dinsdag 9 november 2010

Page 16: µServices

A

int global;int shared;

Mod

ules

B

void foo() { int local global = shared; for (local=0; local<10; local++) shared *= 10;}

void bar() { int local global = shared; for (local=0; local<10; local++) shared *= 10;}

void foo() { int local global = shared; for (local=0; local<10; local++) shared *= 10;}

void xyz() { int local global = shared; for (local=0; local<10; local++) shared *= 10;}

11dinsdag 9 november 2010

Page 17: µServices

A

int global;int shared;

Mod

ules

B

void foo() { int local global = shared; for (local=0; local<10; local++) shared *= 10;}

void bar() { int local global = shared; for (local=0; local<10; local++) shared *= 10;}

void foo() { int local global = shared; for (local=0; local<10; local++) shared *= 10;}

void xyz() { int local global = shared; for (local=0; local<10; local++) shared *= 10;}

11dinsdag 9 november 2010

Page 18: µServices

A

int global;

Mod

ules

B

int shared;

int shared;

void foo() { int local global = shared; for (local=0; local<10; local++) shared *= 10;}

void bar() { int local global = shared; for (local=0; local<10; local++) shared *= 10;}

void foo() { int local global = shared; for (local=0; local<10; local++) shared *= 10;}

void xyz() { int local global = shared; for (local=0; local<10; local++) shared *= 10;}

12dinsdag 9 november 2010

Page 19: µServices

Class A

Obj

ects

Class B

int shared;

int shared;

1

n

void foo() { int local global = shared; for (local=0; local<10; local++) shared *= 10;}

void bar() { int local global = shared; for (local=0; local<10; local++) shared *= 10;}

void foo() { int local global = shared; for (local=0; local<10; local++) shared *= 10;}

void xyz() { int local global = shared; for (local=0; local<10; local++) shared *= 10;}

13dinsdag 9 november 2010

Page 20: µServices

Class A

Obj

ects

Class B

int shared;

int shared;

1

n

void foo() { int local global = shared; for (local=0; local<10; local++) shared *= 10;}

void bar() { int local global = shared; for (local=0; local<10; local++) shared *= 10;}

void foo() { int local global = shared; for (local=0; local<10; local++) shared *= 10;}

void xyz() { int local global = shared; for (local=0; local<10; local++) shared *= 10;}

13dinsdag 9 november 2010

Page 21: µServices

com.acme.abc

Pack

ages

com.acme.def

Class A int shared;

void foo() { int local global = shared; for (local=0; local<10; local++) shared *= 10;}

void bar() { int local global = shared; for (local=0; local<10; local++) shared *= 10;}

Class B int shared;

void foo() { int local global = shared; for (local=0; local<10; local++) shared *= 10;}

void xyz() { int local global = shared; for (local=0; local<10; local++) shared *= 10;}

Class A int shared;

void foo() { int local global = shared; for (local=0; local<10; local++) shared *= 10;}

void bar() { int local global = shared; for (local=0; local<10; local++) shared *= 10;}

Class C int shared;

void foo() { int local global = shared; for (local=0; local<10; local++) shared *= 10;}

void xyz() { int local global = shared; for (local=0; local<10; local++) shared *= 10;}

14dinsdag 9 november 2010

Page 22: µServices

com.acme.abc

Pack

ages

com.acme.def

Class A int shared;

void foo() { int local global = shared; for (local=0; local<10; local++) shared *= 10;}

void bar() { int local global = shared; for (local=0; local<10; local++) shared *= 10;}

Class B int shared;

void foo() { int local global = shared; for (local=0; local<10; local++) shared *= 10;}

void xyz() { int local global = shared; for (local=0; local<10; local++) shared *= 10;}

Class A int shared;

void foo() { int local global = shared; for (local=0; local<10; local++) shared *= 10;}

void bar() { int local global = shared; for (local=0; local<10; local++) shared *= 10;}

Class C int shared;

void foo() { int local global = shared; for (local=0; local<10; local++) shared *= 10;}

void xyz() { int local global = shared; for (local=0; local<10; local++) shared *= 10;}

14dinsdag 9 november 2010

Page 23: µServices

“Chapter 7 describes the structure of a program which is organized into packages

similar to the modules of Modula.”

Java Language Specification, 3rd edition

15dinsdag 9 november 2010

Page 24: µServices

abc-1.2.3-SNAPSHOT.jar

JARs

com.acme.abcClass A int shared;

void foo() { int local global = shared; for (local=0; local<10; local++) shared *= 10;}

void bar() { int local global = shared; for (local=0; local<10; local++) shared *= 10;}

Class B int shared;

void foo() { int local global = shared; for (local=0; local<10; local++) shared *= 10;}

void xyz() { int local global = shared; for (local=0; local<10; local++) shared *= 10;}

com.acme.defClass A int shared;

void foo() { int local global = shared; for (local=0; local<10; local++) shared *= 10;}

void bar() { int local global = shared; for (local=0; local<10; local++) shared *= 10;}

Class B int shared;

void foo() { int local global = shared; for (local=0; local<10; local++) shared *= 10;}

void xyz() { int local global = shared; for (local=0; local<10; local++) shared *= 10;}

def-4.5.6.jar

com.acme.abcClass A int shared;

void foo() { int local global = shared; for (local=0; local<10; local++) shared *= 10;}

void bar() { int local global = shared; for (local=0; local<10; local++) shared *= 10;}

Class B int shared;

void foo() { int local global = shared; for (local=0; local<10; local++) shared *= 10;}

void xyz() { int local global = shared; for (local=0; local<10; local++) shared *= 10;}

com.acme.ghiClass A int shared;

void foo() { int local global = shared; for (local=0; local<10; local++) shared *= 10;}

void bar() { int local global = shared; for (local=0; local<10; local++) shared *= 10;}

Class B int shared;

void foo() { int local global = shared; for (local=0; local<10; local++) shared *= 10;}

void xyz() { int local global = shared; for (local=0; local<10; local++) shared *= 10;}

16dinsdag 9 november 2010

Page 25: µServices

abc-1.2.3-SNAPSHOT.jar

JARs

com.acme.abcClass A int shared;

void foo() { int local global = shared; for (local=0; local<10; local++) shared *= 10;}

void bar() { int local global = shared; for (local=0; local<10; local++) shared *= 10;}

Class B int shared;

void foo() { int local global = shared; for (local=0; local<10; local++) shared *= 10;}

void xyz() { int local global = shared; for (local=0; local<10; local++) shared *= 10;}

com.acme.defClass A int shared;

void foo() { int local global = shared; for (local=0; local<10; local++) shared *= 10;}

void bar() { int local global = shared; for (local=0; local<10; local++) shared *= 10;}

Class B int shared;

void foo() { int local global = shared; for (local=0; local<10; local++) shared *= 10;}

void xyz() { int local global = shared; for (local=0; local<10; local++) shared *= 10;}

def-4.5.6.jar

com.acme.abcClass A int shared;

void foo() { int local global = shared; for (local=0; local<10; local++) shared *= 10;}

void bar() { int local global = shared; for (local=0; local<10; local++) shared *= 10;}

Class B int shared;

void foo() { int local global = shared; for (local=0; local<10; local++) shared *= 10;}

void xyz() { int local global = shared; for (local=0; local<10; local++) shared *= 10;}

com.acme.ghiClass A int shared;

void foo() { int local global = shared; for (local=0; local<10; local++) shared *= 10;}

void bar() { int local global = shared; for (local=0; local<10; local++) shared *= 10;}

Class B int shared;

void foo() { int local global = shared; for (local=0; local<10; local++) shared *= 10;}

void xyz() { int local global = shared; for (local=0; local<10; local++) shared *= 10;}

16dinsdag 9 november 2010

Page 26: µServices

com.acme.abc-1.2.3

Bund

les com.acme.abc

Class A int shared;

void foo() { int local global = shared; for (local=0; local<10; local++) shared *= 10;}

void bar() { int local global = shared; for (local=0; local<10; local++) shared *= 10;}

Class B int shared;

void foo() { int local global = shared; for (local=0; local<10; local++) shared *= 10;}

void xyz() { int local global = shared; for (local=0; local<10; local++) shared *= 10;}

com.acme.def-9.9.1

com.acme.abcClass A int shared;

void foo() { int local global = shared; for (local=0; local<10; local++) shared *= 10;}

void bar() { int local global = shared; for (local=0; local<10; local++) shared *= 10;}

Class B int shared;

void foo() { int local global = shared; for (local=0; local<10; local++) shared *= 10;}

void xyz() { int local global = shared; for (local=0; local<10; local++) shared *= 10;}

com.acme.defClass A int shared;

void foo() { int local global = shared; for (local=0; local<10; local++) shared *= 10;}

void bar() { int local global = shared; for (local=0; local<10; local++) shared *= 10;}

Class B int shared;

void foo() { int local global = shared; for (local=0; local<10; local++) shared *= 10;}

void xyz() { int local global = shared; for (local=0; local<10; local++) shared *= 10;}

com.acme.ghiClass A int shared;

void foo() { int local global = shared; for (local=0; local<10; local++) shared *= 10;}

void bar() { int local global = shared; for (local=0; local<10; local++) shared *= 10;}

Class B int shared;

void foo() { int local global = shared; for (local=0; local<10; local++) shared *= 10;}

void xyz() { int local global = shared; for (local=0; local<10; local++) shared *= 10;}

17dinsdag 9 november 2010

Page 27: µServices

com.acme.abc-1.2.3

Bund

les com.acme.abc

Class A int shared;

void foo() { int local global = shared; for (local=0; local<10; local++) shared *= 10;}

void bar() { int local global = shared; for (local=0; local<10; local++) shared *= 10;}

Class B int shared;

void foo() { int local global = shared; for (local=0; local<10; local++) shared *= 10;}

void xyz() { int local global = shared; for (local=0; local<10; local++) shared *= 10;}

com.acme.def-9.9.1

com.acme.abcClass A int shared;

void foo() { int local global = shared; for (local=0; local<10; local++) shared *= 10;}

void bar() { int local global = shared; for (local=0; local<10; local++) shared *= 10;}

Class B int shared;

void foo() { int local global = shared; for (local=0; local<10; local++) shared *= 10;}

void xyz() { int local global = shared; for (local=0; local<10; local++) shared *= 10;}

com.acme.defClass A int shared;

void foo() { int local global = shared; for (local=0; local<10; local++) shared *= 10;}

void bar() { int local global = shared; for (local=0; local<10; local++) shared *= 10;}

Class B int shared;

void foo() { int local global = shared; for (local=0; local<10; local++) shared *= 10;}

void xyz() { int local global = shared; for (local=0; local<10; local++) shared *= 10;}

com.acme.ghiClass A int shared;

void foo() { int local global = shared; for (local=0; local<10; local++) shared *= 10;}

void bar() { int local global = shared; for (local=0; local<10; local++) shared *= 10;}

Class B int shared;

void foo() { int local global = shared; for (local=0; local<10; local++) shared *= 10;}

void xyz() { int local global = shared; for (local=0; local<10; local++) shared *= 10;}

Private Exported

Private Exported

17dinsdag 9 november 2010

Page 28: µServices

The Face of Modularity

18dinsdag 9 november 2010

Page 29: µServices

The Face of Modularity

18dinsdag 9 november 2010

Page 30: µServices

Archetype of Modularity

EXPORT

IMPORT

PRIVATE

EXPORT

IMPORT

PRIVATE

19dinsdag 9 november 2010

Page 31: µServices

A B

C D

• modules have a private space and share a public space

• modules limit their visibility and exposure

• From geometric to linear complexity

Modularity’s Secret

20dinsdag 9 november 2010

Page 32: µServices

A B

C D

• modules have a private space and share a public space

• modules limit their visibility and exposure

• From geometric to linear complexity

Modularity’s Secret

Pub

20dinsdag 9 november 2010

Page 33: µServices

A B

C D

• modules have a private space and share a public space

• modules limit their visibility and exposure

• From geometric to linear complexity

Modularity’s Secret

Pub

20dinsdag 9 november 2010

Page 34: µServices

A B

C D

• Modules require other modules

• Dependencies are transitive

• A → C → D

Coupling

Pub

21dinsdag 9 november 2010

Page 35: µServices

A B

C D

• Modules require other modules

• Dependencies are transitive

• A → C → D

Coupling

Pub

21dinsdag 9 november 2010

Page 36: µServices

Evolution• Modularization is about minimizing the changes

need to support the evolution of itself and its dependencies.

• Module change should only be required for:

• New functionality

• An embedded assumption is violated

• Ergo: assumptions about other modules should be minimized

22dinsdag 9 november 2010

Page 37: µServices

What Happens WhenYou’re Inflexible?

23dinsdag 9 november 2010

Page 38: µServices

Things break ...

24dinsdag 9 november 2010

Page 39: µServices

Inflexibility!

25dinsdag 9 november 2010

Page 40: µServices

Module friction is: Depending on hard to maintain assumptions about other modules

26dinsdag 9 november 2010

Page 41: µServices

Module Friction

A

B

27dinsdag 9 november 2010

Page 42: µServices

Module Friction

A

B

27dinsdag 9 november 2010

Page 43: µServices

Why Break A?

A

B

CA

B

28dinsdag 9 november 2010

Page 44: µServices

Why Break A?

A

B

CA

B

28dinsdag 9 november 2010

Page 45: µServices

Module Friction

A

B

29dinsdag 9 november 2010

Page 46: µServices

Because we can … ?

30dinsdag 9 november 2010

Page 47: µServices

POJO Programming is Best Practice

31dinsdag 9 november 2010

Page 48: µServices

Interfaces/API

Con-sumer ProviderInterface

32dinsdag 9 november 2010

Page 49: µServices

Access to Impls.

Con-sumer ProviderInterface

33dinsdag 9 november 2010

Page 50: µServices

Access to Impls.

Con-sumer ProviderInterface

X33dinsdag 9 november 2010

Page 51: µServices

Factory Pattern

Con-sumer ProviderInterface

FactoryClass

uses

Active Passive

impls

34dinsdag 9 november 2010

Page 52: µServices

Factory Pattern

Con-sumer ProviderInterface

FactoryClass

uses

Active Passive

impls

?34dinsdag 9 november 2010

Page 53: µServices

Listener Pattern

Con-sumer ProviderInterface

ProviderAdmin

Interface

Passive Active

impls uses

impls

35dinsdag 9 november 2010

Page 54: µServices

Dependency Injection

Con-sumer ProviderInterface

Depen-dency

Injection

Passive Passive

36dinsdag 9 november 2010

Page 55: µServices

Patterns

Passive Active

PassiveDependency

InjectionListener

Active Factory ?Consum

er

Provider

37dinsdag 9 november 2010

Page 56: µServices

?

Con-sumer ProviderInterface

?

Active Active

38dinsdag 9 november 2010

Page 57: µServices

Patterns

Passive Active

Passive DependencyInjection

Listener

Active Factory ?Consum

er

Provider

39dinsdag 9 november 2010

Page 58: µServices

Patterns

Passive Active

Passive

ActiveConsum

er

Provider

40dinsdag 9 november 2010

Page 59: µServices

µServices

Con-sumer ProviderInterface

OSGiµServices

Active Active

41dinsdag 9 november 2010

Page 60: µServices

Module Friction?

42dinsdag 9 november 2010

Page 61: µServices

Module Friction?

Speak

42dinsdag 9 november 2010

Page 62: µServices

Module Friction?

Talker MacSpeakSpeak

42dinsdag 9 november 2010

Page 63: µServices

Module Friction

Talker SpeakMac

Speak

43dinsdag 9 november 2010

Page 64: µServices

Services

TalkerMac

SpeakSpeak

44dinsdag 9 november 2010

Page 65: µServices

Basic

TalkerMac

Speak

45dinsdag 9 november 2010

Page 66: µServices

aQute.service.speak

Basic

TalkerMac

Speak

public interface Speak { void say(String s); }

45dinsdag 9 november 2010

Page 67: µServices

aQute.service.speak

Basic

TalkerMac

Speak

public interface Speak { void say(String s); }

1. Register a SpeakImplinstance

45dinsdag 9 november 2010

Page 68: µServices

aQute.service.speak

Basic

TalkerMac

Speak

public interface Speak { void say(String s); }

1. Register a SpeakImplinstance

2. notify

45dinsdag 9 november 2010

Page 69: µServices

aQute.service.speak

Basic

TalkerMac

Speak

public interface Speak { void say(String s); }

1. Register a SpeakImplinstance

3. Get a Speakinstance

2. notify

45dinsdag 9 november 2010

Page 70: µServices

aQute.service.speak

Basic

TalkerMac

Speak

public interface Speak { void say(String s); }

1. Register a SpeakImplinstance

3. Get a Speakinstance

4. instance.say(“Hello”)

2. notify

45dinsdag 9 november 2010

Page 71: µServices

All Good

• The provider creates the instance

• Life cycle control in the hands of the implementer

• No Statics

• Full context defined by implementer

• Type Safe

• Discovery by User

46dinsdag 9 november 2010

Page 72: µServices

Services

UserImple-menterS

47dinsdag 9 november 2010

Page 73: µServices

Services

UserImple-menterS register

47dinsdag 9 november 2010

Page 74: µServices

Services

UserImple-menterSget register

47dinsdag 9 november 2010

Page 75: µServices

Services

UserImple-menterSget register

ServiceListener

servicelistener

47dinsdag 9 november 2010

Page 76: µServices

Services

UserImple-menterSget register

ServiceHooker

ServiceListener

service hooks

servicelistener

47dinsdag 9 november 2010

Page 77: µServices

Cardinality

UserImple-menterS

ServiceHooker

ServiceListener

n m m n nn

n

m

m

n

48dinsdag 9 november 2010

Page 78: µServices

Factory Pattern

Con-sumer Provider

Active Passive

49dinsdag 9 november 2010

Page 79: µServices

Listener Pattern

Con-sumer Provider

Passive Active

50dinsdag 9 november 2010

Page 80: µServices

Dependency Pattern

DependsOn B

A

C

51dinsdag 9 november 2010

Page 81: µServices

Discovery Pattern

Discovers B

A

C

52dinsdag 9 november 2010

Page 82: µServices

Variations

Talker MacSpeak

Speak

ShellConsoleShell

Command

ServletWeb

Console

Jetty

HttpServer

53dinsdag 9 november 2010

Page 83: µServices

The new Shell

CommandProcessor

AggregateConverter

Thread IO

AggregateFormatter

Formatter

Converter…

Handler

…Commands

ThreadIO

osgi.command.scope=…osgi.command.function=...

CommandProcessor

AggregateConverter

AggregateFormatter

Formatter

Converter

54dinsdag 9 november 2010

Page 84: µServices

Distributed OSGi

DistributionProvider

DistributionProvider

X’

BundleB

Framework 1 Framework 2

55dinsdag 9 november 2010

Page 85: µServices

Distributed OSGi

XDistribution

ProviderDistribution

Provider

X’

BundleB

Framework 1 Framework 2

55dinsdag 9 november 2010

Page 86: µServices

Distributed OSGiBundle

A

XDistribution

ProviderDistribution

Provider

X’

BundleB

Framework 1 Framework 2

55dinsdag 9 november 2010

Page 87: µServices

Distributed OSGiBundle

A

XDistribution

ProviderDistribution

Provider

X’

BundleB

Framework 1 Framework 2

55dinsdag 9 november 2010

Page 88: µServices

Distributed OSGiBundle

A

XDistribution

ProviderDistribution

Provider

X’

BundleB

Framework 1 Framework 2

55dinsdag 9 november 2010

Page 89: µServices

Distributed OSGiBundle

A

XDistribution

ProviderDistribution

Provider

X’

BundleB

exportsservice

Framework 1 Framework 2

55dinsdag 9 november 2010

Page 90: µServices

Distributed OSGiBundle

A

XDistribution

ProviderDistribution

Provider

X’

BundleB

exportsservice

Framework 1 Framework 2

55dinsdag 9 november 2010

Page 91: µServices

Distributed OSGiBundle

A

XDistribution

ProviderDistribution

Provider

X’

BundleB

exportsservice

Framework 1 Framework 2

55dinsdag 9 november 2010

Page 92: µServices

Distributed OSGiBundle

A

XDistribution

ProviderDistribution

Provider

X’

BundleB

exportsservice

Framework 1 Framework 2

55dinsdag 9 november 2010

Page 93: µServices

Distributed OSGiBundle

A

XDistribution

ProviderDistribution

Provider

X’

BundleB

exportsservice

importsservice

Framework 1 Framework 2

55dinsdag 9 november 2010

Page 94: µServices

Distributed OSGiBundle

A

XDistribution

ProviderDistribution

Provider

X’

BundleB

exportsservice

importsservice

Framework 1 Framework 2

55dinsdag 9 november 2010

Page 95: µServices

Distributed OSGiBundle

A

XDistribution

ProviderDistribution

Provider

X’

BundleB

exportsservice

importsservice

Framework 1 Framework 2

55dinsdag 9 november 2010

Page 96: µServices

Distributed OSGiBundle

A

XDistribution

ProviderDistribution

Provider

X’

BundleB

exportsservice

importsservice

Framework 1 Framework 2

55dinsdag 9 november 2010

Page 97: µServices

Distributed OSGiBundle

A

XDistribution

ProviderDistribution

Provider

X’

BundleB

exportsservice

importsservice

Framework 1 Framework 2

55dinsdag 9 november 2010

Page 98: µServices

56dinsdag 9 november 2010

Page 99: µServices

57dinsdag 9 november 2010

Page 100: µServices

Conclusion

• µServices are a primitive for:

• dependency handling

• dynamics

• discovery

• hiding the implementations

• µServices provide a primitive solution to common software problems

• µServices require virtually no code to handle

58dinsdag 9 november 2010

Page 101: µServices

ConclusionA B C

D ? E

F G H

59dinsdag 9 november 2010

Page 102: µServices

ConclusionA B C

D ? E

F G H

59dinsdag 9 november 2010

Page 103: µServices

ConclusionB C

D ? E

F G H

A

60dinsdag 9 november 2010

Page 104: µServices

ConclusionB C

D ? E

F G H

A

60dinsdag 9 november 2010

Page 105: µServices

ConclusionB C

D ? E

F G H

A

60dinsdag 9 november 2010

Page 106: µServices

Conclusion

D

C

F G

A B

E

H

D

61dinsdag 9 november 2010

Page 107: µServices

Conclusion

D

C

F G

A B

E

H

Yes!D

61dinsdag 9 november 2010

Page 108: µServices

Conclusion

D

C

F G

A B

E

H

Yes!D

X

61dinsdag 9 november 2010

Page 109: µServices

Q&A

Masterclass on OSGiwww.aqute.biz/MasterClass

USA Bay Area18-21 January 2011

OSGi DevConwww.osgi.org/DevCon2011

Santa Clara, CA21-24 March 2011

62dinsdag 9 november 2010