做優(yōu)秀網(wǎng)站seo待遇
?在Provider的實(shí)現(xiàn)中,OnMessage函數(shù)中,處理接收到的連接RPC請(qǐng)求。將接收到的RPC請(qǐng)求(包含請(qǐng)求的對(duì)象,請(qǐng)求方法和 請(qǐng)求參數(shù)),接收到這些信息之后進(jìn)行反序列化。得到這些參數(shù)之后我們即將要做的事情是去調(diào)用相應(yīng)的函數(shù)。怎么調(diào)用呢???
我們調(diào)用的方法名字如下,方法參數(shù)如下,需要根據(jù)發(fā)送來的信息找到該函數(shù)。
void Login(::google::protobuf::RpcController* controller,const ::fixbug::LoginRequest* request,::fixbug::LoginResponse* response,::google::protobuf::Closure* done){// 框架給業(yè)務(wù)上報(bào)了請(qǐng)求參數(shù)LoginRequest,應(yīng)用獲取相應(yīng)數(shù)據(jù)做本地業(yè)務(wù)std::string name = request->name();std::string pwd = request->pwd();// 做本地業(yè)務(wù)bool login_result = Login(name, pwd); // 把響應(yīng)寫入 包括錯(cuò)誤碼、錯(cuò)誤消息、返回值fixbug::ResultCode *code = response->mutable_result();code->set_errcode(0);code->set_errmsg("");response->set_sucess(login_result);// 執(zhí)行回調(diào)操作 執(zhí)行響應(yīng)對(duì)象數(shù)據(jù)的序列化和網(wǎng)絡(luò)發(fā)送(都是由框架來完成的)done->Run();}
google::protobuf::Service *service = it->second.m_service; // 獲取service對(duì)象 new UserServiceconst google::protobuf::MethodDescriptor *method = mit->second; // 獲取method對(duì)象 Login// 生成rpc方法調(diào)用的請(qǐng)求request和響應(yīng)response參數(shù)google::protobuf::Message *request = service->GetRequestPrototype(method).New();if (!request->ParseFromString(args_str)){std::cout << "request parse error, content:" << args_str << std::endl;return;}google::protobuf::Message *response = service->GetResponsePrototype(method).New();// 給下面的method方法的調(diào)用,綁定一個(gè)Closure的回調(diào)函數(shù)google::protobuf::Closure *done = google::protobuf::NewCallback<RpcProvider, const muduo::net::TcpConnectionPtr&, google::protobuf::Message*>(this, &RpcProvider::SendRpcResponse, conn, response);// 在框架上根據(jù)遠(yuǎn)端rpc請(qǐng)求,調(diào)用當(dāng)前rpc節(jié)點(diǎn)上發(fā)布的方法// new UserService().Login(controller, request, response, done)service->CallMethod(method, nullptr, request, response, done);
}// Closure的回調(diào)操作,用于序列化rpc的響應(yīng)和網(wǎng)絡(luò)發(fā)送
void RpcProvider::SendRpcResponse(const muduo::net::TcpConnectionPtr& conn, google::protobuf::Message *response)
{std::string response_str;if (response->SerializeToString(&response_str)) // response進(jìn)行序列化{// 序列化成功后,通過網(wǎng)絡(luò)把rpc方法執(zhí)行的結(jié)果發(fā)送會(huì)rpc的調(diào)用方conn->send(response_str);}else{std::cout << "serialize response_str error!" << std::endl; }conn->shutdown(); // 模擬http的短鏈接服務(wù),由rpcprovider主動(dòng)斷開連接
}
?我們需要調(diào)用的函數(shù)如下:
void Login(::google::protobuf::RpcController* controller,const ::fixbug::LoginRequest* request,::fixbug::LoginResponse* response,::google::protobuf::Closure* done)
?首先獲取調(diào)用的服務(wù)對(duì)象和方法:
?google::protobuf::Service *service = it->second.m_service; // 獲取service對(duì)象 ?new UserService
? ? const google::protobuf::MethodDescriptor *method = mit->second; // 獲取method對(duì)象 ?Login
?獲取方法的參數(shù):request和response,這些
google::protobuf::Message *request = service->GetRequestPrototype(method).New();
? ? if (!request->ParseFromString(args_str))
? ? {
? ? ? ? std::cout << "request parse error, content:" << args_str << std::endl;
? ? ? ? return;
? ? }
? ? google::protobuf::Message *response = service->GetResponsePrototype(method).New();