43
Styles of Application Integration Using Spring Bruce Snyder, Senior Software Engineer, SpringSource/VMware Friday, July 15, 2011

Styles of Applicaton Integration Using Spring

Embed Size (px)

DESCRIPTION

 

Citation preview

Page 1: Styles of Applicaton Integration Using Spring

Styles of Application Integration Using Spring

Bruce Snyder, Senior Software Engineer, SpringSource/VMware

Friday, July 15, 2011

Page 2: Styles of Applicaton Integration Using Spring

Integrations Are About Coupling

2

Friday, July 15, 2011

Page 3: Styles of Applicaton Integration Using Spring

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

Page 4: Styles of Applicaton Integration Using Spring

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

Page 5: Styles of Applicaton Integration Using Spring

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

Page 6: Styles of Applicaton Integration Using Spring

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

Page 7: Styles of Applicaton Integration Using Spring

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

Page 8: Styles of Applicaton Integration Using Spring

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

Page 9: Styles of Applicaton Integration Using Spring

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

Page 10: Styles of Applicaton Integration Using Spring

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

Page 11: Styles of Applicaton Integration Using Spring

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

Page 12: Styles of Applicaton Integration Using Spring

Enterprise Integration Patterns (EIP)

12

http://enterpriseintegrationpatterns.com/

Friday, July 15, 2011

Page 13: Styles of Applicaton Integration Using Spring

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

Page 14: Styles of Applicaton Integration Using Spring

Spring Integration

• Supports – AMQP– Email– File system – Gemfire– JMS– JMX– MongoDB– Redis– Spring Batch – Testing – Web Services

14

Friday, July 15, 2011

Page 15: Styles of Applicaton Integration Using Spring

Spring Integration

15

Friday, July 15, 2011

Page 16: Styles of Applicaton Integration Using Spring

Spring Integration

16

Friday, July 15, 2011

Page 17: Styles of Applicaton Integration Using Spring

Spring Integration

17

Friday, July 15, 2011

Page 18: Styles of Applicaton Integration Using Spring

Spring Integration

18

Friday, July 15, 2011

Page 19: Styles of Applicaton Integration Using Spring

Spring Integration

19

Friday, July 15, 2011

Page 20: Styles of Applicaton Integration Using Spring

Spring Integration

20

Friday, July 15, 2011

Page 21: Styles of Applicaton Integration Using Spring

Spring Integration

21

Friday, July 15, 2011

Page 22: Styles of Applicaton Integration Using Spring

Spring Integration

22

Friday, July 15, 2011

Page 23: Styles of Applicaton Integration Using Spring

Spring Integration

23

Friday, July 15, 2011

Page 24: Styles of Applicaton Integration Using Spring

Spring Integration

24

Friday, July 15, 2011

Page 25: Styles of Applicaton Integration Using Spring

Types of Integration

• Intra-application integration • Inter-application integration • External system integration

25

Friday, July 15, 2011

Page 26: Styles of Applicaton Integration Using Spring

Typical Application Layers

26

Friday, July 15, 2011

Page 27: Styles of Applicaton Integration Using Spring

Intra-Application Integration

27

Friday, July 15, 2011

Page 28: Styles of Applicaton Integration Using Spring

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

Page 29: Styles of Applicaton Integration Using Spring

Intra-Application Integration

29

Friday, July 15, 2011

Page 30: Styles of Applicaton Integration Using Spring

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

Page 31: Styles of Applicaton Integration Using Spring

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

Page 32: Styles of Applicaton Integration Using Spring

32

Friday, July 15, 2011

Page 33: Styles of Applicaton Integration Using Spring

Inter-Application Integration

33

Friday, July 15, 2011

Page 34: Styles of Applicaton Integration Using Spring

Inter-Application Integration

34

Friday, July 15, 2011

Page 35: Styles of Applicaton Integration Using Spring

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

Page 36: Styles of Applicaton Integration Using Spring

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

Page 37: Styles of Applicaton Integration Using Spring

37

Friday, July 15, 2011

Page 38: Styles of Applicaton Integration Using Spring

External System Integration

38

Friday, July 15, 2011

Page 39: Styles of Applicaton Integration Using Spring

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

Page 40: Styles of Applicaton Integration Using Spring

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

Page 41: Styles of Applicaton Integration Using Spring

41

Friday, July 15, 2011

Page 42: Styles of Applicaton Integration Using Spring

Combined Integration

42

Friday, July 15, 2011

Page 43: Styles of Applicaton Integration Using Spring

Q&A

Thank You!

Friday, July 15, 2011