实现一个简易的点对点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地址

SimpleRPC

最后

    感谢您的阅读, 如果有问题请即时留言, 我会在第一时间回复

posted @ 2020-06-13 16:23  进击的李同学  阅读(406)  评论(0编辑  收藏  举报