https://github.com/youngyangyang04/krpc
【代码随想录知识星球】项目分享-手撕RPC框架(CPP)
https://github.com/youngyangyang04/krpc
Last synced: 7 months ago
JSON representation
【代码随想录知识星球】项目分享-手撕RPC框架(CPP)
- Host: GitHub
- URL: https://github.com/youngyangyang04/krpc
- Owner: youngyangyang04
- License: gpl-3.0
- Created: 2024-12-02T09:22:25.000Z (about 1 year ago)
- Default Branch: main
- Last Pushed: 2025-03-14T08:48:00.000Z (10 months ago)
- Last Synced: 2025-06-04T03:57:49.292Z (7 months ago)
- Language: C++
- Size: 4.03 MB
- Stars: 102
- Watchers: 1
- Forks: 30
- Open Issues: 2
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# Krpc
> ⭐️ 本项目为[【代码随想录知识星球】](https://programmercarl.com/other/kstar.html) 教学项目
> ⭐️ 在 [手写RPC框架文档](https://www.programmercarl.com/other/project_C++RPC.html) 里详细讲解:**项目前置知识 + 项目细节 + 代码解读 + 项目难点 + 面试题与回答 + 简历写法 + 项目拓展**。 全面帮助你用这个项目求职面试!
# 项目概述
本项目基于protobuf的c++分布式网络通信框架,使用了zookeeper作为服务中间件,负责解决在分布式服务部署中 服务的发布与调用、消息的序列与反序列化、网络包的收发等问题,使其能提供高并发的远程函数调用服务,可以让使用者专注于业务,快速实现微服务的分布式部署,项目会继续完善的欢迎,大家一起学习。
## 运行环境
Ubuntu 22.04 LTS
## 库准备
1. 安装基础工具
```shell
sudo apt-get install -y wget cmake build-essential unzip
```
2. Muduo 库的安装
Muduo 是一个基于多线程 Epoll 模式的高效网络库,负责数据流的网络通信。
- 安装教程参考:[Mudo安装](https://blog.csdn.net/QIANGWEIYUAN/article/details/89023980)
3. Zookeeper 的安装
Zookeeper 负责服务注册与发现,动态记录服务的 IP 地址及端口号,以便调用端快速找到目标服务。
* 安装 Zookeeper:
```shell
sudo apt install zookeeperd
```
* 安装 Zookeeper 开发库:
```shell
sudo apt install libzookeeper-mt-dev
```
4. Protobuf 的安装
Protobuf 负责 RPC 方法的注册、数据的序列化与反序列化。
相较于 XML 和 JSON,Protobuf 是二进制存储,效率更高。
本地版本:3.12.4
在 Ubuntu 22 上可以直接安装:
```shell
sudo apt-get install protobuf-compiler libprotobuf-dev
```
5. 安装boost库
```shell
sudo apt-get install -y libboost-all-dev
```
6. Glog 日志库的安装
Glog 是一个高效的异步日志库,用于记录框架运行时的调试与错误日志。
```shell
sudo apt-get install libgoogle-glog-dev libgflags-dev
```
## 编译指令
第一步:进入到Krpc文件
```shell
cd Krpc
```
第二步:生成项目可执行程序
```shell
mkdir build && cd build && cmake .. && make -j${nproc}
```
第三步:然后进入到example文件夹下,找到user.proto文件执行以下命令,会生成user.pb.h和user.pb.cc:
```shell
cd example
protoc --cpp_out=. user.proto
```
第四步:进入到src文件下,找到Krpcheader.proto文件同样会生成如上pb.h和pb.cc文件
```shell
cd src
protoc --cpp_out=. Krpcheader.proto
```
第五步:进入到bin文件夹下,分别运行./server和./client,即可完成服务发布和调用。
- 进入bin文件:
```shell
cd bin
```
- server:
```shell
./server -i ./test.conf
```
- client:
```shell
./client -i ./test.conf
```
**注意**: 需要重新编译只需要在build目录下执行MAKE -J${4} 即可。
## 整体的框架
- **muduo库**:负责数据流的网络通信,采用了多线程epoll模式的IO多路复用,让服务发布端接受服务调用端的连接请求,并由绑定的回调函数处理调用端的函数调用请求。
- **Protobuf**:负责RPC方法的注册,数据的序列化和反序列化,相比于文本存储的XML和JSON来说,Protobuf是二进制存储,且不需要存储额外的信息,效率更高。
- **Zookeeper**:负责分布式环境的服务注册,记录服务所在的IP地址以及端口号,可动态地为调用端提供目标服务所在发布端的IP地址与端口号,方便服务所在IP地址变动的及时更新。
- **TCP沾包问题处理**:定义服务发布端和调用端之间的消息传输格式,记录方法名和参数长度,防止沾包。
- **Glog日志库**:后续增加了Glog的日志库,进行异步的日志记录。
## 运行结果
通过运行 `bin` 目录下的 `server` 和 `client`,可以观察到以下结果。以下是运行日志中的关键步骤和解析:
---
### 服务端运行结果

- **运行结果说明**:该图展示了服务器成功启动并监听客户端请求的状态。
**服务器日志解析**:
- `doing local service: Login`
- 表示客户端发起对服务 `Login` 的调用。
- `name: zhangsan pwd: 123456`
- 客户端向服务端发送了用户名 `zhangsan` 和密码 `123456`。
- `new connection`
- 客户端成功与服务端建立了一条新连接。
---
### 客户端运行结果

- **运行结果说明**:该图展示了客户端成功连接到服务器并发送请求的状态。
**客户端日志解析**:
- `rpc login response success:1`
- 表示客户端的登录请求成功,服务器返回响应值 `1`。
- `session establishment complete on server`
- 表示与 Zookeeper 的会话成功建立,服务端已注册在 Zookeeper 中。
- `connect server success`
- 表示服务端成功连接到目标地址。
---
### 最终运行结果
通过运行 `bin` 目录下的 `server` 和 `client` 可执行程序,最终结果如下:

- **最终结果说明**:该结果表明客户端与服务端成功完成了一次 RPC 通信,包括服务调用、请求处理和结果返回,验证了框架的稳定性和功能性。
## 总结
- Krpc是一个基于protobuf的C++分布式网络通信框架,旨在简化微服务的部署与调用。
- 通过结合Muduo库、Zookeeper和Glog,Krpc提供了高效的网络通信、服务注册与发现以及日志记录功能。
- 该框架支持高并发的远程函数调用,允许开发者专注于业务逻辑的实现。
- 项目的设计考虑了性能和易用性,适合在现代分布式系统中使用。
- 未来将继续完善,欢迎更多开发者参与学习与贡献。