国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Rpc服務(wù)消費(fèi)者(Rpc服務(wù)調(diào)用者)實(shí)現(xiàn)思路

這篇具有很好參考價(jià)值的文章主要介紹了Rpc服務(wù)消費(fèi)者(Rpc服務(wù)調(diào)用者)實(shí)現(xiàn)思路。希望對大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

Rpc服務(wù)消費(fèi)者(Rpc服務(wù)調(diào)用者)實(shí)現(xiàn)思路

前面幾節(jié)說到Rpc消費(fèi)者主要通過UserServiceRPc_Stub這個(gè)protobuf幫我們生成的類來實(shí)現(xiàn),上代碼回顧一下

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可以看做是一個(gè)給用戶提供rpc遠(yuǎn)程調(diào)用的代理類,這里面有rpcclient和rpcserver約定好的遠(yuǎn)程方法Login,Login方法是調(diào)用了一個(gè)channel_的callMethod方法,那么聯(lián)想到其他服務(wù)方法應(yīng)該也是底層調(diào)用了這個(gè)函數(shù)(底層根據(jù)method的索引來區(qū)分具體的method),那么這個(gè)方法具體如何工作的?這個(gè)類需要接受一個(gè)RpcChannel類作為參數(shù),看看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);
};

很簡單就是一個(gè)抽象類,有個(gè)純虛函數(shù)CallMethod需要rpc_stub來實(shí)現(xiàn)。要實(shí)現(xiàn)rpcService_Stub,顯然先需要具體化一個(gè)MyRpcChannel類,這個(gè)MyRpcChannel類繼承自RpcChannel 類,最后通過多態(tài)調(diào)用在callMethod方法里面完成rpc遠(yuǎn)程調(diào)用的過程。那么具體怎么進(jìn)行?

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個(gè)參數(shù),第一個(gè)controller先不用管,顯然第四個(gè)參數(shù)done也不需要管因?yàn)樽鳛閞pc消費(fèi)者不需要在將什么結(jié)果反饋給rpc提供者。那么就只需要傳遞兩個(gè)參數(shù),request即是rpc_stub封裝用戶端請求的參數(shù),response即是在遠(yuǎn)程調(diào)用完成之后rpcserver幫rpcclient填寫的,然后rpc_stub只需要反序列化出來結(jié)果反饋給用戶即可,那么基本實(shí)現(xiàn)思路就有了:
step1實(shí)現(xiàn)MyRpcchannel類,繼承自RpcChannel ,并重寫其CallMethod方法,CallMethod實(shí)現(xiàn)有如下幾小步
step1.1:獲取具體服務(wù)名和方法名以及將用戶傳入的request序列化,最終封裝成一個(gè)字符流(header_size + service_name method_name args_size + args_str)

//獲取服務(wù)名和方法名
    const google::protobuf::ServiceDescriptor* service = method->service();
    std::string service_name = service->name();   //service_name
    std::string method_name = method->name();     //method_name


//獲取參數(shù)的序列化字符串長度 args_size
    std::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請求的Header
    RpcHeader 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;
    }

    //組織待發(fā)送的rpc請求的字符串
    std::string send_rpc_str;
    send_rpc_str.insert(0, std::string((char*)&header_size, 4)); // header_size
    send_rpc_str += rpc_header_str; //rpcHeader
    send_rpc_str += args_str; //args

step1.2:連接遠(yuǎn)程rpcServer服務(wù)器(可以是不同機(jī)器上的不同進(jìn)程,也可以是在不同的機(jī)器上)
connect to rpcServer
step1.2:將封裝的rpc字符流通過socket發(fā)送給RpcServer(遠(yuǎn)程rpc調(diào)用請求)
send----->send_rpc_str
step1.3:阻塞等待rpcServer的響應(yīng),并將響應(yīng)飯序列化出來給用戶端。
recv------>recv_buf

//反序列化rpc調(diào)用的響應(yīng)數(shù)據(jù)
    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:用戶創(chuàng)建UserServiceRpc_Stub類對象,并將MyRpcchannel實(shí)例對象傳入進(jìn)行構(gòu)造。最后通過UserServiceRpc_Stub對象實(shí)例調(diào)用對應(yīng)的rpc服務(wù)。(實(shí)際調(diào)用的就是上述實(shí)現(xiàn)的CallMethod方法)

	fixbug::UserServiceRpc_Stub stub(new MyRpcChannel());
    
    //rpc方法的請求參數(shù)
    fixbug::LoginRequest request;
    request.set_name("zhang san");
    request.set_pwd("123");
    //rpc方法的響應(yīng),同步的rpc調(diào)用過程
    fixbug::LoginResponse response;
    stub.Login(nullptr, &request, &response, nullptr);   //RpcChannel-->Rpchannel::callMethod 集中來做所有rpc方法調(diào)用的參數(shù)序列化和網(wǎng)絡(luò)發(fā)送

step3:處理阻塞的響應(yīng)消息response做相應(yīng)的業(yè)務(wù)處理。

 //一次rpc調(diào)用完成,讀調(diào)用的結(jié)果
    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基本實(shí)現(xiàn)。文章來源地址http://www.zghlxwxcb.cn/news/detail-624287.html

到了這里,關(guān)于Rpc服務(wù)消費(fèi)者(Rpc服務(wù)調(diào)用者)實(shí)現(xiàn)思路的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 分布式消息隊(duì)列Kafka(四)- 消費(fèi)者

    分布式消息隊(duì)列Kafka(四)- 消費(fèi)者

    1.Kafka消費(fèi)方式 2.Kafka消費(fèi)者工作流程 (1)總體工作流程 (2)消費(fèi)者組工作流程 3.消費(fèi)者API (1)單個(gè)消費(fèi)者消費(fèi) 實(shí)現(xiàn)代碼 (2)單個(gè)消費(fèi)者指定分區(qū)消費(fèi) 代碼實(shí)現(xiàn): (3)消費(fèi)者組消費(fèi) 復(fù)制上面CustomConsumer三個(gè),同時(shí)去訂閱統(tǒng)一個(gè)主題,消費(fèi)數(shù)據(jù),發(fā)現(xiàn)一個(gè)分區(qū)只能被一個(gè)

    2023年04月26日
    瀏覽(33)
  • 分布式 - 消息隊(duì)列Kafka:Kafka消費(fèi)者的分區(qū)分配策略

    分布式 - 消息隊(duì)列Kafka:Kafka消費(fèi)者的分區(qū)分配策略

    Kafka 消費(fèi)者負(fù)載均衡策略? Kafka 消費(fèi)者分區(qū)分配策略? 1. 環(huán)境準(zhǔn)備 創(chuàng)建主題 test 有5個(gè)分區(qū),準(zhǔn)備 3 個(gè)消費(fèi)者并進(jìn)行消費(fèi),觀察消費(fèi)分配情況。然后再停止其中一個(gè)消費(fèi)者,再次觀察消費(fèi)分配情況。 ① 創(chuàng)建主題 test,該主題有5個(gè)分區(qū),2個(gè)副本: ② 創(chuàng)建3個(gè)消費(fèi)者CustomConsu

    2024年02月13日
    瀏覽(31)
  • 分布式 - 消息隊(duì)列Kafka:Kafka消費(fèi)者分區(qū)再均衡(Rebalance)

    分布式 - 消息隊(duì)列Kafka:Kafka消費(fèi)者分區(qū)再均衡(Rebalance)

    01. Kafka 消費(fèi)者分區(qū)再均衡是什么? 消費(fèi)者群組里的消費(fèi)者共享主題分區(qū)的所有權(quán)。當(dāng)一個(gè)新消費(fèi)者加入群組時(shí),它將開始讀取一部分原本由其他消費(fèi)者讀取的消息。當(dāng)一個(gè)消費(fèi)者被關(guān)閉或發(fā)生崩潰時(shí),它將離開群組,原本由它讀取的分區(qū)將由群組里的其他消費(fèi)者讀取。 分區(qū)

    2024年02月12日
    瀏覽(31)
  • Spring Cloud Alibaba【OpenFeign實(shí)現(xiàn)服務(wù)降級、Dubbo實(shí)現(xiàn)服務(wù)生產(chǎn)者、 Dubbo消費(fèi)者調(diào)用接口 】(三)

    Spring Cloud Alibaba【OpenFeign實(shí)現(xiàn)服務(wù)降級、Dubbo實(shí)現(xiàn)服務(wù)生產(chǎn)者、 Dubbo消費(fèi)者調(diào)用接口 】(三)

    目錄 服務(wù)調(diào)用_OpenFeign實(shí)現(xiàn)服務(wù)降級 服務(wù)調(diào)用_Dubbo實(shí)現(xiàn)服務(wù)生產(chǎn)者?

    2024年02月17日
    瀏覽(31)
  • [計(jì)網(wǎng)底層小探索]:實(shí)現(xiàn)并部署多線程并發(fā)Tcp服務(wù)器框架(基于生產(chǎn)者消費(fèi)者模型的線程池結(jié)構(gòu))

    [計(jì)網(wǎng)底層小探索]:實(shí)現(xiàn)并部署多線程并發(fā)Tcp服務(wù)器框架(基于生產(chǎn)者消費(fèi)者模型的線程池結(jié)構(gòu))

    網(wǎng)絡(luò)層與傳輸層 內(nèi)置于操作系統(tǒng)的內(nèi)核中 ,網(wǎng)絡(luò)層一般使用 ip 協(xié)議,傳輸層常用協(xié)議為 Tcp 協(xié)議和 Udp 協(xié)議, Tcp 協(xié)議和 Udp 協(xié)議擁有各自的特點(diǎn)和應(yīng)用場景: sockaddr_in 結(jié)構(gòu)體用于存儲網(wǎng)絡(luò)通信主機(jī)進(jìn)程的 ip 和端口號等信息 小項(xiàng)目的完整文件的gittee鏈接 Tcp 服務(wù)器架構(gòu): 序列反序列

    2024年02月22日
    瀏覽(23)
  • Eureka(F版本)教程二 服務(wù)消費(fèi)者

    Eureka(F版本)教程二 服務(wù)消費(fèi)者

    service-ribbon 0.0.1-SNAPSHOT service-ribbon jar Demo project for Spring Boot java.version1.8/java.version spring-cloud.versionGreenwich.SR2/spring-cloud.version org.springframework.cloud spring-cloud-starter-netflix-eureka-client org.springframework.boot spring-boot-starter-web org.springframework.cloud spring-cloud-starter-netflix-ribbon org.springframewor

    2024年04月12日
    瀏覽(24)
  • 三,創(chuàng)建訂單微服務(wù)消費(fèi)者 第三章

    三,創(chuàng)建訂單微服務(wù)消費(fèi)者 第三章

    ? ? ? 因?yàn)??支付提供者端的代碼如下 ? ? ?

    2024年02月15日
    瀏覽(21)
  • (18)不重啟服務(wù)動態(tài)停止、啟動RabbitMQ消費(fèi)者

    ????????我們在消費(fèi)RabbitMQ消息的過程中,有時(shí)候可能會想先暫停消費(fèi)一段時(shí)間,然后過段時(shí)間再啟動消費(fèi)者,這個(gè)需求怎么實(shí)現(xiàn)呢?我們可以借助RabbitListenerEndpointRegistry這個(gè)類來實(shí)現(xiàn),它的全類名是org.springframework.amqp.rabbit.listener.RabbitListenerEndpointRegistry,通過這個(gè)類可以

    2024年02月09日
    瀏覽(17)
  • 服務(wù)提供者 Eureka + 服務(wù)消費(fèi)者(Rest + Ribbon)實(shí)戰(zhàn)

    服務(wù)提供者 Eureka + 服務(wù)消費(fèi)者(Rest + Ribbon)實(shí)戰(zhàn)

    Ribbon是Netflix發(fā)布的開源項(xiàng)目,主要功能是提供客戶端的軟件負(fù)載均衡算法,將Netflix的中間層服務(wù)連接在一起。Ribbon客戶端組件提供一系列完善的配置項(xiàng)如連接超時(shí),重試等。簡單來說,就是在配置文件中列出Load Balancer(簡稱LB)后面所有的機(jī)器,Ribbon會自動的幫助你基于某

    2024年02月04日
    瀏覽(23)
  • 實(shí)現(xiàn) Kafka 分區(qū)內(nèi)消費(fèi)者多線程順序消費(fèi)

    生產(chǎn)者在寫的時(shí)候,可以指定一個(gè) key,被分發(fā)到同一個(gè) partition 中去,而且這個(gè) partition 中的數(shù)據(jù)一定是有順序的。 消費(fèi)者從 partition 中取出來數(shù)據(jù)的時(shí)候,也一定是有順序的。到這里,順序還是沒有錯(cuò)亂的。 但是消費(fèi)者里可能會有多個(gè)線程來并發(fā)處理消息,而多個(gè)線程并發(fā)

    2024年02月07日
    瀏覽(21)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包