这两天看公司的一个server的源码。
然后看了下里面的rpc实现,感觉很有意思。
大概实现一个rpc工具需要做如下工作:
1、定义序列化的对象,用于在client和server之间传递(接口的参数可以是序列化的,也可以把所有信息封装到一个可序列化对象当中进行传递)
比如:有接口ISample,方法有test(T1 x1, T2 x2)
你可以选择设置T1和T2为可序列化的,client端就可以直接通过代理调用这个方法
也可以如下:test(Invocation invo)->test(T1 X1,T2 X2)
传递的是封装好的可序列化的对象
2、选择io模式,是bio还是nio。当然现在大部分都是nio了
3、定义client和server的结构。这时候涉及动态代理。
4、server端要存储一个map:保存接口和对应的实现类的hash关系。
5、在server初始化的时候,需要传递被代理的对象,同时放到4中的map中
6、client获取动态代理的时候只需要传递接口的class就行,server会通过map去查询被代理实例
7、client中要实现以下socket,在执行代理的时候,连接到remote server
当然,其实通过http直接调用也是一种rpc,这里不做介绍了