Java实现RPC框架 - 1 实现一个RPC框架要考虑什么(浅谈个人理解)

如何去实现RPC框架,我的思路

要实现RPC框架,作为一个没做过类似东西的小白。要考虑两点。

  • 什么是RPC,原理与实现
  • 怎么实现一个框架,如我们Java中的Spring,网络通信框架Netty
    从这两个角度来考虑RPC框架的实现。

从RPC的角度来看

RPC的角度来看,有三个主要问题(前一篇文章提到了) :

  • 如何表示数据(怎么表示传递给方法的参数,以及方法执行后的返回值)
  • 如何传递数据(如何通过网络,在两个服务的 Endpoint 之间相互操作、交换数据)
  • 如何确定方法(跨语言困难)

先看表示数据这一层面,倘若调用方和被调用方使用同种语言,那么参数返回值当然可以直接使用该种语言的数据类型或者对象。困难在于两方语言不同的情况,这时我们可以规定好一种中间数据格式,比如JSONXML等,一方的数据先转化为中间数据格式再根据另一方语言转化为对应语言的数据。这就是序列化。当然自己做的话考虑实现难度,应该只会考虑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介绍。
下一篇的文章就是通信流程,协议设计,序列化,动态代理等整个开发过程中需要用到的知识点。

再下一篇就开始RPC的开发,开发过程参考github上的一个开源项目:
https://github.com/he2121/MyRPCFromZero
是从最简单的远程固定调用一个方法的实现开始到后面比较完整的RPC框架。

本人没有任何框架开发经验,想想这可能就是我框架开发的入门了。有点兴奋。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值