基于muduo的高性能RPC框架架构设计与消息流转详解

基于muduo的高性能RPC框架架构设计与消息流转详解

码云:间尺/基于muduo实现rpc

相关博客:基于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
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值