基于muduo的高性能RPC框架架构设计与消息流转详解
项目概述
本项目基于muduo网络库实现了一个高性能的C++ RPC框架,支持服务注册发现、负载均衡、故障转移等分布式系统核心功能。框架采用分层架构设计,通过标准化的消息格式实现组件间的解耦通信。
系统架构
整体架构图

┌─────────────────────────────────────────────────────────────────┐
│ RPC 框架整体架构 │
└─────────────────────────────────────────────────────────────────┘
┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐
│ RPC Client │ │ Registry Server │ │ RPC Server │
│ │ │ (注册中心) │ │ (服务提供者) │
│ ┌─────────────┐ │ │ │ │ │
│ │RpcClient │ │ │ ┌─────────────┐ │ │ ┌─────────────┐ │
│ │ │ │ │ │RegistryServer│ │ │ │RpcServer │ │
│ │ ┌─────────┐ │ │ │ │ │ │ │ │ │ │
│ │ │Discovery│ │ │◄──►│ │ ┌─────────┐ │ │◄──►│ │ ┌─────────┐ │ │
│ │ │Client │ │ │ │ │ │PDManager│ │ │ │ │ │RpcRouter │ │ │
│ │ └─────────┘ │ │ │ │ └─────────┘ │ │ │ │ └─────────┘ │ │
│ │ ┌─────────┐ │ │ │ │ ┌─────────┐ │ │ │ │ ┌─────────┐ │ │
│ │ │RpcCaller│ │ │ │ │ │Dispatcher│ │ │ │ │ │Dispatcher│ │ │
│ │ └─────────┘ │ │ │ │ └─────────┘ │ │ │ │ └─────────┘ │ │
│ └─────────────┘ │ │ └─────────────┘ │ │ └─────────────┘ │
└─────────────────┘ └─────────────────┘ └─────────────────┘
核心组件关系
1. 注册中心 (RegistryServer)
RegistryServer
├── PDManager (发布-发现管理器)
│ ├── ProviderManager (服务提供者管理器)
│ │ ├── 维护 conn -> Provider 映射
│ │ └── 维护 method -> Provider集合 映射
│ └── DiscovererManager (服务发现者管理器)
│ ├── 维护 conn -> Discoverer 映射
│ └── 维护 method -> Discoverer集合 映射
└── Dispatcher (消息分发器)
└── 注册 MType::REQ_SERVICE -> PDManager::onServiceRequest
2. RPC服务端 (RpcServer)
RpcServer
├── RpcRouter (RPC路由器)
│ └── ServiceManager (服务管理器)
│ └── 维护 method -> ServerDescribe 映射
├── Dispatcher (消息分发器)
│ └── 注册 MType::REQ_RPC -> RpcRouter::onResponse
└── RegistryClient (注册客户端,可选)
└── 向注册中心注册服务
3. RPC客户端 (RpcClient)
RpcClient
├── DiscoveryClient (服务发现客户端,可选)
│ ├── Discoverer (服务发现器)
│ │ ├── 维护 method -> MethodHost 缓存
│ │ └── 处理服务上线/下线通知
│ └── Requestor (请求器)
│ └── 维护 rid -> RequestDescribe 映射
├── RpcCaller (RPC调用器)
│ └── 发送RPC请求并处理响应
├── Dispatcher (消息分发器)
│ └── 注册 MType::RSP_RPC -> Requestor::onResponse
└── 连接池管理
└── 维护 Address -> BaseClient 映射
消息流转详解
业务逻辑层类的关系图
🌐 RpcClient
↓ RPC请求
📡 RpcServer
↓ 消息分发
📋 Dispatcher
↓ 路由处理
🔄 RpcRouter
↓ 服务查找
📚 ServiceManager
↓ 方法调用
🎯 ServiceDescribe
↓ 业务处理
💼 用户业务函数
↓ 返回结果
📤 响应客户端
详细的类关系表
| 类名 | 职责 | 与RpcServer的关系 | 主要功能 |
|---|---|---|---|
| RpcServer | 🏢 RPC服务主入口 | 核心类 | 统筹所有组件,提供RPC服务 |
| RpcRouter | 🔄 请求路由器 | 组合关系 | 处理RPC请求,路由到具体方法 |
| ServiceManager | 📚 服务管理器 | 被RpcRouter使用 | 管理所有注册的服务方法 |
| ServiceDescribe | 🎯 服务描述器 | 被ServiceManager管理 | 描述单个RPC方法的元信息和实现 |
| Dispatcher | 📋 消息分发器 | 组合关系 | 根据消息类型分发到对应处理器 |
| RegistryClient | 🔍 注册客户端 | 可选组合 | 向注册中心注册服务 |
| BaseServer | 📡 网络服务器 | 组合关系 | 处理网络连接和消息接收 |
1. 服务注册流程
当RPC服务器启动并注册服务时:
// RpcServer端代码
auto server = std::make_shared<rpc::server::RpcServer>(
std::make_pair("127.0.0.1", 8080), // 服务地址
true, // 启用注册中心
std::make_pair("127.0.0.1", 9090) // 注册中心地址
);
// 注册加法服务
auto addService = std::make_shared<ServerDescribe>(
"add",
[](const Json::Value& params, Json::Value& result) -> bool {
int a = params["a"].asInt();
int b = params["b"].asInt();
result["sum"] = a + b;
return true;
},
{
{
"a", VType::INTEGRAL}, {
"b", VType::INTEGRAL}},
VType::OBJECT
);
server->registryMethod(addService);
server->start();
消息流转过程:
1. RpcServer::registryMethod()
↓
2. RegistryClient::registryMethod()
↓
3. Provider::registryMethod()
↓
4. 创建ServiceRequest(SERVICE_REGISTER)
↓
5. Requestor::send() -> 发送到注册中心
↓
6. RegistryServer接收 -> Dispatcher::onMessage()
↓
7. PDManager::onServiceRequest()
↓
8. ProviderManager::registerProvider() -> 记录服务提供者
↓
9. DiscovererManager::onlineNotify() -> 通知所有订阅者
↓
10. 返回ServiceResponse(RCODE_OK)
关键代码实现:
// 服务注册的核心实现
void PDManager::onServiceRequest(const BaseConnection::ptr &conn,
const ServiceRequest::ptr &msg) {
ServiceOptype optype = msg->optype();
if (optype == ServiceOptype::SERVICE_REGISTER) {
// 1. 在ProviderManager中添加新的服务提供者
_providers

最低0.47元/天 解锁文章
2579

被折叠的 条评论
为什么被折叠?



