Transcript Connectors
Remote Procedure Call
and Remote Method Invocation
INF 123 – Software architecture
[email protected]
1
Outline
•
•
•
•
RPC theory
Sun RPC
XML RPC
RMI
2
RPC: THEORY
3
The Problem
• 1980s: Internet and web servers
• How can a client make a server do something?
– Sockets are used to transmit data, not functions
– Sending function code as text is a bad idea
• Client in Python, server in C#?
• Server runs eval(evil_code)? Eval is evil …
4
Dr. Eval
eval(readline()), eval(message), …
5
Reminder: main and subroutines
• Main calls subroutines
• Subroutines return values
• Subroutines have no side-effects
• AKA “call and return”
• “Not a real architecture” <- really? Why?
6
RPC
• Transparently call a procedure located in
another process or machine
• “make the invocation of a procedure on a
remote machine appear as though it were
local”
http://people.sju.edu/~jhodgson/netw/rpc.ht
ml
7
Solution: RPC
Local Procedure Calls
Remote Procedure Calls
host 1
host
program
program
caller
caller
r = foo(a, b)
r = foo(a, b)
Caller stub
callee
define foo(a, b)
…
end
host 2
program
Callee stub
define foo(a, b)
…
end
callee
8
RPC with words
• The local procedure calls a caller stub
• The caller stub serializes the call (function name +
arguments) and sends it to the callee stub on a remote
machine
• The callee stub calls the remote procedure
• The remote procedure does its job, and gives the
return value to the callee stub
• The callee stub sends the value back to the caller stub
• The caller stub passes that value back to the local
procedure
9
Stubs
•
•
•
•
Caller = client (initiate, active end)
Callee = server (listen, passive end)
The stubs are coupled
Client stub must know server stub’s IP and port
– Sometimes, a port is reserved for RPC
• Stubs are usually generated by tools
– Rpcgen for Sun RPC, wscompile for JAX-RPC, …
• Other naming: server stub = skeleton
10
RPC
Usual code
• RPC belongs to the application layer
Caller program
(in client language)
Procedure Interface Definition
(in Interface Def Language)
RPC code
Callee Program
(in server language)
generate
call
Client Stub
(in client language)
Serialize and send
Network OS
call
Server Stub
(in server language)
Deserialize and receive
Network OS
11
RPC as middleware
Middleware: software between OS and application
Application
RPC stubs
Middleware
layers
RPC Request-reply protocol, and RPC serialization format
OS
12
RPC is not P2P
• In both cases, nodes are clients and servers to
each other
• But in RPC, the goal is to execute a function
remotely
– A client and a server could use RPC
– Peers could use RPC with each other
– Peers could simply exchange data, and not use RPC
• RPC stubs use a client-server paradigm
– With a request-response messaging pattern
13
From Unix Network Programming, by Stevens et al.
SUN RPC: DATE/TIME SERVER
EXAMPLE IN C
14
Sun RPC
• AKA Open Network Computing
• Created in the mid 80s by Sun
• The developer writes:
– interface.x, the interface definition, in Interface
Definition Language
– callee.c, the server with the remote procedure
– caller.c, the client calling the remote procedure
• The rpcgen compiler generates:
– interface.h, to be imported by caller.c and callee.c
– callee_stub.c
– caller_stub.c
15
XDR
•
•
•
•
•
eXternal Data Representation
Created in the mid 80s by Sun
Binary encoding
The data format exchanged between stubs
Serialization format used by:
– Network File System (created by Sun)
– SpiderMonkey (Firefox JS engine, XDR used to
exchange compiled JS)
– R (stats tool)
16
generated
Sun RPC
caller.c
Import
function
signature
interface.h
Import
function
signature
Hand-written
callee.c
Generate
Call
caller_stub.c
interface.x
Generate
Send XDR
Call
callee_stub.c
Recv XDR
network
17
caller.c (I adapted it)
server = ‘167.56.7.99’;
client = create_client(server, DATE_PROG,
DATE_VERS, "udp");
bin_date = get_binary_date(NULL, client);
str_date = bin2str_date(bin_date, client);
printf("time on server %s: %s", server,
*str_date);
http://stencel.mimuw.edu.pl/so/3_rpc/G_rpcgen/
http://web.cs.wpi.edu/~rek/DCS/D04/SunRPC.html
18
caller_stub.c (generated and adapted)
#include "date.h"
static struct timeval TIMEOUT = { 25, 0 };
long * get_binary_date(void *argp, CLIENT *clnt) {
static long clnt_res; // return value is a long
memset((char *)&clnt_res, 0, sizeof (clnt_res)); // allocate memory
cli_call = client_call(clnt, GET_BIN_DATE, // RPC function number
(xdrproc_t) xdr_void,
// argument type
(caddr_t) argp,
// argument value
(xdrproc_t) xdr_long,
// return value type
(caddr_t) &clnt_res,
// store in this memory area
TIMEOUT);
if (cli_call != RPC_SUCCESS) {
return (NULL);
}
return (&clnt_res);
}
19
Sun RPC API
• client_call
• create_client
• And more …
20
XML RPC
21
XML RPC
• Over HTTP POST
• 1998, many language bindings
• http://xmlrpc.scripting.com/spec.html
22
XML RPC - request
POST /RPC2 HTTP/1.1
User-Agent: Frontier/5.1.2 (WinNT)
Host: betty.userland.com
Content-Type: text/xml
Content-length: 181
<?xml version="1.0"?>
<methodCall>
<methodName>examples.getStateName</methodName>
<params>
<param>
<value><int>41</int></value>
</param>
</params>
</methodCall>
23
XML RPC – success response
HTTP/1.1 200 OK
Connection: close
Content-Length: 158
Content-Type: text/xml
Date: Fri, 17 Jul 1998 19:55:08 GMT
Server: UserLand Frontier/5.1.2-WinNT
<?xml version="1.0"?>
<methodResponse>
<params>
<param>
<value><string>South Dakota</string></value>
</param>
</params>
</methodResponse>
24
XML RPC – failure response
HTTP/1.1 200 OK
Connection: close
Content-Length: 426
Content-Type: text/xml Date: Fri, 17 Jul 1998 19:55:02
GMT
Server: UserLand Frontier/5.1.2-WinNT
<?xml version="1.0"?>
<methodResponse>
<fault> <value>
<struct>
<member>
<name>faultCode</name>
<value><int>4</int></value>
</member>
<member>
<name>faultString</name>
<value><string>Too many parameters.
</string> </value>
</member>
</struct>
</value> </fault>
</methodResponse>
25
XML RPC vs XML: bandwidth
<struct>
<member>
<name>ROOM_ID</name>
<value> <int>1</int> </value>
</member>
<member>
<name>CODE</name>
<value> <string>MR-101</string>
</value>
</member>
<member>
<name>NAME</name>
<value> <string>Math Room</string>
</value>
</member>
<member>
<name>CAPACITY</name>
<value> <int>30</int> </value>
</member>
</struct>
<room>
<ROOM_ID>1</ROOM_ID>
<CODE>MR-101</CODE>
<NAME>Math Room</NAME>
<CAPACITY>30</CAPACITY>
</room>
class Room {
int id=1;
String code="MR-101";
String name="Maths room";
int capacity=30;
};
http://stackoverflow.com/questions/1376688/what-is-the-benefit-of-xml-rpc-over-plain-xml
26
REMOTE METHOD INVOCATION
27
Proxy objects
• Equivalent of stub, but for client objects
• Goal: make RMI transparent to clients
– Proxy objects behave like a local object to the invoker
– Instead of executing, proxy objects serialize
arguments and forward the call + arguments to the
remote object
• Human writes class interface with method names
• RMI compiler generates proxy classes, skeleton
classes, and server dispatcher
28
Remote Method Invocation
Client
Process
Object A
Proxy
Object
B
Remote
Reference
Module
Remote Reference
Module translates
between local and remote
object references.
Comm.
Module
Server
Process
Comm.
Module
Remote
Reference
Module
Dispatcher
Skeleton
for B’s
Class
Proxy object is a hollow
container of Method
names.
Object
B
Dispatcher sends the
request to Skeleton
Object
Skeleton deserializes
parameters, sends it to
the object, & marshals
the results for return
MIDDLEWARE
http://courses.engr.illinois.edu/cs425/fa2012/L8.fa12.ppt
29
More
• www.cs.bham.ac.uk/~bxb/courses/02_03_DS/Lecture05_Sli
des.pdf
• http://courses.engr.illinois.edu/cs425/fa2012/L8.fa12.ppt
• www2.hh.se/staff/vero/concurrent/lectures/lecture6.pdf
• Implementing Remote Procedure Calls, Birrell et al. 1984
• https://docs.python.org/2/library/xmlrpclib.html
• http://technet.microsoft.com/enus/library/cc738291%28v=WS.10%29.aspx
• http://docs.oracle.com/javaee/1.4/tutorial/doc/JAXRPC3.ht
ml
30