当前位置: 首页 > news >正文

门头沟富阳网站建设seo入门培训班

门头沟富阳网站建设,seo入门培训班,哪里有好网站设计,重庆网站建设之Rpc服务消费者(Rpc服务调用者)实现思路 前面几节说到Rpc消费者主要通过UserServiceRPc_Stub这个protobuf帮我们生成的类来实现,上代码回顾一下 class UserServiceRpc_Stub : public UserServiceRpc {public:UserServiceRpc_Stub(::PROTOBUF…

Rpc服务消费者(Rpc服务调用者)实现思路

前面几节说到Rpc消费者主要通过UserServiceRPc_Stub这个protobuf帮我们生成的类来实现,上代码回顾一下

class UserServiceRpc_Stub : public UserServiceRpc {public:UserServiceRpc_Stub(::PROTOBUF_NAMESPACE_ID::RpcChannel* channel);UserServiceRpc_Stub(::PROTOBUF_NAMESPACE_ID::RpcChannel* channel,::PROTOBUF_NAMESPACE_ID::Service::ChannelOwnership ownership);~UserServiceRpc_Stub();inline ::PROTOBUF_NAMESPACE_ID::RpcChannel* channel() { return channel_; }// implements UserServiceRpc ------------------------------------------void Login(::PROTOBUF_NAMESPACE_ID::RpcController* controller,const ::fixbug::LoginRequest* request,::fixbug::LoginResponse* response,::google::protobuf::Closure* done);private:::PROTOBUF_NAMESPACE_ID::RpcChannel* channel_;bool owns_channel_;GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(UserServiceRpc_Stub);//xxx.pb.cc
void UserServiceRpc_Stub::Login(::PROTOBUF_NAMESPACE_ID::RpcController* controller,const ::fixbug::LoginRequest* request,::fixbug::LoginResponse* response,::google::protobuf::Closure* done) {channel_->CallMethod(descriptor()->method(0),controller, request, response, done);
}
};

UserServiceRpc_Stub可以看做是一个给用户提供rpc远程调用的代理类,这里面有rpcclient和rpcserver约定好的远程方法Login,Login方法是调用了一个channel_的callMethod方法,那么联想到其他服务方法应该也是底层调用了这个函数(底层根据method的索引来区分具体的method),那么这个方法具体如何工作的?这个类需要接受一个RpcChannel类作为参数,看看RpcChannel类:

class PROTOBUF_EXPORT RpcChannel {public:inline RpcChannel() {}virtual ~RpcChannel();virtual void CallMethod(const MethodDescriptor* method,RpcController* controller, const Message* request,Message* response, Closure* done) = 0;private:GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(RpcChannel);
};

很简单就是一个抽象类,有个纯虚函数CallMethod需要rpc_stub来实现。要实现rpcService_Stub,显然先需要具体化一个MyRpcChannel类,这个MyRpcChannel类继承自RpcChannel 类,最后通过多态调用在callMethod方法里面完成rpc远程调用的过程。那么具体怎么进行?

void UserServiceRpc_Stub::Login(::PROTOBUF_NAMESPACE_ID::RpcController* controller,const ::fixbug::LoginRequest* request,::fixbug::LoginResponse* response,::google::protobuf::Closure* done) {channel_->CallMethod(descriptor()->method(0),controller, request, response, done);
}

Login方法接收4个参数,第一个controller先不用管,显然第四个参数done也不需要管因为作为rpc消费者不需要在将什么结果反馈给rpc提供者。那么就只需要传递两个参数,request即是rpc_stub封装用户端请求的参数,response即是在远程调用完成之后rpcserver帮rpcclient填写的,然后rpc_stub只需要反序列化出来结果反馈给用户即可,那么基本实现思路就有了:
step1实现MyRpcchannel类,继承自RpcChannel ,并重写其CallMethod方法,CallMethod实现有如下几小步
step1.1:获取具体服务名和方法名以及将用户传入的request序列化,最终封装成一个字符流(header_size + service_name method_name args_size + args_str)

//获取服务名和方法名const google::protobuf::ServiceDescriptor* service = method->service();std::string service_name = service->name();   //service_namestd::string method_name = method->name();     //method_name//获取参数的序列化字符串长度 args_sizestd::string args_str;uint32_t args_size = 0;if(request->SerializeToString(&args_str)){args_size = args_str.size();}else{std::cout << "request serlize error" << std::endl;return;}//定义rpc请求的HeaderRpcHeader rpcHeader;rpcHeader.set_service_name(service_name);rpcHeader.set_method_name(method_name);rpcHeader.set_args_size(args_size);std::string rpc_header_str;uint32_t header_size = 0;if(rpcHeader.SerializeToString(&rpc_header_str)){header_size = rpc_header_str.size();}else{std::cout << "rpcheader_str serlize error" << std::endl;return;}//组织待发送的rpc请求的字符串std::string send_rpc_str;send_rpc_str.insert(0, std::string((char*)&header_size, 4)); // header_sizesend_rpc_str += rpc_header_str; //rpcHeadersend_rpc_str += args_str; //args

step1.2:连接远程rpcServer服务器(可以是不同机器上的不同进程,也可以是在不同的机器上)
connect to rpcServer
step1.2:将封装的rpc字符流通过socket发送给RpcServer(远程rpc调用请求)
send----->send_rpc_str
step1.3:阻塞等待rpcServer的响应,并将响应饭序列化出来给用户端。
recv------>recv_buf

//反序列化rpc调用的响应数据std::string response_str(recv_buf, 0, recv_size);if(!response->ParseFromString(response_str)){std::cout<< "parse error ! response_str:" << response_str << std::endl;return;}

step2:用户创建UserServiceRpc_Stub类对象,并将MyRpcchannel实例对象传入进行构造。最后通过UserServiceRpc_Stub对象实例调用对应的rpc服务。(实际调用的就是上述实现的CallMethod方法)

	fixbug::UserServiceRpc_Stub stub(new MyRpcChannel());//rpc方法的请求参数fixbug::LoginRequest request;request.set_name("zhang san");request.set_pwd("123");//rpc方法的响应,同步的rpc调用过程fixbug::LoginResponse response;stub.Login(nullptr, &request, &response, nullptr);   //RpcChannel-->Rpchannel::callMethod 集中来做所有rpc方法调用的参数序列化和网络发送

step3:处理阻塞的响应消息response做相应的业务处理。

 //一次rpc调用完成,读调用的结果if(0 == response.result().errcode()){std::cout << "rpc login response success: " << response.success() << std::endl;}else{std::cout << "rpc login error msg : " << response.result().errmsg() << std::endl;}

至此RpcConsumer基本实现。

http://www.tj-hxxt.cn/news/94676.html

相关文章:

  • 东莞 企业网站建设佛山网站建设技术托管
  • 品牌网站建设只詢大蝌蚪广告推广方案怎么写
  • 中英文切换的网站怎么做的百度关键词排名代发
  • 个人虚拟机做网站优化大师如何删掉多余的学生
  • 做it人经常逛的网站百度电脑版网址
  • 网站二维码可以做长按识别吗东莞做好网络推广
  • 哈尔滨手机网站制作人民日报官网
  • 网上接单做衣服哪个网站新闻联播直播 今天
  • 做吉祥物设计看什么网站成人教育培训机构排名
  • 公司门面网站设计世界大学排名
  • 西安建设厅官方网站实时积分榜
  • 智能网站建设推荐培训计划模板
  • 欧洲外贸平台西安快速排名优化
  • 织梦系统做的商城网站突发大事震惊全国
  • 网站备案需要什么材料网络优化公司哪家好
  • 长春绿园网站建设网站seo推广营销
  • 2022世界500强企业排名保定关键词优化软件
  • WordPress文章上传图片昆明百度关键词优化
  • 网站开发公司营业范围谷歌google官网下载
  • seo教学实体培训班网络优化app
  • 自己做网站怎么做深圳seo优化方案
  • ps做素材下载网站深圳网站优化培训
  • 怎么做网站宣传百度网盘网址
  • 齐家网和土巴兔装修哪家好seo网站关键词优化怎么做
  • 基于javaweb的网站开发百度平台推广该怎么做
  • 合肥霍山路网站建设广告网站留电话不用验证码
  • 个人备案可以做影视网站吗2024年重大政治时事汇总
  • 怎么做网站视频教程黑帽seo技术论坛
  • 网站微信分享怎么做网站快速收录软件
  • 免费做ppt网站网店运营推广登录入口