分布式RPC网络框架

项目概述

mprpc是一个基于C++开发的轻量级RPC框架,它整合了muduo网络库 的高性能I/O模型和Protobuf的高效序列化能力。框架的设计目标是提供简单易用、高性能的远程调用解决方案,支持服务自动注册与发现。

核心特性

  • 高性能网络通信:基于muduo的Reactor多线程模型
  • 高效序列化:使用Protobuf进行二进制数据序列化
  • 服务治理:集成Zookeeper实现服务注册与发现
  • 配置化:支持配置文件动态加载
  • 异步日志:记录框架运行状态

RPC通信原理及实现

黄色部分:设计rpc方法参数的打包和解析,也就是数据的序列化和反序列化,使用Protobuf。

绿色部分:网络部分,包括寻找rpc服务主机,发起rpc调用请求和响应rpc调用结果,使用muduo网络 库和zookeeper服务配置中心(专门做服务发现)。 mprpc框架主要包含以上两个部分的内容。


核心功能

RPC的核心是让远程调用像本地调用一样简单透明。具体有以下功能

  1. 服务注册:服务提供者启动时,将服务地址注册到Zookeeper。
  2. 服务发现:消费者从Zookeeper获取服务提供者地址,并缓存本地。
  3. 负载均衡:随机选择策略,从多个服务提供者中选择一个。
  4. 远程调用:通过动态代理,实现透明的远程方法调用。
  5. 心跳检测:定期检查服务提供者的健康状态。

项目代码工程目录

c 复制代码
bin:可执行文件  
build:项目编译文件 
lib:项目库文件  
src:源文件  
test:测试代码  
example:框架代码使用范例  
CMakeLists.txt:顶层的
cmake文件  
README.md:项目自述文件  
autobuild.sh:一键编译脚本

Protobuf的服务定义与代码生成

在RPC调用中,客户端需告诉服务端三要素

  • 服务名 :如 UserService
  • 方法名 :如 LoginRegister
  • 方法参数:序列化的参数数据
c 复制代码
syntax = "proto3";
package mprpc;

option cc_generic_services = true //选项生成RPC服务框架代码

class LoginRequest{
		xx=1;
		yy=2;
}
class GetFriendListsResponse{
		xx=1;
		yy=2;
}
service UserService {
    rpc Login(LoginRequest) returns (LoginResponse);
}

// 编译命令
protoc user_service.proto --cpp_out=./   输出到当前目录

生成的服务基类为框架提供了标准的接口,我们只需要实现具体的业务逻辑。当使用 protoc 编译 .proto 文件时,Protobuf会自动生成Stub类 ,这个Stub类就是客户端调用远程方法的代理 :每个Stub方法内部都会调用channel_->CallMethod(),并传入方法描述符ServiceDescriptor* GetDescriptor() virtual void Login() 等虚函数两者是整个框架动态调用的核心机制。

日志模块实现


znode节点存储格式

项目收获

  • 深入理解了RPC框架的工作原理,包括网络通信、序列化、服务发现等。
  • 掌握了muduo网络库、Protobuf、Zookeeper等开源工具的使用和集成。
  • 提升了C++编程能力,特别是多线程编程、内存管理和资源管理。
  • 增强了问题解决能力,通过查阅文档、调试和优化,独立解决了开发中的各种问题。

项目地址:
https://gitee.com/min_zh/mprpc


相关推荐
池央3 分钟前
CANN 算子诊断与故障定位:oam-tools 在异构计算错误解析中的作用
网络
“αβ”6 分钟前
数据链路层协议 -- 以太网协议与ARP协议
服务器·网络·网络协议·以太网·数据链路层·arp·mac地址
禁默7 分钟前
打破集群通信“内存墙”:手把手教你用 CANN SHMEM 重构 AIGC 分布式算子
分布式·重构·aigc
释怀不想释怀11 分钟前
Linux网络基础(ip,域名)
linux·网络·tcp/ip
初願致夕霞14 分钟前
Linux_进程
linux·c++
开开心心就好21 分钟前
AI人声伴奏分离工具,离线提取伴奏K歌用
java·linux·开发语言·网络·人工智能·电脑·blender
子榆.24 分钟前
CANN 性能分析与调优实战:使用 msprof 定位瓶颈,榨干硬件每一分算力
大数据·网络·人工智能
Thera7771 小时前
【Linux C++】彻底解决僵尸进程:waitpid(WNOHANG) 与 SA_NOCLDWAIT
linux·服务器·c++
Wei&Yan1 小时前
数据结构——顺序表(静/动态代码实现)
数据结构·c++·算法·visual studio code
驱动探索者1 小时前
U盘发展史
网络·cpu·u盘