项目简介
mpzRPC是一个基于C++实现的RPC分布式网络通信框架,目标是提供高效、易用的远程过程调用(RPC)解决方案。此框架结合了muduo高性能网络库、protobuf数据交换格式以及Zookeeper服务注册中间件,达成了客户端与服务端之间的透明通信,通过隐藏通信细节,简化了服务发布和调用过程,让开发者专注于业务逻辑实现。
项目的主要特性和功能
- 高性能网络通信:基于muduo网络库,采用one loop per thread设计,多线程并发执行多个事件循环,每个事件循环使用非阻塞 + epoll作为IO模型,保证高性能网络通信。
- 服务注册与发现:利用Zookeeper作为服务注册中间件,实现服务的自动注册与发现,客户端无需手动配置服务URL,实现服务端与客户端解耦。
- 数据序列化与反序列化:使用protobuf进行数据序列化和反序列化,确保数据传输的高效性和可靠性。
- 通信协议设计:采用head_size + head_str + request_str的通信协议设计,避免TCP粘包问题,保证数据包边界清晰。
- 异步日志系统:通过消息队列实现异步日志记录,避免日志写入操作影响RPC调用流程,提高系统性能。
安装使用步骤
1. 安装依赖库
在编译和运行mpzRPC之前,请确保已安装以下依赖库。
2. 编译项目
```shell
cd ./mpzRPC
sudo ./autobuild.sh ```
3. 定义RPC接口
使用protobuf定义RPC接口,示例如下: ```protobuf syntax = "proto3"; package example; option cc_generic_services=true;
message ResultCode { int32 errcode = 1; bytes errmsg = 2; }
message LoginRequest { bytes name=1; bytes pwd=2; }
message LoginResponse { ResultCode result=1; bool success = 2; }
service UserRpcService { rpc Login(LoginRequest) returns(LoginResponse); } ```
4. 发布RPC服务
在服务端发布RPC服务,示例如下: ```cpp
include
include
include "example.service.pb.h"
class UserService : public example::UserRpcService { public: bool Login(const std::string &name, const std::string pwd) { std::cout << "local service: Login" << std::endl; return pwd == "123"; } void Login(::google::protobuf::RpcController controller, const ::example::LoginRequest request, ::example::LoginResponse response, ::google::protobuf::Closure done) { std::string name = request->name(); std::string pwd = request->pwd(); bool ret = Login(name, pwd); response->set_success(ret); example::ResultCode *result_code = response->mutable_result(); result_code->set_errcode(0); result_code->set_errmsg(""); done->Run(); } };
int main(int argc, char **argv) { MpzrpcApplication::init(argc, argv); MpzrpcProvider provider; provider.publishService(new UserService()); provider.run(); return 0; } ```
5. 调用RPC服务
在客户端调用RPC服务,示例如下: ```cpp
include "example.service.pb.h"
include
include
int main(int argc, char **argv) { MpzrpcApplication::init(argc, argv); example::UserRpcService_Stub stub(new MpzrpcChannel()); example::LoginRequest request; request.set_name("zhang san"); request.set_pwd("123456"); example::LoginResponse response; stub.Login(nullptr, &request, &response, nullptr); if (0 == response.result().errcode()) { std::cout << "rpc login response success:" << response.success() << std::endl; } else { std::cout << "rpc login response error : " << response.result().errmsg() << std::endl; } return 0; } ``` 通过以上步骤,可成功编译并运行mpzRPC项目,实现RPC服务的发布与调用。
下载地址
点击下载 【提取码: 4003】【解压密码: www.makuang.net】