原帖地址 感谢 作者 http://blog.csdn.net/rulon147/article/details/53814589
一、什么是RPC
RPC(Remote Procedure Call Protocol)——
远程过程调用协议,它是一种通过
网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。
RPC协议假定某些
传输协议的存在,如TCP或UDP,为通信程序之间携带信息数据。在OSI
网络通信模型中,RPC跨越了
传输层和
应用层。RPC使得开发包括网络
分布式多程序在内的应用程序更加容易。
RPC采用客户机/服务器模式。请求程序就是一个客户机,而服务提供程序就是一个服务器。首先,客户机调用进程发送一个有进程参数的调用信息到服务进程,然后等待应答信息。在服务器端,进程保持睡眠状态直到调用信息到达为止。当一个调用信息到达,服务器获得进程参数,计算结果,发送答复
信息,然后等待下一个调用信息,最后,客户端调用进程接收答复信息,获得进程结果,然后调用执行继续进行。
有多种 RPC模式和执行。最初由 Sun 公司提出。IETF ONC 宪章重新修订了 Sun 版本,使得 ONC RPC 协议成为 IETF 标准协议。现在使用最普遍的模式和执行是开放式软件基础的分布式计算
环境(DCE)。
二、图例说明

三、java 实例演示
1、实现技术方案
下面使用比较原始的方案实现RPC框架,采用Socket通信、动态代理与反射与Java原生的序列化。
2、RPC框架架构
RPC架构分为三部分:
- 服务提供者,运行在服务器端,提供服务接口定义与服务实现类。
- 服务中心,运行在服务器端,负责将本地服务发布成远程服务,管理远程服务,提供给服务消费者使用。
- 服务消费者,运行在客户端,通过远程代理对象调用远程服务。
3、 具体实现
1)服务提供者接口定义与实现,代码如下:
- package services;
-
-
- public interface HelloService {
-
-
- String sayHi(String name);
-
-
- }
2)HelloServices接口实现类:
- package services.impl;
-
-
- import services.HelloService;
-
-
- public class HelloServiceImpl implements HelloService {
-
-
- public String sayHi(String name) {
- return "Hi, " + name;
- }
-
-
- }
3)服务中心代码实现,代码如下:
- package services;
-
-
- import java.io.IOException;
-
-
- public interface Server {
- public void stop();
-
-
- public void start() throws IOException;
-
-
- public void register(Class serviceInterface, Class impl);
-
-
- public boolean isRunning();
-
-
- public int getPort();
- }
4)服务中心实现类:
5)客户端的远程代理对象:
- package client;
-
-
- import java.io.ObjectInputStream;
- import java.io.ObjectOutputStream;
- import java.lang.reflect.InvocationHandler;
- import java.lang.reflect.Proxy;
- import java.net.InetSocketAddress;
- import java.net.Socket;
- import java.lang.reflect.Method;
-
-
- public class RPCClient<T> {
- @SuppressWarnings("unchecked")
- public static <T> T getRemoteProxyObj(final Class<?> serviceInterface, final InetSocketAddress addr) {
-
- return (T) Proxy.newProxyInstance(serviceInterface.getClassLoader(), new Class<?>[] { serviceInterface },
- new InvocationHandler() {
- public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
- Socket socket = null;
- ObjectOutputStream output = null;
- ObjectInputStream input = null;
- try {
-
- socket = new Socket();
- socket.connect(addr);
-
-
-
- output = new ObjectOutputStream(socket.getOutputStream());
- output.writeUTF(serviceInterface.getName());
- output.writeUTF(method.getName());
- output.writeObject(method.getParameterTypes());
- output.writeObject(args);
-
-
-
- input = new ObjectInputStream(socket.getInputStream());
- return input.readObject();
- } finally {
- if (socket != null)
- socket.close();
- if (output != null)
- output.close();
- if (input != null)
- input.close();
- }
- }
- });
- }
- }
6)最后为测试类:
- package client;
-
-
- import java.io.IOException;
- import java.net.InetSocketAddress;
-
-
- import services.HelloService;
- import services.Server;
- import services.impl.HelloServiceImpl;
- import services.impl.ServiceCenter;
-
-
- public class RPCTest {
- public static void main(String[] args) throws IOException {
- new Thread(new Runnable() {
- public void run() {
- try {
- Server serviceServer = new ServiceCenter(8088);
- serviceServer.register(HelloService.class, HelloServiceImpl.class);
- serviceServer.start();
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- }).start();
- HelloService service = RPCClient
- .getRemoteProxyObj(HelloService.class, new InetSocketAddress("localhost", 8088));
- System.out.println(service.sayHi("test"));
- }
-
-
- }
运行结果:
- regeist service HelloService
- start server
- Hi, test
通俗易懂的rpc原理
原文:http://www.cnblogs.com/juniorMa/p/7530777.html