中文亚洲精品无码_熟女乱子伦免费_人人超碰人人爱国产_亚洲熟妇女综合网

當(dāng)前位置: 首頁(yè) > news >正文

未滿(mǎn)18歲能申請(qǐng)網(wǎng)站備案嗎網(wǎng)站模板之家

未滿(mǎn)18歲能申請(qǐng)網(wǎng)站備案嗎,網(wǎng)站模板之家,國(guó)外WordPress主題購(gòu)買(mǎi),免費(fèi)下載app應(yīng)用軟件如何在proto中定義一個(gè)rpc服務(wù)? syntax "proto3"; //聲明protobuf的版本package fixbug; //聲明了代碼所在的包 (對(duì)于C來(lái)說(shuō)就是namespace)//下面的選項(xiàng),表示生成service服務(wù)類(lèi)和rpc方法描述, 默認(rèn)是不生成的 option cc_generi…

如何在proto中定義一個(gè)rpc服務(wù)?

syntax = "proto3"; //聲明protobuf的版本package fixbug;   //聲明了代碼所在的包 (對(duì)于C++來(lái)說(shuō)就是namespace)//下面的選項(xiàng),表示生成service服務(wù)類(lèi)和rpc方法描述, 默認(rèn)是不生成的
option cc_generic_services = true;message ResultCode{  //定義返回的錯(cuò)誤碼int32 errcode = 1;bytes errmsg = 2;
}//常用的數(shù)據(jù)類(lèi)型: 數(shù)據(jù)、列表、映射表//定義登錄請(qǐng)求消息類(lèi)型   name   pwd
message LoginRequest{bytes name = 1;   //等于1表示這是第一個(gè)參數(shù),一般string的存儲(chǔ)定義為bytesbytes pwd = 2;// map<int32,string> test = 3; //映射表類(lèi)型
}//定義登錄響應(yīng)消息類(lèi)型
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;  //定義了一個(gè)列表數(shù)據(jù)類(lèi)型
}//在protobuf里面怎么定義描述rpc方法的類(lèi)型---service
service UserService{rpc Login(LoginRequest) returns(LoginResponse);rpc GetFriendsList(GetFriendsListRequest) returns(GetFriendsListResponse); 
}

關(guān)鍵字service用于定義rpc服務(wù),例如Userservice有兩個(gè)rpc服務(wù),分別是Login和GetFriendsList, 返回值分別就是上述定義的消息類(lèi)型。
老樣子,先執(zhí)行protoc xxx.proto --cpp_out=./ 生成對(duì)應(yīng)的xxx.pb.cc 和 xxx.pb.h文件。
需要注意的是選項(xiàng)option cc_generic_services = true;得加上,默認(rèn)是不生成的。
這邊來(lái)分析xxx.pb.h文件,簡(jiǎn)單探究一下rpc調(diào)用過(guò)程:

//!!!!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();
}

可以看到一個(gè)UserService這個(gè)類(lèi),這個(gè)和message關(guān)鍵字有異曲同工之妙,都是對(duì)應(yīng)的一個(gè)類(lèi),只不過(guò)繼承的基類(lèi)是有所不同的, message消息類(lèi)型繼承于抽象類(lèi)message, service服務(wù)類(lèi)型繼承于抽象類(lèi)service。此外可以發(fā)現(xiàn)在類(lèi)中實(shí)現(xiàn)了在proto文件中定義的兩個(gè)rpc方法Login和GetFriendsList, 其中兩個(gè)參數(shù)是很熟悉的,request和response,也即這個(gè)rpc方法的需要用到的調(diào)用參數(shù),類(lèi)型message基類(lèi)指針,表示可以接受任意消息類(lèi)型。
由此可知UserService類(lèi)是一個(gè)服務(wù)提供者(Callee)

再來(lái)看另一個(gè)類(lèi)

//!!!!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);
}

可以看見(jiàn)這個(gè)類(lèi)沒(méi)有無(wú)參構(gòu)造,有幾個(gè)RpcChannel*參數(shù)傳遞的構(gòu)造方法,,不妨看看RpcChannel類(lèi):

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);
};

很顯然,這是個(gè)抽象基類(lèi),需要用戶(hù)自己實(shí)現(xiàn)派生類(lèi)重寫(xiě)基類(lèi)的CallMethod方法
在之后login和GetFriendsList兩個(gè)方法基本調(diào)用方式一樣,都是通過(guò)_channel調(diào)用CallMethod方法執(zhí)行對(duì)應(yīng)rpc調(diào)用,那么可知UserService_Stub是服務(wù)消費(fèi)者(Caller)

如何發(fā)布一個(gè)本地rpc服務(wù)?

#include <iostream>
#include <string>
#include "user.pb.h"
class UserService : public fixbug::UserServiceRpc    //使用rpc服務(wù)發(fā)布端(rpc服務(wù)提供者)
{
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;}    /*** 重寫(xiě)基類(lèi)UserServiceRpc的虛函數(shù) 下面這些方法都是框架直接調(diào)用的* caller   ===> Login(LoginRequest)  ==> transmit ==>  callee* callee   ===> Login(LoginRequest) ===> 調(diào)用下述的Login方法* */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 res = Login(name, pwd);//把響應(yīng)寫(xiě)入 包括錯(cuò)誤碼、錯(cuò)誤消息、返回值response->set_success(0);fixbug::ResultCode* rc = response->mutable_result();rc->set_errcode(0);rc->set_errmsg("");//執(zhí)行回調(diào)操作   執(zhí)行響應(yīng)對(duì)象數(shù)據(jù)的序列化和網(wǎng)絡(luò)發(fā)送(由框架來(lái)完成)done->Run();}
};

繼承對(duì)應(yīng)的UserServiceRpc服務(wù)提供者,重寫(xiě)其基類(lèi)方法即可。
上面只是發(fā)布過(guò)程,具體rpc調(diào)用待續(xù)。。。

http://www.risenshineclean.com/news/11404.html

相關(guān)文章:

  • 景區(qū)網(wǎng)站建設(shè)網(wǎng)絡(luò)營(yíng)銷(xiāo)的步驟
  • 網(wǎng)站建設(shè)費(fèi)攤銷(xiāo)年限seo獨(dú)立站優(yōu)化
  • 湖北做網(wǎng)站系統(tǒng)哪家好百度貼吧網(wǎng)頁(yè)版
  • 個(gè)人做企業(yè)網(wǎng)站制作要多少錢(qián)推廣服務(wù)公司
  • 廣州技術(shù)支持 網(wǎng)站建設(shè)清遠(yuǎn)疫情防控措施
  • wordpress中文tag優(yōu)化設(shè)計(jì)答案五年級(jí)上冊(cè)
  • 廣州做網(wǎng)站建設(shè)哪家專(zhuān)業(yè)百度頁(yè)面
  • 中國(guó)建設(shè)招標(biāo)網(wǎng)住建部網(wǎng)站seo免費(fèi)推廣軟件
  • 怎樣做p2p網(wǎng)站福建百度推廣
  • 網(wǎng)站正在建設(shè)中 英語(yǔ)翻譯seo體系百科
  • 群暉 nas 做網(wǎng)站自媒體平臺(tái)注冊(cè)官網(wǎng)
  • 網(wǎng)站建設(shè)初衷宣傳推廣網(wǎng)絡(luò)推廣
  • 西部數(shù)碼網(wǎng)站源碼正規(guī)的代運(yùn)營(yíng)公司
  • wordpress多站點(diǎn)無(wú)css百度推廣競(jìng)價(jià)排名
  • wordpress允許游客支付seo流量是什么
  • 網(wǎng)站建設(shè)(中企動(dòng)力)頂尖文案
  • 深圳網(wǎng)站設(shè)計(jì)公司電商培訓(xùn)機(jī)構(gòu)靠譜嗎
  • 漂亮的博客網(wǎng)站模板汕頭seo代理
  • 杭州 專(zhuān)業(yè)網(wǎng)站建設(shè) 網(wǎng)絡(luò)服務(wù)廣東疫情最新通報(bào)
  • 做公司網(wǎng)站的推廣工作怎樣成都私人網(wǎng)站制作
  • 做網(wǎng)站需要哪些軟件電商項(xiàng)目策劃書(shū)
  • 集約化網(wǎng)站建設(shè)淘寶推廣費(fèi)用多少錢(qián)一天
  • 建網(wǎng)站wordpress百度推廣開(kāi)戶(hù)公司
  • 長(zhǎng)春做網(wǎng)站 長(zhǎng)春萬(wàn)網(wǎng)關(guān)鍵詞推廣操作
  • 做動(dòng)態(tài)網(wǎng)站有什么較好的主題seo外貿(mào)公司推廣
  • 做電子的外單網(wǎng)站有哪些的交換友情鏈接平臺(tái)
  • 網(wǎng)站右下角彈出廣告代碼semantic scholar
  • 網(wǎng)站建設(shè)如何就接入支付寶推廣平臺(tái)app
  • 如何查看網(wǎng)站訪(fǎng)問(wèn)日志文件網(wǎng)頁(yè)優(yōu)化公司
  • 通過(guò)云主機(jī)建設(shè)網(wǎng)站西安企業(yè)seo