实现一个简易的点对点rpc框架
什么是RPC?
Remote Procedure Call, 即远程过程调用, RPC框架可以帮助我们屏蔽网络通讯细节。就使用方而言, 让远程调用和本地调用一样简单。
本地调用?远程调用?
那么本地调用和远程调用有什么区别呢?如果是本地调用, 调用方和被调用方位于一台机器, 彼此之间可以访问同一内存, 从而实现数据的传递。而远程调用, 调用方和被调用方位于不同机器, 想要实现方法调用, 需要解决两类问题。
- 数据传输, 我们传递的对象, 需要进行序列化转换。网络中传输的数据都是以二进制的形式存在的, 这就涉及到数据的编解码。网络是复杂的, 所以就会伴随着丢包、乱序、超时等问题,TCP协议还会存在半包和粘包问题, 这些都需要我们去解决
- 协议, 我们应该定义规范, 从而确定数据该以什么样的协议解析, 该调用哪个方法, 方法执行结束后, 结果又是以什么形式回传?
常见的RPC框架
RPC框架就是为了解决这类问题, 它可以将网络编程的部分和业务逻辑分开(可以分为接入层、业务层), 从而使开发人员只需专注于业务逻辑的开发即可, 常见的RPC框架如下:
图解 | 目录
为了对PRC框架有一个更深刻的理解, 博主编写了一个入门级的demo, 主要实现了如下功能:
- 定义消息, 制定解析消息规则(协议)
- 使用netty进行网络消息传输, 解决TCP的粘包和半包问题
- 定义响应分发中心, 客户端同步请求, 服务端异步响应
- 定义方法表, 用于提供远程调用方法
- 定义客户端代理类, 用于实现本地调用一样的远程调用
由于时间原因, 该项目并不成熟, 比如每次调用都会去创建一个客户端连接, 每次返回结果后断开连接, 没有考虑到请求失败的处理, 没有探活机制等等, 日后会进行优化
目录结构:
- application - 方法执行列表, 定义可调用方法
- client - netty客户端程序, 用于发送被调用方信息
- codec - 编解码器
- dispatcher - 响应分发中心, 用于异步转同步
- model.message - 消息实体, 用于定义通讯消息
- server - netty服务端, 用于提供调用服务
- codec - 编解码器
- handler - 处理请求方法
- utils - 工具类
- Test - 测试方法
git地址
最后
感谢您的阅读, 如果有问题请即时留言, 我会在第一时间回复