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

购物网站排版设计wordpress栏目图片

购物网站排版设计,wordpress栏目图片,qq登录,福建泉州做网站公司哪家好如何在proto中定义一个rpc服务? syntax proto3; //声明protobuf的版本package fixbug; //声明了代码所在的包 #xff08;对于C来说就是namespace)//下面的选项#xff0c;表示生成service服务类和rpc方法描述#xff0c; 默认是不生成的 option cc_generi…如何在proto中定义一个rpc服务? syntax proto3; //声明protobuf的版本package fixbug; //声明了代码所在的包 对于C来说就是namespace)//下面的选项表示生成service服务类和rpc方法描述 默认是不生成的 option cc_generic_services true;message ResultCode{ //定义返回的错误码int32 errcode 1;bytes errmsg 2; }//常用的数据类型 数据、列表、映射表//定义登录请求消息类型 name pwd message LoginRequest{bytes name 1; //等于1表示这是第一个参数一般string的存储定义为bytesbytes pwd 2;// mapint32,string test 3; //映射表类型 }//定义登录响应消息类型 message LoginResponse{ResultCode result 1;bool success 3; }message GetFriendsListRequest{uint32 user_id 1; }message User{bytes name 1;uint32 age 2;enum Sex{MAN 0;WOMAN 1;}Sex sex 3; }message GetFriendsListResponse{ResultCode result 1;repeated User friend_list 2; //定义了一个列表数据类型 }//在protobuf里面怎么定义描述rpc方法的类型---service service UserService{rpc Login(LoginRequest) returns(LoginResponse);rpc GetFriendsList(GetFriendsListRequest) returns(GetFriendsListResponse); }关键字service用于定义rpc服务例如Userservice有两个rpc服务分别是Login和GetFriendsList 返回值分别就是上述定义的消息类型。 老样子先执行protoc xxx.proto --cpp_out./ 生成对应的xxx.pb.cc 和 xxx.pb.h文件。 需要注意的是选项option cc_generic_services true;得加上默认是不生成的。 这边来分析xxx.pb.h文件简单探究一下rpc调用过程 //!!!!xxx.pb.h class UserService : public ::PROTOBUF_NAMESPACE_ID::Service {protected:// This class should be treated as an abstract interface.inline UserService() {};public:virtual ~UserService();typedef UserService_Stub Stub;static const ::PROTOBUF_NAMESPACE_ID::ServiceDescriptor* descriptor();virtual void Login(::PROTOBUF_NAMESPACE_ID::RpcController* controller,const ::fixbug::LoginRequest* request,::fixbug::LoginResponse* response,::google::protobuf::Closure* done);virtual void GetFriendsList(::PROTOBUF_NAMESPACE_ID::RpcController* controller,const ::fixbug::GetFriendsListRequest* request,::fixbug::GetFriendsListResponse* response,::google::protobuf::Closure* done);// implements Service ----------------------------------------------const ::PROTOBUF_NAMESPACE_ID::ServiceDescriptor* GetDescriptor();void CallMethod(const ::PROTOBUF_NAMESPACE_ID::MethodDescriptor* method,::PROTOBUF_NAMESPACE_ID::RpcController* controller,const ::PROTOBUF_NAMESPACE_ID::Message* request,::PROTOBUF_NAMESPACE_ID::Message* response,::google::protobuf::Closure* done);const ::PROTOBUF_NAMESPACE_ID::Message GetRequestPrototype(const ::PROTOBUF_NAMESPACE_ID::MethodDescriptor* method) const;const ::PROTOBUF_NAMESPACE_ID::Message GetResponsePrototype(const ::PROTOBUF_NAMESPACE_ID::MethodDescriptor* method) const;private:GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(UserService); }; //!!!!xxx.pb.cc void UserService::Login(::PROTOBUF_NAMESPACE_ID::RpcController* controller,const ::fixbug::LoginRequest*,::fixbug::LoginResponse*,::google::protobuf::Closure* done) {controller-SetFailed(Method Login() not implemented.);done-Run(); }void UserService::GetFriendsList(::PROTOBUF_NAMESPACE_ID::RpcController* controller,const ::fixbug::GetFriendsListRequest*,::fixbug::GetFriendsListResponse*,::google::protobuf::Closure* done) {controller-SetFailed(Method GetFriendsList() not implemented.);done-Run(); }可以看到一个UserService这个类这个和message关键字有异曲同工之妙都是对应的一个类只不过继承的基类是有所不同的 message消息类型继承于抽象类message service服务类型继承于抽象类service。此外可以发现在类中实现了在proto文件中定义的两个rpc方法Login和GetFriendsList 其中两个参数是很熟悉的request和response也即这个rpc方法的需要用到的调用参数类型message基类指针表示可以接受任意消息类型。 由此可知UserService类是一个服务提供者Callee) 再来看另一个类 //!!!!xxx.pb.h class UserService_Stub : public UserService {public:UserService_Stub(::PROTOBUF_NAMESPACE_ID::RpcChannel* channel);UserService_Stub(::PROTOBUF_NAMESPACE_ID::RpcChannel* channel,::PROTOBUF_NAMESPACE_ID::Service::ChannelOwnership ownership);~UserService_Stub();inline ::PROTOBUF_NAMESPACE_ID::RpcChannel* channel() { return channel_; }// implements UserService ------------------------------------------void Login(::PROTOBUF_NAMESPACE_ID::RpcController* controller,const ::fixbug::LoginRequest* request,::fixbug::LoginResponse* response,::google::protobuf::Closure* done);void GetFriendsList(::PROTOBUF_NAMESPACE_ID::RpcController* controller,const ::fixbug::GetFriendsListRequest* request,::fixbug::GetFriendsListResponse* response,::google::protobuf::Closure* done);private:::PROTOBUF_NAMESPACE_ID::RpcChannel* channel_;bool owns_channel_;GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(UserService_Stub);//!!!!xxx.pb.cc void UserService_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); } void UserService_Stub::GetFriendsList(::PROTOBUF_NAMESPACE_ID::RpcController* controller,const ::fixbug::GetFriendsListRequest* request,::fixbug::GetFriendsListResponse* response,::google::protobuf::Closure* done) {channel_-CallMethod(descriptor()-method(1),controller, request, response, done); }可以看见这个类没有无参构造有几个RpcChannel*参数传递的构造方法不妨看看RpcChannel类 class PROTOBUF_EXPORT RpcChannel {public:inline RpcChannel() {}virtual ~RpcChannel();// Call the given method of the remote service. The signature of this// procedure looks the same as Service::CallMethod(), but the requirements// are less strict in one important way: the request and response objects// need not be of any specific class as long as their descriptors are// method-input_type() and method-output_type().virtual void CallMethod(const MethodDescriptor* method,RpcController* controller, const Message* request,Message* response, Closure* done) 0;private:GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(RpcChannel); };很显然这是个抽象基类需要用户自己实现派生类重写基类的CallMethod方法 在之后login和GetFriendsList两个方法基本调用方式一样都是通过_channel调用CallMethod方法执行对应rpc调用那么可知UserService_Stub是服务消费者Caller 如何发布一个本地rpc服务 #include iostream #include string #include user.pb.h class UserService : public fixbug::UserServiceRpc //使用rpc服务发布端(rpc服务提供者) { public:bool Login(std::string name, std::string pwd){std::coutdoing local service : Login std::endl;std::cout name: name pwd : pwd std::endl;} /*** 重写基类UserServiceRpc的虚函数 下面这些方法都是框架直接调用的* caller Login(LoginRequest) transmit callee* callee Login(LoginRequest) 调用下述的Login方法* */void Login(::google::protobuf::RpcController* controller,const ::fixbug::LoginRequest* request,::fixbug::LoginResponse* response,::google::protobuf::Closure* done){//框架给业务上报了请求参数LoginRequest 应用获取相应数据做本地业务std::string name request-name();std::string pwd request-pwd();//本地业务bool res Login(name, pwd);//把响应写入 包括错误码、错误消息、返回值response-set_success(0);fixbug::ResultCode* rc response-mutable_result();rc-set_errcode(0);rc-set_errmsg();//执行回调操作 执行响应对象数据的序列化和网络发送由框架来完成done-Run();} };继承对应的UserServiceRpc服务提供者重写其基类方法即可。 上面只是发布过程具体rpc调用待续。。。
http://www.zqtcl.cn/news/819868/

相关文章:

  • 个人博客网站下载公司邮箱免费注册
  • 厦门外贸网站建设多少钱wordpress 增大字体
  • 可以做外链的网站有哪些外贸阿里巴巴国际站
  • 潮安区住房和城乡建设局网站网站开发技术分析
  • 网站跳出率因素建设单位应该关注的网站
  • php开发的大型金融网站有哪些网站开发可以自学吗
  • 个人建网站成本wordpress 增加阅读量
  • wordpress构建自己的网站大连网站建设主页
  • 棋牌网站开发工程师网站app制作费用单
  • 为什么做网站比app便宜精准营销服务
  • 网站平台做捐助功能有风险吗wordpress博客 翻墙
  • 泰州网站建设专业团队长沙seo顾问
  • 网站建设情况简介seo的基本步骤顺序正确的是
  • wordpress 文件目录结构关键字优化价格
  • 连云港网站关键字优化市场网站 设计 文档
  • 哈尔滨企业建站服务商龙岩建筑网
  • 四川住房城乡建设厅官方网站中国建设银行在网站怎么签约
  • wordpress tortuga安徽seo网站
  • 厦门商务网站建设网络规划与设计实用教程
  • win8风格门户网站已经建网站做外贸
  • 自己有域名如何做网站wordpress文章中外链
  • 网站模糊背景加快网站速度吗
  • 网站设计软件下载在线观看免费网站网址
  • 关于网站开发的文章wordpress+直接连接数据库
  • 清华紫光网站建设怎样做团购网站
  • 诸城网站建设费用网站建设便捷
  • 丰台网站建设联系方式全屋定制十大名牌口碑
  • mip网站模板中国建设集团门户网站
  • 笑话 语录用什么网站做搜一搜百度
  • 合肥网站建设新闻营销影视类网站建设