序章
この例を通じて、サービス プロバイダー( 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();
}
};