Overview of RMI Architecture Peter Cappello
Introduction ... Remote methods have: • much greater latency • new failure modes Do not distribute that which does not need to be
Introduction ... Remote method invocation is like local method invocation, except: • Arguments & return values must: • implement Serializable, or • be Remote objects. • Arguments & return values are passed by value.
Other differences ... • An RMI client refers to a remote object via a Remote interface (it may have many). • The object methods: • equals() • hashCode(), • toString() are overridden by java.rmi.RemoteObject. For example, the toString value includes transport info (network protocol, host name, & port number)
Remote Object Structure • To apply a remote method (y) to a remote object (x): x.y() • x must be a reference to a remote object. • The RMI client gets this reference: • from a rmiregistryor • as the return value of a prior remote method invocation
Reference from Registry rmiregistry 1. Register service 2. Lookup service Client Server 3. Invoke method
Remote Objects Implement the Remote Interface • A remote object must implement at least 1 interface that extends the java.rmi.Remote interface. • Only those methods declared in the interface can be invoked remotely. • A diagram follows ...
The Object Hierarchy Classes Interfaces java.lang.Object java.rmi.Remote java.rmi.server.RemoteObject java.rmi.server.RemoteServer java.rmi.server.UnicastRemoteObject YourRemoteInterface YourRemoteObject
RMI System Architecture RMI Client Application Layer RMI Server Stub Proxy Layer Skeleton Remote Reference Layer Transport Layer
Application Layer • No interface description language (IDL) • The server application: • Implements the remote interface that the client uses. • Exports the object whose methods are invoked remotely (implicitly by extending UnicastRemoteObject) • Registers itself with the rmiregistry.
Application Layer ... • The client application: • Gets reference to remote object (o) • Casts reference as remote interface (t) • Applies methods (m)
Proxy Layer: Stub • The stub is the client’s proxy for the remote object. It: • marshals arguments • unmarshals returned values • can be typed as any of the remote object’s remote interfaces
Proxy Layer: Skeleton • The skeleton is the server’s proxy for the remote object. It: • Un-marshals arguments • dispatches actual method • marshals returned values
Remote Reference Layer • An abstraction between the proxy layer and the transport layer. • It’s mostly reserved for future development: • replicated objects • persistent objects • connection recovery
Transport Layer • This layer implements machine-to-machine communication. • It defaults to TCP/IP. • It can be overridden if you want to: • encrypt streams • compress streams • perform other security & performance enhancements
Name Service • Remote object registers itself with name server: rmiregistry • Clients get reference to remote object by looking up object’s reference in rmiregistry. • There are 2 ways: • 1 rmiregistry/machine for all applications on a well-known port. • Application has its own rmiregistry on its own port.
Garbage Collection • A remote object can implement java.rmi.server.Unreferenced interface. • Method unreferenced is invoked when the object is no longer referenced: You can do “clean up”. • If network fails, an object may be wrongly collected. • Referencing a non-existent object causes a RemoteException to be thrown.
Class Loaders • Class loaders dynamically load classes as needed. • The RMIClassLoader loads the stub & skeleton classes, & any utility classes they need. • For stub & skeleton classes, it looks in the directory named in the system property: java.rmi.server.codebase, set by the -D flag of the java interpreter.
Security • Eavesdropping: Secure Sockets Layer (SSL) can be used instead of TCP. • Misbehaving code: RMI requires a security manager. • Stand-alone applications set the security manager in main() . • System.setSecurityManager(new RMISecurityManager()); prohibits stub classes from doing anything over the network except loading necessary classes.
Performance • RMI is simple to use. • RMI is not as fast as local MI. • RMI is not as fast as special-purpose communication protocols can be. • RMI may not be efficient enough for high-performance real-time applications, such as video streaming. • If you override TCP with a faster protocol, RMI may be fine.
Summary: RMI Server To write an RMI server: • Define interface that extendsRemote. • Define a class that extendsUnicastRemoteObject & implements your remote interface. • Its main(): • Registers itself in the registry.
Summary: RMI Client • Execute System.setSecurityManager( new RMISecurityManager() ); • Get a reference to the remote object by looking it up in rmiregistry. • Apply methods as though it were local. • Behind the scenes, object proxies, stubs & skeletons, are communicating.