Upload
peter-kriens
View
2.325
Download
0
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
µServicesBy Peter Kriens
OSGi Technical Director & Evangelist
1dinsdag 9 november 2010
In the beginnings there were bits ...
2dinsdag 9 november 2010
01001111001100100000000011110000001000010001110010100000010011100010001101111110001000111011111011010010000100111010000001111110000010100000110111000010000011011010000000110010001000111010000001110110
Bits
3dinsdag 9 november 2010
01001111001100100000000011110000001000010001110010100000010011100010001101111110001000111011111011010010000100111010000001111110000010100000110111000010000011011010000000110010001000111010000001110110
Bits
3dinsdag 9 november 2010
117062000360041034240116043176043276322023240176012015302015240062043240166
Oct
al
4dinsdag 9 november 2010
4F32 00 F021 1C A04E237E23BED2 13 A07E0A0DC2 0D A032 23 A076
Hex
5dinsdag 9 november 2010
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
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
Code global = shared;
for (local=0; local<10; local++) shared *= 10;
7dinsdag 9 november 2010
Code global = shared;
for (local=0; local<10; local++) shared *= 10;
7dinsdag 9 november 2010
int global;int shared;int local;
Code global = shared;
for (local=0; local<10; local++) shared *= 10;
7dinsdag 9 november 2010
int global;int shared;int local;
Func
tions
void foo() { global = shared; for (local=0; local<10; local++) shared *= 10;}
8dinsdag 9 november 2010
int global;int shared;int local;
Func
tions
void foo() { global = shared; for (local=0; local<10; local++) shared *= 10;}
8dinsdag 9 november 2010
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
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
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
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
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
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
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
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
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
“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
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
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
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
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
The Face of Modularity
18dinsdag 9 november 2010
The Face of Modularity
18dinsdag 9 november 2010
Archetype of Modularity
EXPORT
IMPORT
PRIVATE
EXPORT
IMPORT
PRIVATE
19dinsdag 9 november 2010
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
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
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
A B
C D
• Modules require other modules
• Dependencies are transitive
• A → C → D
Coupling
Pub
21dinsdag 9 november 2010
A B
C D
• Modules require other modules
• Dependencies are transitive
• A → C → D
Coupling
Pub
21dinsdag 9 november 2010
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
What Happens WhenYou’re Inflexible?
23dinsdag 9 november 2010
Things break ...
24dinsdag 9 november 2010
Inflexibility!
25dinsdag 9 november 2010
Module friction is: Depending on hard to maintain assumptions about other modules
26dinsdag 9 november 2010
Module Friction
A
B
27dinsdag 9 november 2010
Module Friction
A
B
27dinsdag 9 november 2010
Why Break A?
A
B
CA
B
28dinsdag 9 november 2010
Why Break A?
A
B
CA
B
28dinsdag 9 november 2010
Module Friction
A
B
29dinsdag 9 november 2010
Because we can … ?
30dinsdag 9 november 2010
POJO Programming is Best Practice
31dinsdag 9 november 2010
Interfaces/API
Con-sumer ProviderInterface
32dinsdag 9 november 2010
Access to Impls.
Con-sumer ProviderInterface
33dinsdag 9 november 2010
Access to Impls.
Con-sumer ProviderInterface
X33dinsdag 9 november 2010
Factory Pattern
Con-sumer ProviderInterface
FactoryClass
uses
Active Passive
impls
34dinsdag 9 november 2010
Factory Pattern
Con-sumer ProviderInterface
FactoryClass
uses
Active Passive
impls
?34dinsdag 9 november 2010
Listener Pattern
Con-sumer ProviderInterface
ProviderAdmin
Interface
Passive Active
impls uses
impls
35dinsdag 9 november 2010
Dependency Injection
Con-sumer ProviderInterface
Depen-dency
Injection
Passive Passive
36dinsdag 9 november 2010
Patterns
Passive Active
PassiveDependency
InjectionListener
Active Factory ?Consum
er
Provider
37dinsdag 9 november 2010
?
Con-sumer ProviderInterface
?
Active Active
38dinsdag 9 november 2010
Patterns
Passive Active
Passive DependencyInjection
Listener
Active Factory ?Consum
er
Provider
39dinsdag 9 november 2010
Patterns
Passive Active
Passive
ActiveConsum
er
Provider
40dinsdag 9 november 2010
µServices
Con-sumer ProviderInterface
OSGiµServices
Active Active
41dinsdag 9 november 2010
Module Friction?
42dinsdag 9 november 2010
Module Friction?
Speak
42dinsdag 9 november 2010
Module Friction?
Talker MacSpeakSpeak
42dinsdag 9 november 2010
Module Friction
Talker SpeakMac
Speak
43dinsdag 9 november 2010
Services
TalkerMac
SpeakSpeak
44dinsdag 9 november 2010
Basic
TalkerMac
Speak
45dinsdag 9 november 2010
aQute.service.speak
Basic
TalkerMac
Speak
public interface Speak { void say(String s); }
45dinsdag 9 november 2010
aQute.service.speak
Basic
TalkerMac
Speak
public interface Speak { void say(String s); }
1. Register a SpeakImplinstance
45dinsdag 9 november 2010
aQute.service.speak
Basic
TalkerMac
Speak
public interface Speak { void say(String s); }
1. Register a SpeakImplinstance
2. notify
45dinsdag 9 november 2010
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
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
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
Services
UserImple-menterS
47dinsdag 9 november 2010
Services
UserImple-menterS register
47dinsdag 9 november 2010
Services
UserImple-menterSget register
47dinsdag 9 november 2010
Services
UserImple-menterSget register
ServiceListener
servicelistener
47dinsdag 9 november 2010
Services
UserImple-menterSget register
ServiceHooker
ServiceListener
service hooks
servicelistener
47dinsdag 9 november 2010
Cardinality
UserImple-menterS
ServiceHooker
ServiceListener
n m m n nn
n
m
m
n
48dinsdag 9 november 2010
Factory Pattern
Con-sumer Provider
Active Passive
49dinsdag 9 november 2010
Listener Pattern
Con-sumer Provider
Passive Active
50dinsdag 9 november 2010
Dependency Pattern
DependsOn B
A
C
51dinsdag 9 november 2010
Discovery Pattern
Discovers B
A
C
52dinsdag 9 november 2010
Variations
Talker MacSpeak
Speak
ShellConsoleShell
Command
ServletWeb
Console
Jetty
HttpServer
53dinsdag 9 november 2010
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
Distributed OSGi
DistributionProvider
DistributionProvider
X’
BundleB
Framework 1 Framework 2
55dinsdag 9 november 2010
Distributed OSGi
XDistribution
ProviderDistribution
Provider
X’
BundleB
Framework 1 Framework 2
55dinsdag 9 november 2010
Distributed OSGiBundle
A
XDistribution
ProviderDistribution
Provider
X’
BundleB
Framework 1 Framework 2
55dinsdag 9 november 2010
Distributed OSGiBundle
A
XDistribution
ProviderDistribution
Provider
X’
BundleB
Framework 1 Framework 2
55dinsdag 9 november 2010
Distributed OSGiBundle
A
XDistribution
ProviderDistribution
Provider
X’
BundleB
Framework 1 Framework 2
55dinsdag 9 november 2010
Distributed OSGiBundle
A
XDistribution
ProviderDistribution
Provider
X’
BundleB
exportsservice
Framework 1 Framework 2
55dinsdag 9 november 2010
Distributed OSGiBundle
A
XDistribution
ProviderDistribution
Provider
X’
BundleB
exportsservice
Framework 1 Framework 2
55dinsdag 9 november 2010
Distributed OSGiBundle
A
XDistribution
ProviderDistribution
Provider
X’
BundleB
exportsservice
Framework 1 Framework 2
55dinsdag 9 november 2010
Distributed OSGiBundle
A
XDistribution
ProviderDistribution
Provider
X’
BundleB
exportsservice
Framework 1 Framework 2
55dinsdag 9 november 2010
Distributed OSGiBundle
A
XDistribution
ProviderDistribution
Provider
X’
BundleB
exportsservice
importsservice
Framework 1 Framework 2
55dinsdag 9 november 2010
Distributed OSGiBundle
A
XDistribution
ProviderDistribution
Provider
X’
BundleB
exportsservice
importsservice
Framework 1 Framework 2
55dinsdag 9 november 2010
Distributed OSGiBundle
A
XDistribution
ProviderDistribution
Provider
X’
BundleB
exportsservice
importsservice
Framework 1 Framework 2
55dinsdag 9 november 2010
Distributed OSGiBundle
A
XDistribution
ProviderDistribution
Provider
X’
BundleB
exportsservice
importsservice
Framework 1 Framework 2
55dinsdag 9 november 2010
Distributed OSGiBundle
A
XDistribution
ProviderDistribution
Provider
X’
BundleB
exportsservice
importsservice
Framework 1 Framework 2
55dinsdag 9 november 2010
56dinsdag 9 november 2010
57dinsdag 9 november 2010
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
ConclusionA B C
D ? E
F G H
59dinsdag 9 november 2010
ConclusionA B C
D ? E
F G H
59dinsdag 9 november 2010
ConclusionB C
D ? E
F G H
A
60dinsdag 9 november 2010
ConclusionB C
D ? E
F G H
A
60dinsdag 9 november 2010
ConclusionB C
D ? E
F G H
A
60dinsdag 9 november 2010
Conclusion
D
C
F G
A B
E
H
D
61dinsdag 9 november 2010
Conclusion
D
C
F G
A B
E
H
Yes!D
61dinsdag 9 november 2010
Conclusion
D
C
F G
A B
E
H
Yes!D
X
61dinsdag 9 november 2010
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