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

有什么免费做h5的素材网站joomla网站迁移

有什么免费做h5的素材网站,joomla网站迁移,购物网页版,seo 网站描述长度Rpc服务消费者#xff08;Rpc服务调用者#xff09;实现思路 前面几节说到Rpc消费者主要通过UserServiceRPc_Stub这个protobuf帮我们生成的类来实现#xff0c;上代码回顾一下 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约定好的远程方法LoginLogin方法是调用了一个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; //argsstep1.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.w-s-a.com/news/588422/

相关文章:

  • 南通做网站的公司有哪些中国建筑论坛网
  • 技术支持 佛山网站建设wordpress不用ftp
  • 广州定制app开发wordpress配置搜索引擎优化
  • 兰州网站建设论坛四川建设网官网登录
  • 在线作图免费网站湖南批量出品机
  • 深圳做网站公司有哪些地方妇联加强网站平台建设
  • vps建设网站别人访问不了网页链接生成器
  • 网站建设一般要多少钱电商平台取名字大全
  • 怎么做网站封面上的图网站开发语言 微信接口
  • 免费观看网站建设优化安徽
  • 上海电商网站开发公司做婚恋网站的翻译好吗
  • 以网站建设为开题报告大数据技术就业前景
  • dw做网站字体 别人电脑显示青岛活动策划公司
  • 网站成立时间查询墨猴seo排名公司
  • 技术支持 随州网站建设苏州企业网站建设定制
  • 美食网站开发目的与意义网站开发环境选择
  • 青岛西海岸新区城市建设局网站开发板在null不可用
  • 企业信息管理系统免费seo优化个人博客
  • 做任务的设计网站泰州哪里做网站
  • 什么网站可以做设计赚钱吗南京十大软件公司排名
  • 网站开发时间进度北京有哪些著名网站
  • 深圳比较好的设计网站公司自己的网站到期域名如何续费
  • 温州做网站哪儿新云网站模版
  • 网站开发 视频存在哪检察院前期网站建设
  • 备案中的网站信息怎么填如何做分享赚钱的网站
  • 网站行程表怎么做注册公司费用要多少
  • 常见电子商务网站基本模式南山网站公司定
  • 网站搭建代码网站里面送礼物要钱怎么做代码
  • 大学英文网站建设举措wordpress 学院 模板
  • 爱 做 网站吗php网站作业模版