分散ネットワーク通信フレームワーク (4) - ローカル サービスを RPC サービスとして公開する

序章

この例を通じて、サービス プロバイダー( server/ ) での RPC フレームワークcalleeの使用法を理解し、実装コードをよりよく理解することが目的です
。このプロジェクトの完全なソース コードは https://github.com/StrikeCode にあります。 /mprpc.git

プロセス

1 つ目は、対応する rpc メソッドと関連する戻り値とパラメーターの型mprpc/example/user.protoを指定し

syntax = "proto3";

package fixbug;

option cc_generic_services = true;

message ResultCode
{
    int32 errcode = 1;
    bytes errmsg = 2;
}

// 定义登录消息类型
message LoginRequest
{
    bytes name = 1; // =1 代表name是这个message第一个字段,不是指name的值
    bytes pwd = 2;
}

// 定义登录响应消息
message LoginResponse
{
    ResultCode result = 1;
    bool success = 2;
}

service UserServiceRpc
{
    rpc Login(LoginRequest) returns(LoginResponse);
}

次に、mprpc/example/callee/userservice.cc ビジネスコードを実装し、フレームワークが提供する仮想関数を書き換えます。

#include <iostream>
#include <string>
#include "user.pb.h"

// UserService 是一个本地服务,提供了两个进程内的本地方法Login和GetFriendLists
class UserService : fixbug::UserServiceRpc // 使用在rpc服务的发布端(rpc服务提供者)
{
    
    
public:
    bool Login(std::string name, std::string pwd)
    {
    
    
        std::cout << "doing local service:Login" << std::endl;
        std::cout << "name:" << name << " pwd:"<< pwd << std::endl;
    }
    // 这是在使用角度分析RPC的功能
    // 重写基类 UserServiceRpc的虚函数
    // 1. caller(client) ==> Login(LoginRequest) => muduo => callee(server)
    // 2. callee(server) ==> Login(LoginRequest) => 转发到重写的Login方法上(如下)
    void Login(::google::protobuf::RpcController* controller,
                       const ::fixbug::LoginRequest* request,
                       ::fixbug::LoginResponse* response,
                       ::google::protobuf::Closure* done)
    {
    
    
        // 1.框架给业务上报了请求参数LoginRequest,应用获取相应数据做本地业务
        std::string name = request->name();
        std::string pwd = request->pwd();

        // 2.做业务
        bool login_result = Login(name, pwd);

        // 3.把响应写入
        fixbug::ResultCode *code = response->mutable_result();
        code->set_errcode(0);
        code->set_errmsg("");
        response->set_success(login_result);

        // 4.做回调操作,执行响应对象数据的序列化和网络发送(都是由框架完成)
        done->Run();
    }
};

おすすめ

転載: blog.csdn.net/qq_42120843/article/details/130916547
おすすめ