zoukankan      html  css  js  c++  java
  • 实现一个简易的点对点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

    最后

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

  • 相关阅读:
    QTextStream 居然接受FILE*这样的传统参数
    基于IOCP的高速文件传输代码
    tornado web框架
    Kaggle入门
    NET Core 介绍
    Wireshark
    设计和应用分布式调用跟踪系统
    Visual Studio Code和Docker开发asp.net core和mysql应用
    背单词
    多环境开发
  • 原文地址:https://www.cnblogs.com/nedulee/p/13117935.html
Copyright © 2011-2022 走看看