The Spring Experience Spring Remoting
The Spring Experience Spring Remoting
The Spring Experience Spring Remoting
Web Layer
JVM JSPs / Velocity & Spring MVC / JSF / Struts
JVM
Data access objects
Scalability of an application (2)
Web Layer
JSPs / Velocity & Spring MVC / JSF / Struts
Service objects
Web Layer
JSPs / Velocity & Spring MVC / JSF / Struts
Data access objects
Service objects
Web Layer
Data access
JSPs /objects
Velocity & Spring MVC / JSF / Struts
Service objects
Infrastructure
SHOULD NOT
influence architecture
Clients of the service objects
Service objects
ApplicationContext ApplicationContext
(order-servlet.xml) (order-servlet-remote.xml)
ApplicationContext
(services.xml)
<<InventoryService>>
InventoryServiceImpl
Spring Remoting
Seamless remote access to your
middle-tier services
Marshalling and unmarshalling of
Method arguments
Return values
Any exceptions thrown
General concepts
(Remote) Exporters
Create endpoints for remote clients
Manage registries
(Remote) ProxyFactoryBeans
Create proxies for remote clients to use
Using service interface (InventoryService)
Example: remoting on the server
InventoryService
ProductDao StockDao
middle-tier-context.xml
Servlet container
Example: remoting on the client
Client of
InventoryService
Proxy to
InventoryService
Client VM
<<InventoryService>>
Remote server
Example configuration on the server
<bean name=“/inventoryService.html”
class=“org.sprfr.remoting.httpinvoker.HttpInvokerServiceExporter”>
<property name=“serviceInterface” value=“example.InventoryService”/>
<property name=“service” ref=“inventoryService”/>
</bean>
inventory-remote-servlet.xml
Protocols
Hessian
Lightweight binary protocol by Caucho
HTTP-based
Uses custom serialization mechanism
Support for several platforms
PHP / Python / C++ / C# / Ruby / Java
Problematic when using for example
Hibernate lazy loading without OSIV
HessianServiceExporter
HessianProxyFactoryBean
Burlap
XML-based lightweight protocol (Caucho)
HTTP-based
Uses custom serialization mechanism
Known support only for Java
Problematic when using for example
Hibernate lazy loading without OSIV
Spring HttpInvoker
Spring-based Java-to-Java remoting
HTTP-based
Uses Java serialization just like RMI
Easy to setup
(no HTTP tunneling as with RMI)
HttpInvokerServiceExporter
HttpInvokerProxyFactoryBean
RMI
Plain-and-simple RMI
With some additions:
Converts checked RemoteExceptions
to unchecked RemoteAccessExceptions
Supports exposing plain Java interfaces
Client support for both Spring-exposed as
well as convential RMI endpoints
RmiServiceExporter
RmiProxyFactoryBean
RMI-IIOP / CORBA
Ability to use RMI-IIOP implementation
from vendor (see demo)
Of course with the need for
stubs and skeletons
With a Spring-based client, still no need
for java.rmi.Remote
JndiRmiServiceExporter
JndiRmiProxyFactoryBean
When to use what
Both client and server under control
Both Spring: HttpInvoker, Hessian, Burlap
Low bandwidth: Hessian, Burlap
(beware of complex object graphs)
No servlet container: RMI(-IIOP)
Only server under control: RMI
Multiple client platforms: Hessian
(or web services)
Need for security: HttpInvoker or RMI
Security
Basic security for HTTP-based protocols
using Servlet specification security
Method-level security w/ Spring Security
Authentication
Method-level authorization
Integrates with HttpInvoker and RMI
Spring & Remoting
Demo