初探rpc | 青训营笔记

116 阅读2分钟

这是我参与「第三届青训营-后端场」笔记创作活动的的第4篇笔记

RPC(Remote Procedure Call)即远程过程调用,简单的说就是在A机器上去调用B机器上的某个方法,在分布式系统中极其常用。

rpc原理其实很简单,比较容易理解,在rpc中有两个角色,rpc server和rpc client,先从client开始讨论,因为client要像调用普通类的方法那样调用server端的方法,比如client要调用server端的方法,所以它必须首先获取到实例,但是又不能直接new,因为直接new的话还是相当于在本地调用,所以这个时候就必须有个什么机制能够把Foo包一下,使得表面上看起来和Foo完全一样但是调用它的bar方法时底层替换为去调用server的bar,这个机制就是代理,代理提供了一种类似于拦截的机制,可以把调用bar方法替换成为自己的实现,比如本地调用bar方法大致执行过程(粗糙概括):

execute bar()
return result

代理替换之后的bar方法(粗糙概括):

call rpc server execute bar()
get result from server
return result

第一步的call rpc server execute bar(),client如何告诉server自己要调用哪个方法呢,这个方法就比较多了,比较常见的是约定一种协议,比如第几个字节是表示的嘛意思,然后server接收后解析按照指令执行就可以了,这样网络传输的数据比较少,或者不太讲究的直接将现成的协议拿过来用,比如通过socket直接传json、传xml、传对象流等等,再或者甚至用http请求的,反正能够把自己要调用哪个方法告诉server,同时还有调用方法时需要传递的参数,然后等待server执行完获取到其结果就可以了。

然后就是server端的处理,如果是使用socket传输数据的话,server应该启动一个服务监听在约定的端口(不约定好的话客户端不知道去连谁啊),一个while循环不断地等待客户端的连接,每来一个客户端就启动一个新的线程去处理(此处没有考虑高并发情况下的负载和优化,只是基本的实现),在新线程中读取socket流看客户端要调用哪个方法,然后调用本地的此方法,调用的时候将client传过来的参数传入进去,待方法执行完再传回给client,传回的方法和client传数据过来相同,无非是走socket自定义协议、xml、json、http等等,再然后client读取到结果返回,一次rpc调用就完成了。至此,一个简单的rpc框架的雏形已经完成。