天天看点

自己实现一个RPC框架

自己实现一个RPC框架

远程调用协议。 有多有用,多普遍就不摆了。

大概过程:

1. 调用客户端句柄,传输参数。

2. 封装参数等消息为网络传输格式传给远程主机

3. 服务器句柄得到消息并解析参数

4. 在服务器段执行要调用的代码,并把结果返回给服务器句柄

5. 服务器句柄封装返回结果并用网络传输给客户端

6. 客户端解析并进行其他处理

可见之问题主要有,通信方式、句柄实现、以及消息封装和解析(序列化及反序列化)

直接用socket走tcp/ip 或者是udp协议, 例如rmi

走http协议,  hessian。 好处不用防火墙再开端口了

在下面的例子中,使用java socket。这样可以看到更基础的内容。

句柄部分我们可以使用动态代理,在调用客户端方法的时候使用动态代理来调用远程方法

这个也有很多种,比如java自带的序列化机制,实现了serializable接口的类,都能够进行序列化

对于java序列化的原理可以看下下面的博文:

http://www.java3z.com/cwbwebhome/article/article8/862.html

是java处理二进制的一贯风格,定义了标志位表示后面有多长的内容表示了一个什么,然后是具体的内容。

java的反序列化。

最好的办法当然是看objectinputstream的源代码了。

大概的流程是:

1. readobject0  入口

2. 然后就是一段一段读取然后解析了。一般最开始读取class readclass,读取这个类的class接口

3. readordinaryobject 使用newinstance来创建实例

4. 然后用defaultreadfields 中的desc.setobjfieldvalues内容来个这个实例的字段赋值。

5. 这是一个循环的过程,知道把对象中所有的内容都还原。

还可以有其他的方式,比如webservice技术是使用了soap协议来进行传输的,使用的是类似于xml格式的方式描述消息内容的(因此消息内容会比较臃肿)

hessian是使用了二进制的方式进行了序列化,它使用了自己的规则,该规则可以用其他语言实现,是一个简单而且高效的协议。

细节链接如下:http://hessian.caucho.com/doc/hessian-serialization.html

在下面的例子中使用objectinputstream来进行序列化操作。

启动socket并且给每个请求创建一个处理线程:

然后定义传递的消息内容,要包含了客户端要告诉服务器端的内容,最少要包含,调用的接口名,调用的方法名,以及方法参数。该对象如下:

服务器端处理线程,将会出去参数对象,然后通过反射来得到具体的实例对象以及调用需要调用的方法。

服务器端配置文件,主要是配置接口对应了哪个实现类:

使用动态代理,给每一个方法调用都变为远程调用。

代理将会封装远程参数,把调用的接口,方法名,参数传给远程,并且获得返回值

最后是调用部分,获得代理类。

下面是用作测试的接口及实现类的代码:

最后就是源代码的下载路径了:  

http://download.csdn.net/detail/three_man/8059871