Upload
bruce-snyder
View
2.217
Download
3
Tags:
Embed Size (px)
DESCRIPTION
Citation preview
Styles of Application Integration Using Spring
Bruce Snyder, Senior Software Engineer, SpringSource/VMware
Friday, July 15, 2011
Integrations Are About Coupling
2
Friday, July 15, 2011
Where Coupling Exists, Concerns Arise
• Tight coupling is easy • Loose coupling can be difficult
• Tight coupling causes issues in the long run • Loose coupling pays off in the long run
• Integrations are usually tightly coupled • Integrations should be loosely coupled
• Integrations are commonly addressed using commands • Integrations should be addressed using events
Friday, July 15, 2011
What is Coupling?
• Given two lines of code, A and B, they are coupled when B must change behavior only because A changed
4
“... the degree to which each program module relies on each one of the other modules” (Wikipedia.com)
Friday, July 15, 2011
Characteristics Tight Coupling
• Components are highly dependent upon one another• Components are directly linked • Changes in one component cause a ripple effect • Less reusability • More difficult to maintain • Does not handle unforeseen change well
• Examples– Clients designed to interact only with specific systems – Use of proprietary APIs or commands for interaction – Components designed to work specifically with other
components
5
Friday, July 15, 2011
Characteristics of Loose Coupling
• Components have little or no knowledge of one another • Components are not directly linked to one another • Changes in one component do not affect other components • Increased reusability • Easier to maintain • More easily handles unforeseen changes
• Examples– Dependence upon interfaces instead of concrete classes – Use of DI encourages looser coupling – A design using a level of indirection
6
Friday, July 15, 2011
Tight Coupling is Easy
• App design with tight coupling is more widely understood• App development with tight coupling requires less time • Debugging a tightly coupled app is easier • Benefits of tight coupling are seen immediately • Tightly coupled prototypes commonly live on
7
Friday, July 15, 2011
Loose Coupling is Difficult
• App design with loose coupling is not widely understood• App development with loosely coupling requires more
thought and more time• Debugging loosely coupled apps is different • Benefits of loose coupling are only seen over time
8
Friday, July 15, 2011
Integrations and Coupling
• But it’s easy to write a point-to-point, one-off piece of code for integration!
• Too many disadvantages – Difficult to maintain – No reusability – Every integration is unique – Bites you over time
9
Friday, July 15, 2011
Integrations and Coupling
• But designing integrations to be loosely coupled requires too much work!
• With the right knowledge and preparation, it doesn’t need to be this way
10
Friday, July 15, 2011
Commands vs. Events
• Commands are not natural – Verify credit card
• Commands are too specific
• Events are natural – Order received
• Events are more broad • Events are what happen in the real world
11
Friday, July 15, 2011
Enterprise Integration Patterns (EIP)
12
http://enterpriseintegrationpatterns.com/
Friday, July 15, 2011
Spring Integration
• Provides both concurrency and messaging– Message Endpoints
• Connections between services – Channel Adapters
• Adapter between application and message broker – Messaging Gateways
• Provides uni-directional or bi-directional messaging – Service Activators
• Invokes a services based on an incoming message – Routers
• Determines where to dispatch a message – Splitters and Aggregators
• Breaks up a message and reassembles it after processing
13
Friday, July 15, 2011
Spring Integration
• Supports – AMQP– Email– File system – Gemfire– JMS– JMX– MongoDB– Redis– Spring Batch – Testing – Web Services
14
Friday, July 15, 2011
Spring Integration
15
Friday, July 15, 2011
Spring Integration
16
Friday, July 15, 2011
Spring Integration
17
Friday, July 15, 2011
Spring Integration
18
Friday, July 15, 2011
Spring Integration
19
Friday, July 15, 2011
Spring Integration
20
Friday, July 15, 2011
Spring Integration
21
Friday, July 15, 2011
Spring Integration
22
Friday, July 15, 2011
Spring Integration
23
Friday, July 15, 2011
Spring Integration
24
Friday, July 15, 2011
Types of Integration
• Intra-application integration • Inter-application integration • External system integration
25
Friday, July 15, 2011
Typical Application Layers
26
Friday, July 15, 2011
Intra-Application Integration
27
Friday, July 15, 2011
Spring Integration Config
28
<int:gateway id="sender" service-interface="org.bsnyder.spring.integration.simple.Sender"/>
<int:channel id="orderReceived"/>
<int:service-activator input-channel="orderReceived" ref="receiver" method="receive" />
<bean id="receiver" class="org.bsnyder.spring.integration.simple.Receiver"/>
Friday, July 15, 2011
Intra-Application Integration
29
Friday, July 15, 2011
Spring Integration Config
30
<int:gateway id="sender" service-interface="org.bsnyder.spring.integration.appa.Sender"/>
<channel id="orderReceived" />
<amqp:outbound-channel-adapter channel="orderReceived" exchange-name="order.received.exchange" routing-key="order.received.binding" amqp-template="amqpTemplate" />
<rabbit:connection-factory id="connectionFactory" /><rabbit:template id="amqpTemplate" connection-factory="connectionFactory" /><rabbit:admin connection-factory="connectionFactory" /><rabbit:queue name="order.received.queue" /><rabbit:direct-exchange name="order.received.exchange"> <rabbit:bindings> <rabbit:binding queue="order.received.queue" key="order.received.binding" /> </rabbit:bindings></rabbit:direct-exchange>
Friday, July 15, 2011
Spring Integration Config
31
<amqp:inbound-channel-adapter channel="orderReceived" queue-names="order.received.queue" connection-factory="connectionFactory" />
<int:service-activator input-channel="orderReceived" ref="receiver" method="receive" /> <bean id="receiver" class="org.bsnyder.spring.integration.appa.Receiver"/>
<rabbit:connection-factory id="connectionFactory" /><rabbit:template id="amqpTemplate" connection-factory="connectionFactory" /><rabbit:admin connection-factory="connectionFactory" /><rabbit:queue name="order.received.queue" /><rabbit:direct-exchange name="order.received.exchange"> <rabbit:bindings> <rabbit:binding queue="order.received.queue" key="order.received.binding" /> </rabbit:bindings></rabbit:direct-exchange>
Friday, July 15, 2011
32
Friday, July 15, 2011
Inter-Application Integration
33
Friday, July 15, 2011
Inter-Application Integration
34
Friday, July 15, 2011
Spring Integration Config
35
<int:gateway id="sender" service-interface="org.bsnyder.spring.integration.appa.Sender"/>
<channel id="orderReceived" />
<amqp:outbound-channel-adapter channel="orderReceived" exchange-name="order.received.exchange" routing-key="order.received.binding" amqp-template="amqpTemplate" />
<rabbit:connection-factory id="connectionFactory" /><rabbit:template id="amqpTemplate" connection-factory="connectionFactory" /><rabbit:admin connection-factory="connectionFactory" /><rabbit:queue name="order.received.queue" /><rabbit:direct-exchange name="order.received.exchange"> <rabbit:bindings> <rabbit:binding queue="order.received.queue" key="order.received.binding" /> </rabbit:bindings></rabbit:direct-exchange>
Friday, July 15, 2011
Spring Integration Config
36
<amqp:inbound-channel-adapter channel="orderReceived" queue-names="order.received.queue" connection-factory="connectionFactory" />
<int:service-activator input-channel="orderReceived" ref="receiver" method="receive" /> <bean id="receiver" class="org.bsnyder.spring.integration.appb.Receiver"/>
<rabbit:connection-factory id="connectionFactory" /><rabbit:template id="amqpTemplate" connection-factory="connectionFactory" /><rabbit:admin connection-factory="connectionFactory" /><rabbit:queue name="order.received.queue" /><rabbit:direct-exchange name="order.received.exchange"> <rabbit:bindings> <rabbit:binding queue="order.received.queue" key="order.received.binding" /> </rabbit:bindings></rabbit:direct-exchange>
Friday, July 15, 2011
37
Friday, July 15, 2011
External System Integration
38
Friday, July 15, 2011
Spring Integration Config
39
<int:gateway id="sender" service-interface="org.bsnyder.spring.integration.appa.Sender"/>
<bean id="ftpClientFactory" class="org.springframework.integration.ftp.session.DefaultFtpSessionFactory" p:host" value="localhost" p:username" value="${user}" p:password="${password}"/>!<int:channel id="ftpChannel"/>
<int-ftp:outbound-channel-adapter id="ftpOutbound" channel="ftpChannel" remote-directory="/foo/bar/baz/" client-factory="ftpClientFactory"/>
Friday, July 15, 2011
Spring Integration Config
40
<int:channel id="ftpChannel"> <int:queue/></int:channel>
<bean id="ftpClientFactory" class="org.springframework.integration.ftp.session.DefaultFtpSessionFactory" p:host="localhost" p:username="${user}" p:password="${password}"/>!<int-ftp:inbound-channel-adapter id="ftpInbound" channel="ftpChannel" session-factory="ftpClientFactory" filename-regex=".*\.txt$" auto-create-local-directory="true" delete-remote-files="false" remote-directory="/foo/bar/baz/" local-directory="file:local-target-dir"> <int:poller fixed-rate="1000"/></int-ftp:inbound-channel-adapter>
<int:service-activator input-channel="ftpChannel" ref="receiver" method="receive" /> <bean id="receiver" class="org.bsnyder.spring.integration.appb.Receiver"/>
Friday, July 15, 2011
41
Friday, July 15, 2011
Combined Integration
42
Friday, July 15, 2011
Q&A
Thank You!
Friday, July 15, 2011