文章目录
如何去实现RPC框架,我的思路
要实现RPC
框架,作为一个没写过类似东西的小白。要考虑两点。
- 什么是
RPC
,原理与实现 - 怎么实现一个框架,如我们
Java
中的Spring
,网络通信框架Netty
等
从这两个角度来考虑RPC
框架的实现。
从RPC的角度来看
从RPC
的角度来看,有三个主要问题(前一篇文章提到了) :
- 如何表示数据(怎么表示传递给方法的参数,以及方法执行后的返回值)
- 如何传递数据(如何通过网络,在两个服务的
Endpoint
之间相互操作、交换数据) - 如何确定方法(跨语言困难)
先看表示数据这一层面,倘若调用方和被调用方使用同种语言,那么参数返回值当然可以直接使用该种语言的数据类型或者对象。困难在于两方语言不同的情况,这时我们可以规定好一种中间数据格式,比如JSON
,XML
等,一方的数据先转化为中间数据格式再根据另一方语言转化为对应语言的数据。这就是序列化。当然自己做的话考虑实现难度,应该只会考虑Java
语言的实现。
再看传输数据,就是如何通过网络交换数据。比如通过HTTP
协议,通过socket
等都可以。我们既然使用Java
又考虑到通信,当然使用Netty
框架。
如何确定方法。首先考虑最简单的,a,b两方,a要调用b的一个固定的方法。我们当然可以直接代码里写死,a给b发一条消息,b接收到后调用方法把结果发过来。但是RPC不可能只固定调用一种方法。所以可能采取的方案是对每个方法都给上一个唯一的编号,通过编号来调用。当然这只是最简陋的做法,更好的做法可能是服务注册与服务发现加上动态代理。
从框架实现的角度来看
框架为什么会出现?是我们对于“复用”这一原则的要求不断变高。
从把代码封装成函数来复用,到把方法加参数封装成类,再到把许多函数封装到一个库中来方便使用。复用的层次不断提高。到了框架这一级别,可以说是一个半成品的应用了。比如Spring
框架为我们提供了对象管理(IOC
)与AOP
等其他一系列功能,为我们的应用搭建了一个基础的脚手架。甚至到了框架还能再上一个层次,就是中间件。中间件已经是一个完整的应用了,可能是基于某种框架开发出的。比如缓存中间件Redis
,消息队列中间件。到这个层次依然体现了“复用”的思想,因为你不会希望在开发时希望用到缓存去自己开发一个Redis
吧。
有点扯远了。再拉回到框架的实现:
- 注解的定义
- SPI机制
- 设计模式
例如注解的定义就比如说Spring中的各种注解,都是框架本身定义好的注解要做什么事。方便使用
关于SPI就不多说了了感兴趣可以自己去学习下。后面用到的时候可能也会说。
写一个框架可能与我们平时开发一个业务是十分不同的。写业务更多使用别人提供的服务。而写框架则是我们要给别人提供服务。
总结
所以结合来看,如果想写一个RPC框架,对于从没写过框架的人来说的不仅要搞明白RPC的实现原理。还需要去学习Java
中一个框架应该怎么去开发。
下一篇就开始RPC
的开发,开发过程参考github上的一个开源项目:
https://github.com/he2121/MyRPCFromZero
是从最简单的远程固定调用一个方法的实现开始到后面比较完整的RPC框架。