Survey
* Your assessment is very important for improving the workof artificial intelligence, which forms the content of this project
* Your assessment is very important for improving the workof artificial intelligence, which forms the content of this project
Java Remote Method Invocation (RMI) ) Distributed Systems a collection of independent computers that appears to its users as a single coherent system Models of Distribution Message passing Distributed objects Event-based architectures Space-based paradigms Distributed Object Model Views a distributed system as a series of interacting objects Based on some underlying message passing protocol invisible to the programmer Three main technologies: RMI, CORBA and DCOM Distributed Object Computing Enable any object in the local system to directly interact with an object on a remote host Goals: Let any object reside anywhere in the network, and allow an application to interact with these objects in the same way as they do with a local object. Provide the ability to construct an object on one host and transmit it to another host. Enable an agent on one host to create an object on another host. What Is RMI? A mechanism that allows the invocation of a method that exists in another address space Java-to-Java only Client-Server Protocol High-level API Transparent Lightweight Related Technologies RPC (“Distributed Common Object Model”) Developed by Microsoft Access to Win32 objects LDAP (“Common Object Request Broker Architecture”) Developed by OMG Access to non-Java objects (as well as Java) DCOM Developed by Sun Platform-specific CORBA (“Remote Procedure Calls”) (“Lightweight Directory Access Protocol”) Finding resources on a network RMI Client – the process that invokes a method on a remote object Server – the process that owns the remote object Object Registry – a name server that relates objects with names Objects are registered with the Object Registry, under a unique name. The Object Registry is used to obtain access to remote objects, using their names. Remote Objects (Diagram) Java Virtual Machine Java Virtual Machine Client Object Remote Object Client TCP Server RMI Layers Java Virtual Machine Java Virtual Machine Client Object Remote Object Stub Skeleton Remote Reference Layer Remote Reference Layer Transport Layer 11/18/2003 TCP Transport Layer RMI Architecture in the OSI model Application Layer Presentation Layer User Application Stub Skeleton Session Layer Remote Reference Layer Transport Layer TCP Network Layer IP Data-link layer Physical Layer Hardware Interface Network Java Virtual Machine Remote Objects Remote Object Stub Skeleton Remote Reference Layer Transport Layer Client Remote Live Java Virtual Machine Client Object Objects on server Accessed as if they were local TCP Remote Reference Layer Transport Layer Server Java Virtual Machine Stubs and Skeletons Java Virtual Machine Client Object Remote Object Stub Skeleton Remote Reference Layer Transport Layer TCP Remote Reference Layer Transport Layer Client Stub lives on client pretends to be remote object - a proxy for the remote object Skeleton Server lives on server receives requests from stub, talks to the remote object and delivers response to stub Stubs and skeletons are not written by the programmer! They are generated by a special compiler “rmic” Java Virtual Machine Stubs and Skeletons Remote Object Stub Skeleton Remote Reference Layer Transport Layer Client Stub Java Virtual Machine Client Object TCP Remote Reference Layer Transport Layer Server – responsibilities Initiate remote calls Marshals arguments to be sent Informs the remote reference layer that a call should be invoked on the server Unmarshals a return value (or exception) Informs the remote reference layer that the call is complete Java Virtual Machine Stubs and Skeletons Remote Object Stub Skeleton Remote Reference Layer Transport Layer Client Skeleton Java Virtual Machine Client Object TCP Remote Reference Layer Transport Layer Server – responsibilities Unmarshals incoming arguments Calls the actual remote object implementation Marshals return values for transport to the client Marshaling The – definition process of converting native programming language data types to a format suitable for transmission across a network Remote Interfaces and Stubs Remote Interface implements Client 11/18/2003 Stub implements Skeleton Remote Object (Server) Remote Interfaces Declare exposed methods – the methods that can be called from remote locations Extend java.rmi.Remote The remote object implements this interface Act like a proxy for the remote object Java Virtual Machine Remote Reference Layer Java Virtual Machine Client Object Remote Object Stub Skeleton Remote Reference Layer Transport Layer TCP Client Sets up connections to remote address spaces Manages connections Listens for incoming calls Communicates via TCP/IP Remote Reference Layer Transport Layer Server Object Registries Name and look up remote objects Remote objects register by name Clients obtain a remote reference to the remote object A registry is a running process on the same host as the RMI server HTTP Tunneling Cool: if it can’t make the connection normally, it will tunnel through port 80 Allows clients behind firewall to make remote calls to server Note: does not work server -> client RMI System Architecture Client Virtual Machine Server Virtual Machine Client Remote Object Skeleton Stub Server Server Client “Fred” Registry Virtual Machine Registry RMI Flow 1. Server Creates Remote Object 2. Server Registers Remote Object Client Server Virtual Machine Remote Object 1 Skeleton Stub Server 2 “Fred” Registry Virtual Machine RMI Flow Client Virtual Machine Client Server Virtual Machine 3. Client requests object from Registry 4. Registry returns remote reference Skeleton Stub 3 Server 4 “Fred” Registry Virtual Machine RMI Flow Client Virtual Machine Server Virtual Machine Client Remote Object 5 7 6 Stub Skeleton Server 5. Client invokes stub method 6. Stub talks to skeleton 7. Skeleton invokes remote object method Registry Virtual Machine Part II: RMI Usage 11/18/2003 and Distributed Programming Creating Remote Objects Define a Remote Interface extends java.rmi.Remote Define a class that implements the Remote Interface extends java.rmi.RemoteObject or java.rmi.UnicastRemoteObject Remote Interface Example import java.rmi.*; public interface Adder extends Remote { public int add(int x, int y) throws RemoteException; } ECE 451:Introduction to Parallel 11/18/2003 Remote Class Example import java.rmi.*; import java.rmi.server.*; public class AdderImpl extends UnicastRemoteObject implements Adder { public AdderImpl() throws RemoteException { } public int add(int x, int y) throws RemoteException { return x + y; } } Inheritance Diagram in Java Object Remote RemoteObject RemoteStub RemoteServer Unicast RemoteObject Compiling Remote Classes Compile the Java class javac reads .java file produces .class file Compile the Stub and Skeleton rmic reads .class file produces _Skel.class and _Stub.class Compiling Remote Classes (Diagram) Adder.java (interface) javac AdderImpl.java (remote class) javac Adder.class (interface classfile) AdderImpl.class (classfile) AdderImpl_Skel.class (skeleton classfile) rmic AdderImpl_Stub.class (stub classfile) 11/18/2003 ECE 451:Introduction to Parallel and Distributed Programming Registering Remote Classes start the registry running process Unix: rmiregistry & Windows: start /m rmiregistry Registry CLASSPATH Registry VM needs to be able to find stub file(s) You must set the CLASSPATH to include the directory containing the stub file An easy way to check CLASSPATH is to use the javap command, supplying a fully package qualified class name. It uses the current CLASSPATH to find and print the interface to a class. Or, your server needs to specify the java.rmi.server.codebase System property (more later) Create the server Creates a new instance of the remote object Registers it in the registry with a name That’s it 11/18/2003 ECE 451:Introduction to Parallel and Distributed Programming RMI Server Example try { AdderImpl adder = new AdderImpl(); Naming. rebind ("adder", adder); System.out.println("Adder bound"); } catch (RemoteException re) { re.printStackTrace(); } catch (MalformedURLException me) { me.printStackTrace(); } Launch the Server % java AdderServer & Adder bound 11/18/2003 ECE 451:Introduction to Parallel and Distributed Programming Server Logging invoke from command line java -Djava.rmi.server.logCalls=true YourServerImpl or enable inside program RemoteServer.setLog(System.err); Creating an RMI Client Install to Find a Security Manager protect from malicious stubs a registry use java.rmi.Naming Lookup the name, returns a reference Cast the reference to the appropriate Remote Interface Just use it! RMI URLs rmi://host[:port]/name default port is 1099 Specifies hostname of registry can also use relative URLs name only assumes registry is on local host RMI Client Example System.setSecurityManager( new RMISecurityManager()); Adder a = (Adder) Naming.lookup("adder"); int sum = a.add(2,2); System.out.println("2+2=" + sum); Remote Interfaces vs. Remote Classes Remember that the reference is to an interface You must make references, arrays, etc. out of the interface type, not the implementation type You can’t cast the remote reference to a normal reference So name your Remote Objects with “Impl” (so you don’t get confused) Parameter Passing All parameters are passed by value Primitive passed types by value Objects passed by value use Java Object Serialization Object Serialization saves the state (data) of a particular instance of an object serialize - to save unserialize - to load Java Serialization writes object as a sequence of bytes writes it to a Stream recreates it on the other end creates a brand new object with the old data java.io.Serializable Objects that implement the java.io.Serializable interface are marked as serializable Also subclasses empty interface - just a marker – no need to implement any special methods RMI Security Server is untrusted Stubs could be malicious rmic is OK, but someone could customcode an evil stub: it’s just a .class file RMI Security Managers AppletSecurityManager stub can only do what an applet can do RMISecurityManager disables all functions except class definition and access A downloaded class is allowed to make a connection if the connection was initiated via the RMI transport. None Stub loading disabled Stubs still work if they are in local classpath Limitations of RMI Java-only but Uses you can use JNI on the server TCP, not UDP At least two sockets per connection Untested for huge loads Sun vs. Microsoft RMI is not shipped as part of Microsoft’s products RMI will still work in applications include java.rmi.* class files in your classpath download rmi.zip from ftp.microsoft.com RMI will work in applets include java.rmi.* class files (or rmi.zip) in your codebase extra download time RMI Chat Server Objects Message interface interface MessageReceiver ChatServer - receiveMessage(Message) - login(MessageReceiver) - sendMessage(Message) ChatClient implements remote reference local reference ChatServerImpl Dispatcher MessageQueue Summary RMI is a very clean API Easy way to write distributed programs Wire protocol may need improvement for large-scale problems