Upload
melina-goodwin
View
215
Download
0
Tags:
Embed Size (px)
Citation preview
© City University London, Dept. of Computing Distributed Systems / 4 - 1
Distributed Systems
Session 4: RPCs (Remote Method Invocation) Java RMI.
Christos KloukinasDept. of Computing
City University London
© City University London, Dept. of Computing Distributed Systems / 4 - 2
Outline
Motivation and Introduction to Java RMI Conceptual Framework RMI Details Example Implementation Summary
© City University London, Dept. of Computing Distributed Systems / 4 - 3
0 Motivation
DS require computations running in different address spaces (different hosts) to communicate
For basic communication; Java Supports sockets; Sockets API=SEND & RECV CALLS
Sockets require Client & Server engage in application level protocols to encode and decode messages for exchange
Design of such protocols is cumbersome and error prone Alternative is Remote Procedure Call (RPC) (think of sin(),
log(), static methods…)
© City University London, Dept. of Computing Distributed Systems / 4 - 4
0.1 RPC
RPC abstracts the communication interface to the level of procedure call i.e provides procedural interface to distributed (remote) services
Instead of working directly with socket, programmer has illusion of calling a local proc. (transparency)
BUT in reality; arguments of the call are packaged and shipped to remote target of call (marshalling)
RPC systems encode arguments and return values using an external representation such as XDR
© City University London, Dept. of Computing Distributed Systems / 4 - 5
0.2 RPC to RMI
RPC does not translate well into distributed object systems (DOS)
Communication between program-level objects residing in different address spaces is required
To match the semantics of object invocation, DOS require remote method invocation or RMI
Here, a local surrogate(stub) object manages invocation on remote object
RPC + Object Orientation
© City University London, Dept. of Computing Distributed Systems / 4 - 6
0.3 Middleware Layers
Request-Reply protocolMarshalling and external data Representation
RMI and RPC
Application and services
TCP and UDP
Middleware layers
© City University London, Dept. of Computing Distributed Systems / 4 - 7
0.3 Java RMI:The Essence
RMI provide you with an object Oriented mechanism to invoke a method on an object that exist somewhere else.
Java RMI system assumes the homogeneous environment of the java virtual machines (JVM)
therefore it takes advantage of the java platform’s object model whenever possible.
© City University London, Dept. of Computing Distributed Systems / 4 - 8
0.4 Java
Java is an object-oriented programming language developed by Sun Microsystems that is both compiled and interpreted: A Java compiler creates byte-code, which is interpreted by a virtual machine (VM).
Java is portable: Different VMs interpret the byte-code on different hardware and operating system platforms.
© City University London, Dept. of Computing Distributed Systems / 4 - 9
0.5 RMI Rationale High-level primitive for object communication (not just
UDP datagrams and TCP streams). RMI is tightly integrated with the rest of Java language
specification, development environment and the Java VM. Reliance on Java VMs for the resolution of heterogeneity.
RMIs can assume a homogeneous representation Java/RMI does not support RMI between Java objects
and objects written in another OO language (unless you use the native interface for C/C++)
© City University London, Dept. of Computing Distributed Systems / 4 - 10
0.6 Client-Service
Before getting into the details, we should examine what an RMI system looks like in comparison to a standard strong-referenced object relationship.
In a standard instantiate-and-invoke relationship, there are only the Client and Service objects.
They both live in the same virtual machine. Method invocations are made directly on the Service
object.
© City University London, Dept. of Computing Distributed Systems / 4 - 11
0.7 Client-Service
© City University London, Dept. of Computing Distributed Systems / 4 - 12
0.8 RMI
In RMI, the Client object does not directly instantiate the Service,
BUT gets a reference to its interface through the RMI Naming service.
This interface hooks up the client system to the server through a series of layers and proxies until it reaches the actual methods provided by the Service object.
© City University London, Dept. of Computing Distributed Systems / 4 - 13
0.9 Remote Method Invocation
© City University London, Dept. of Computing Distributed Systems / 4 - 14
1.0 Conceptual Framework: Aspects
Architecture.
Accessing components from programming languages.
Interfaces to lower layers.
Component identification.
Service invocation styles.
Handling of failures.
© City University London, Dept. of Computing Distributed Systems / 4 - 15
1.1 System Goals of RMI
Seamless integration of objects on different VMs. Support callbacks from servers to applets. Distributed object model for Java
» Security, write once run everywhere, multithreaded
» Object Orientation
Simplicity (learning curve) Safety (maintain Java standards) Flexibility (several invocation mechanisms and various
reference semantics, distributed garbage collection)
© City University London, Dept. of Computing Distributed Systems / 4 - 16
Distributed Object Application Requirements
Locate remote objects» App can register its remote objects with RMI naming
facility, the rmiregistry Communicate with remote objects
» Details of communication handled by RMI.(Transparency) Load class bytecodes for objects that are passed as
parameters or return values» RMI provides class loading
© City University London, Dept. of Computing Distributed Systems / 4 - 17
2.0 Remote Method Invocation
Overview of RMI architecture.
Generation of client/server stubs.
RMI interface.
Binding.
Handling of remote methods.
Failures of RMIs.
© City University London, Dept. of Computing Distributed Systems / 4 - 18
2.1 RMI Architecture
Client Server
Network
Local Call
ServerStub
RMIInterface
RMIInterface
ServerSkeleton
Remote ObjectMethod
send receive send receive
© City University London, Dept. of Computing Distributed Systems / 4 - 19
2.2 RMI Components
Remote Object Interfaces Client Server Stub Skeleton
© City University London, Dept. of Computing Distributed Systems / 4 - 20
2.31 The Remote Object: Remote object is a class that is designed to
execute on a server but be treated by the client as if it were local.
There are several reasons why you would want to implement a class as a remote object: » the object will run faster, security and proximity to
necessary resources than it would on the client. » If the above reasons don’t apply then it’s probably not a
good idea to implement a class as a remote object.
© City University London, Dept. of Computing Distributed Systems / 4 - 21
2.32 The interface
An RMI remote object must extend java.rmi.Remote. When deploying the remote object, a stub is created that implements the same interface.
The major purpose of the interface is to provide the template that is used by both the remote object and its stubs.
The client never instantiates the remote object itself, and in fact doesn’t even need the class file on its system.
© City University London, Dept. of Computing Distributed Systems / 4 - 22
2.33 The Interface: Advantages There are several advantages to using an
interface that makes RMI a more robust platform.» Security by preventing decompiling» The interface is significantly smaller than the actual remote object’s class,
so the client is lighter in weight.» Maintainability; If changes are made to the underlying remote object, it
would need to be propagated to the clients, otherwise serious errors can occur.
» From an architectural standpoint, the interface is cleaner. The code in the remote object will never run on the client, and the interface acts appropriately as a contract between the caller and the class performing the work remotely.
© City University London, Dept. of Computing Distributed Systems / 4 - 23
2.34 The Client
Users of remote objects . Use Naming Class to lookup() objects instead of
creating them with the new keyword. However, the remote object is NOT returned, only a
stub which happens to implement the same interface of the remote object.
Once the client has an object which implements the remote object interface, it can make calls on it as if it was the real object.
© City University London, Dept. of Computing Distributed Systems / 4 - 24
2.35 The stub The client needs more than just the interface to call
the methods on the remote object. Proxy for the remote object, obtained via naming
service Implements all of the methods of its interface. The stub’s major functionality is serializing objects
between the client and server over the RMI port, i.e Marshalling and unmarshalling
© City University London, Dept. of Computing Distributed Systems / 4 - 25
2.36 The Skeleton On the other side of the connection is a skeleton
of the remote object, as well as the remote object itself.
When the server starts, it creates an instance of the remote object and waits for invocations.
Each time a method is called on the stub from the client, the skeleton object receives a “dispatch” from the server .
The Skeleton is responsible for dispatching the call to the actual object implementation.
© City University London, Dept. of Computing Distributed Systems / 4 - 26
2.37 The Server
RMI server must be present and running on the network.
Create with an instance of class that implement remote interface. I.e creates remote objects
Can be used to start the RMI naming service. Binds an instance of the remote object to the
naming service, giving it an alias in the process.
© City University London, Dept. of Computing Distributed Systems / 4 - 27
Implementation
Hello World Program
© City University London, Dept. of Computing Distributed Systems / 4 - 28
3.0 How to Write RMI ApplicationsDefine your
remote interface
Server class(.class)
Server skeleton(.class)
Client Stub(.class)
Implement Client
javac
Start client
Start RMI registry
Server
Client
rmic
Start Server objects Register remote objects
Implement theinterface
javac
uses
(.java)
(.class)
Run the Stub Compiler
(.java)
(.class)
Client
8
1
4
3
2
5 9
7106
© City University London, Dept. of Computing Distributed Systems / 4 - 29
3.0 How to write an RMI application
To write an RMI application proceed as follows: 1) Define a remote interface (Server Services) by extending java.rmi.Remote and have
methods throw java.rmi.RemoteException 2) Implement the remote interface. You must provide a Java server class that implements
the interface. It must be derived from the class java.rmi.UnicastRemoteObject 3) Compile the server class using javac 4) Run the stub compiler rmic. Run rmic against your (.class) file to generate client stubs
and server skeletons for your remote classes. (REMEMBER proxies for marshalling & unmarshalling)
5) Start the RMI registry on your server (call rmiregistry &). The registry retrieves and registers server objects. In contrast to CORBA it is not persistent.
6) Start the server object and register it with the registry using the bind method in java.rmi.Naming
7) Write the client code using java.rmi.Naming to locate the server objects. 8) Compile the client code using javac 9) Start the client
© City University London, Dept. of Computing Distributed Systems / 4 - 30
3.1 Implementing RMI
Interface for remote object:public interface Hello extends java.rmi.Remote
{String sayHello() throws java.rmi.RemoteException;
}
Implementation of server (declaration):import java.rmi.*;import java.rmi.server.UnicastRemoteObject;public class HelloImpl
extends UnicastRemoteObjectimplements Hello {
private String name;...
© City University London, Dept. of Computing Distributed Systems / 4 - 31
3.2 Implementing RMI: RMI Core
RemoteException superclass for exceptions specific to remote objects thrown by RMI runtime (broken connection, a reference mismatch, e.g.)
The Remote interface embraces all remote objects (Does not define methods, but serves to flag remote objects)
The RemoteObject class corresponds to Java’s Object class. It implements remote versions of methods such as hashCode, equals, toString
The class RemoteServer provides methods for creating and exporting servers (e.g. getClientHost, getLog), I.e. common superclass to server implementations and provides the framework to support a wide range of remote reference semantics.
UnicastRemoteObject Your server must either directly inherit or indirectly extend the class and inherit its remote behaviour: implements a special server with the following characteristics:
» all references to remote objects are only valid during the life of the process which created the remote object
» it requires a TCP connection-based protocol
» parameters, invocations etc. are communicated via streams
© City University London, Dept. of Computing Distributed Systems / 4 - 32
3.3 Interfaces and Classes
Remote RemoteObject
RemoteServer
Activatable UnicastRemoteObject
IOException
RemoteException
Interfaces Classes
extensionimplementation
© City University London, Dept. of Computing Distributed Systems / 4 - 33
3.4 Implementing RMI (Server)
Impl. of server (constructor, method, main):public HelloImpl(String s)throws RemoteException {super(); name = s;}public String sayHello() throws RemoteException {return "Hello World!";}public static void main(String args[]){System.setSecurityManager(new
RMISecurityManager());try {
HelloImpl obj = new HelloImpl("HelloServer"); Naming.rebind("//myhost/HelloServer",obj);} catch (Exception e) {…}
“localhost” or run Java like this: java helloSrv `hostname`
© City University London, Dept. of Computing Distributed Systems / 4 - 34
3.5 Implementing RMI (Server)
The class Naming is the bootstrap mechanism for obtaining references to remote objects based on Uniform Resource Locator (URL) syntax. The URL for a remote object is specified using the usual host, port and name: rmi://host:port/name host = host name of registry (defaults to current host) port = port number of registry (defaults to the registry port number) name = name for remote object
A registry exists on every node that allows RMI connections to servers on that node. The registry on a particular node contains a transient database that maps names to remote objects. When the node boots, the registry database is empty. The names stored in the registry are pure and are not parsed. A service storing itself in the registry may want to prefix its name of the service by a package name (although not required), to reduce name collisions in the registry.
© City University London, Dept. of Computing Distributed Systems / 4 - 35
3.6 Implementing RMI (Client)
Remote remoteHello = null;Hello myHello = null;System.setSecurityManager(
new RMISecurityManager());try {
remoteHello = Naming.lookup("//myhost/HelloServer");
myHello = (Hello) remoteHello;}…
© City University London, Dept. of Computing Distributed Systems / 4 - 36
3.7 Implementing RMI: Summary
To summarise the above example:» The server creates the server object and binds it
to a name
» The client uses lookup to get an object reference and then has to perform a cast to turn a RemoteObject into an object of the proper type
© City University London, Dept. of Computing Distributed Systems / 4 - 37
4.0 RMI Interface
Used by client or server directly:» Locating servers.
» Choosing a transport protocol.
» Authentication and security.
» Invoking RMIs dynamically.
Used by stubs for:» Generating unique message IDs.
» Sending messages.
» Maintaining message history.
© City University London, Dept. of Computing Distributed Systems / 4 - 38
5.0 Binding
How to locate an RMI server that can execute a given procedure in a network?
Can be done» statically (i.e. at compile-time) or
» dynamically (i.e. at run-time).
© City University London, Dept. of Computing Distributed Systems / 4 - 39
5.1 Binding
A problem that arises is to locate that server in a network which supports the program with the desired remote procedures.
This problem is referred to as binding. Binding can be done statically or dynamically. The binding
we have seen in the last example was static because the hostname was determined at compile time.
Static binding is fairly simple, but seriously limits migration and replication transparency.
With dynamic binding the selection of the server is performed at run-time. This can be done in a way that migration and replication transparency is retained.
© City University London, Dept. of Computing Distributed Systems / 4 - 40
5.1 Binding
Limited support for dynamical server location with the LocateRegistry class to obtain the bootstrap Registry on some host. Usage (minus exception handling):
// Server wishes to make itself available to others: SomeSRVC service = ...; // remote object for service Registry registry = LocateRegistry.getRegistry(); registry.bind("I Serve", service); // The client wishes to make requests of the above service: Registry registry = LocateRegistry.getRegistry("foo.services.com"); SomeSRVC service = (SomeSRVC)registry.lookup("I Serve"); service.requestService(...);
Programs can be easily migrated from one server to another and be replicated over multiple hosts with full transparency for clients.
© City University London, Dept. of Computing Distributed Systems / 4 - 41
6.0 Handling of Remote Methods
Call handled synchronously by server.
Concurrent RMIs:» serial or» concurrently.
Server availability:» continuous or» on-demand.» (RMI & CORBA support both)
© City University London, Dept. of Computing Distributed Systems / 4 - 42
7.0 Failures of RMIs
Machines or networks can fail at any time.
At most once semantics.
RMI return value indicates success.
Up to the client to avoid maybe semantics!
© City University London, Dept. of Computing Distributed Systems / 4 - 43
Summary 1
The client process’s role is to invoke the method on a remote object. The only two things that are necessary for this to happen are the remote interface and stub classes.
The server, which “owns” the remote object in its address space, requires all parts of the RMI interchange.
When the client wants to invoke a method on a remote object, it is given a surrogate that implements the same interface, the stub. The client gets this stub from the RMI server as a serialized object and reconstitutes it using the local copy of that class.
© City University London, Dept. of Computing Distributed Systems / 4 - 44
Summary 2
The third part of the system is the object registry. When you register objects with the registry, clients are able to obtain access to it and invoke its methods.
The purpose of the stub on the client is to communicate via serialized objects with the registry on the server. It becomes the proxy for communication back to the server.
© City University London, Dept. of Computing Distributed Systems / 4 - 45
Summary The critical parts of a basic RMI system include
the client, server, RMI registry, remote object and its matching stub, skeleton and interface.
A remote object must have an interface to represent it on the client, since it will actually only exist on the server. A stub which implements the same interface acts as a proxy for the remote object.
The server is responsible for making its remote objects available to clients by instantiating and registering them with Naming service.
© City University London, Dept. of Computing Distributed Systems / 4 - 46
The Remote Method Invocation (RMI) is a Java system that can be used to easily develop distributed object-based applications.RMI, which makes extensive use of object serialization, can be expressed by the following formula:
RMI = Sockets + Object Serialization + Some Utilities
The utilities are the RMI registry and the compiler to generate stubs and skeletons.
If you are familiar with RMI, you would know that developing distributed object-based applications in RMI is much simpler than using sockets.
So why bother with sockets and object serialization then?
Critique
© City University London, Dept. of Computing Distributed Systems / 4 - 47
• The advantages of RMI in comparison with sockets are:• Simplicity: RMI is much easier to work with than sockets• No protocol design: unlike sockets, when working with RMI there is no need to worry about designing a protocol between the client and server -- a process that is error-prone.
• The simplicity of RMI, however, comes at the expense of the network.• There is a communication overhead involved when using RMI and that is due to the RMI registry and client stubs or proxies that make remote invocations transparent. For each RMI remote object there is a need for a proxy, which slows the performance down.
Critique
© City University London, Dept. of Computing Distributed Systems / 4 - 48
Online Resources & Reading
Chapter 4 of Course textbook Chapter 5 of Coulouris & Dollimore Examples at
//web.archive.org/web/20031220223738/http://www.churchillobjects.com/c/11086.html
Tutorials at //engronline.ee.memphis.edu/advjava/online.htm short tutorial at
//www.eg.bucknell.edu/~cs379/DistributedSystems/rmi_tut.html
Next Session:CORBA & COMPARISON WITH RMI