目录
一、前言
从本章开始,博主将会介绍从零实现Json-RPC框架这个项目,这个项⽬是基于C++、JsonCpp、muduo⽹络库实现⼀个简单、易⽤的RPC通信框架,即使是不懂 ⽹络的开发者也可以很快速的上⼿,它实现了同步调⽤、异步callback调⽤、异步futrue调⽤、服务注册/发现,服务上线/下线以及发布订阅等功能设计,希望小伙伴们能够从中有所收获!!!
二、正文
1.项目介绍
RPC(Remote Procedure Call)远程过程调⽤,是⼀种通过⽹络从远程计算机上请求服务,⽽不需要了解底层⽹络通信细节。RPC可以使⽤多种⽹络协议进⾏通信,如HTTP、TCP、UDP等,并且在 TCP/IP⽹络四层模型中跨越了传输层和应⽤层。简⾔之RPC就是像调⽤本地⽅法⼀样调⽤远程⽅法。过程可以理解为业务处理、计算任务,更直⽩的说,就是程序/⽅法/函数等,就是像调⽤本地⽅法⼀样调⽤远程⽅法。
举个形象的例⼦:谈恋爱例子
本地过程调⽤:恋爱对象在你的⾝边,可以随时约对象吃饭、看电影、约会等等
远端过程调⽤:好像异地恋⼀样,隔着千⼭万⽔,如果想约会,需要先和对象进⾏约定,在坐⽕⻋/⻜机赶到约定的地点
⼀个完整RPC通信框架,⼤概包含以下内容:
• 序列化协议
• 通信协议
• 连接复⽤
• 服务注册
• 服务发现
• 服务订阅和通知
• 负载均衡
• 服务监控
• 同步调⽤
• 异步调⽤。
2. 技术选型
①.⽬前RPC的实现⽅案有两种:
★client和server继承公共接⼝
根据IDL(接⼝描述语⾔)定义公共接⼝
◦ 编写代码⽣成器根据IDL语⾔⽣成相关的C++、Java代码
◦ 然后我们的客⼾端和服务器程序共同向上继承公共接⼝即可
◦ ⽐如我们常⽤的Protobuf、json可以定义IDL接⼝,并⽣成RPC相关的代码
◦ 缺点:使⽤pb因为⽣成⼀部分代码,所以对理解不够友好;如果是json定义IDL语⾔需要⾃⼰编写代码⽣成器难度较⼤⼀点,暂不考虑这种⽅案注:IDL(Interface Definition Language,接口定义语言)是用于描述分布式对象接口的定义语言,利用IDL进行接口定义之后,就确定了客户端与服务器之间的接口,这样即使客户端和服务器独立进行开发,也能够正确地定义和调用所需要的分布式方法。
★实现⼀个远程调⽤接⼝call,然后通过传⼊函数名参数来调⽤RPC接⼝,我们采⽤这种实现⽅案
②. ⽹络传输的参数和返回值怎么映射到对应的RPC接⼝上
• 使⽤protobuf的反射机制
• 使⽤C++模板、类型萃取、函数萃取等机制
• 使⽤更通⽤的类型,⽐如JSON类型,设计好参数和返回值协议即可注:前两种技术难度和学习成本较⾼,我们使⽤第三种⽅式
③ ⽹络传输怎么做
• 原⽣socket-实现难度较⼤,暂不考虑
• Boost asio库的异步通信-需要扩展boost库
• muduo库,学习开发成本较低(采取该种方式)
④ 序列化和反序列化
• Protobuf:可选
• JSON:因为项⽬需要使⽤JSON来定义函数参数和返回值,所以项⽬中直接采⽤JSON进⾏序列化和反序列化
3. 开发环境
• Linux(Ubuntu-22.04)
• VSCode/Vim
• g++/gdb
• Makefile
4. Ubuntu-22.04环境搭建
● 安装wget(⼀般情况下默认会⾃带)
● sudo apt-get install wget
● 更换国内软件源
先备份原来的/etc/apt/source.list⽂件
● sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak
添加软件源⽂件内容,新增以下内容
注:如果vim打开添加新增内容后,无法保存可以切换到root用户或者sudo vim来打开文件
deb http://mirrors.aliyun.com/ubuntu/ focal main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ focal main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ focal-security main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ focal-security main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ focal-updates main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ focal-updates main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ focal-proposed main restricted universe multiverse deb-src http://mirrors.aliyun.com/ubuntu/ focal-proposed main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ focal-backports main restricted universe multiverse deb-src http://mirrors.aliyun.com/ubuntu/ focal-backports main restricted universe multiverse
#添加清华源
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-updates main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-backports main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-security main restricted universe multiverse
新增完毕后,更新源
注:更新失败一定要看下上一步增加源的时候是否一行分成两行来添加了
● sudo apt-get update
● 安装lrzsz传输⼯具
● sudo apt-get install lrzsz
● rz –version
rz (lrzsz) 0.12.20
注:下面的操作如果遇到界面弹出,选择OK即可
● 安装编译器gcc/g++
● sudo apt-get install gcc g++
安装项⽬构建⼯具make
● sudo apt-get install make
● 安装调试器gdb
● sudo apt-get install gdb
● 安装git
● sudo apt-get install git
● git –version
● 安装cmake
● sudo apt-get install cmake
● cmake –version
cmake version 3.22.1
● 安装jsoncpp
● sudo apt-get install libjsoncpp-dev
● 安装Muduo
可以采取git克隆仓库的方式,但是可能会遇到无法访问的问题,这是因为需要访问到国外的网站,在后面博主提供了Muduo压缩包,直接将压缩包拖拽到xshell界面,进行解压缩也是可以达到相同的效果的
★ 下载源码/解压压缩包
# git⽅式
● git clone https://github.com/chenshuo/muduo.git
★ 安装依赖环境
● sudo apt-get install libz-dev libboost-all-dev
★ 运⾏脚本编译安装
● unzip muduo-master.zip
● ./build.sh
● ./build.sh install
三、结语
到此为止,本文关于从零实现Json-RPC框架第一弹的内容到此结束了,如有不足之处,欢迎小伙伴们指出呀!
关注我 _麦麦_分享更多干货:_麦麦_-CSDN博客
大家的「关注❤️ + 点赞👍 + 收藏⭐」就是我创作的最大动力!谢谢大家的支持,我们下期见!
平台声明:以上文章转载于《CSDN》,文章全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,仅作参考。
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/m0_73953114/article/details/147196763