<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          1萬行代碼,單機50萬QPS,今年最值得學(xué)習(xí)的開源RPC框架!

          共 3802字,需瀏覽 8分鐘

           ·

          2021-11-26 22:33

          又發(fā)現(xiàn)一個不錯的,工業(yè)級的,高性能RPC框架srpc,分享給大家。

          (1)RPC簡介;

          (2)行業(yè)常見RPC框架;

          (3)srpc特點;

          (4)srpc上手指南,demo示例;

          (5)srpc架構(gòu)設(shè)計;

          (6)srpc相關(guān)資料與資源;

          文章較長,建議提前收藏。


          什么是RPC?
          Remote Procedure Call遠(yuǎn)程過程調(diào)用

          什么是“遠(yuǎn)程”,為什么“遠(yuǎn)”?
          先來看下什么是“近”,即“本地函數(shù)調(diào)用”。

          當(dāng)我們寫下:

          int result = Add(1, 2);

          這行代碼的時候,到底發(fā)生了什么?

          (1)遞兩個入?yún)ⅲ?/span>
          (2)調(diào)用了本地代碼段中的函數(shù),執(zhí)行運算邏輯;
          (3)返回一個出參;
          這三個動作,都發(fā)生在同一個進(jìn)程空間里,這是本地函數(shù)調(diào)用。

          那有沒有辦法,調(diào)用一個跨進(jìn)程的函數(shù)呢?
          典型的,這個進(jìn)程部署在另一臺服務(wù)器上。

          最容易想到的,兩個進(jìn)程約定一個協(xié)議格式,使用Socket通信,來傳輸:
          (1)入?yún)ⅲ?/span>
          (2)調(diào)用哪個函數(shù);
          (3)出參;
          如果能夠?qū)崿F(xiàn),那這就是“遠(yuǎn)程”過程調(diào)用。

          為什么需要RPC框架呢?
          如果沒有統(tǒng)一的RPC框架,各個團(tuán)隊的服務(wù)提供方就需要各自實現(xiàn)一套序列化、反序列化、網(wǎng)絡(luò)框架、連接池、收發(fā)線程、超時處理、狀態(tài)機等“業(yè)務(wù)之外”的重復(fù)技術(shù)勞動,造成整體的低效。

          RPC框架的職責(zé),就是要屏蔽各種復(fù)雜性:
          (1)調(diào)用方client感覺就像調(diào)用本地函數(shù)一樣,來調(diào)用服務(wù);
          (2)提供方server感覺就像實現(xiàn)一個本地函數(shù)一樣,來實現(xiàn)服務(wù);

          有哪些常見的,出圈的RPC框架呢?
          (1)gRPC,Google出品,支持多語言;
          (2)Thrift,F(xiàn)acebook出品,支持多語言;
          (3)Dubbo,阿里開源的,支持Java;
          (4)bRPC,百度開源的,支持C++,Java;
          (5)tRPC,騰訊RPC框架,支持多語言;
          (6)...
          畫外音:還有哪些?

          今天和大家分享的srpc,作者是搜狗的媛架構(gòu)師liyingxin,基于WF,代碼量1W左右
          (1)非常適合用來學(xué)習(xí)RPC的架構(gòu)設(shè)計;
          (2)又是一個工業(yè)級的產(chǎn)品,QPS可以到50W,應(yīng)該是行業(yè)能目前性能最好的RPC框架了吧,有不少超高并發(fā)的線上應(yīng)用都使用它。
          畫外音:不服?來戰(zhàn)!

          什么是srpc?
          基于WF的輕量級,超高性能,工業(yè)級RPC框架,兼容多協(xié)議,例如百度bRPC,騰訊tRPC,Google的gRPC,以及FB的thrift協(xié)議。

          srpc有些什么特點?
          (1)支持多種IDL格式,包括Protobuf,Thrift等,對于這類項目,可以一鍵遷移;
          (2)支持多種序列化方式,包括Protobuf,Thrift,json等;
          (3)支持多壓縮方法,對應(yīng)用透明,包括gzip,zlib,lz4,snappy等;
          (4)支持多協(xié)議,對應(yīng)用透明,包括http,https,ssl,tcp等;
          (5)高性能

          不同客戶端線程壓力下的性能表現(xiàn)非常穩(wěn)定,QPS在50W左右,優(yōu)于同等壓測配置的bRPC與thrift。
          (6)輕量級,低門檻,1W行左右代碼,只需引入一個靜態(tài)庫;

          如何快速上手,體驗這個帥氣的RPC框架呢?
          簡單來說,只需要三個步驟。

          第一步:定義IDL描述文件。

          syntax = "proto3";// proto2 or proto3


          message EchoRequest {

             string message = 1;

             string name = 2;

          };


          message EchoResponse {

             string message = 1;

          };


          service Example {

             rpc Echo(EchoRequest) returns (EchoResponse);

          };


          第二步:生成代碼,并實現(xiàn)ServiceIMPLserver端就搞定了。

          class ExampleServiceImpl : public Example::Service

          {

          public:

             void Echo(EchoRequest *request,

                  EchoResponse *response,

                  RPCContext *ctx) override

              {

                 response->set_message("Hi, " + request->name());

              }

          };

          make一把,一氣呵成。


          第三步:自己定義一個請求客戶端,向服務(wù)端發(fā)送echo請求。

          int main()

          {

             Example::SRPCClient client("127.0.0.1", 1412);

             EchoRequest req;

             req.set_message("Hello, srpc!");

             req.set_name("zhangsan");


             client.Echo(&req, 

                  [](EchoResponse *response, RPCContext *ctx){});

             return 0;

          }

          文末的資料集里,有非常詳細(xì)的手冊鏈接,一步步照著來就行。


          srpc的架構(gòu)設(shè)計思路是怎樣的?

          作為一個RPC框架,srpc的架構(gòu)是異常清晰的,用戶需要關(guān)注這3個層次
          (1)IDL接口描述文件層
          (2)RPC序列化協(xié)議層
          (3)網(wǎng)絡(luò)通訊層

          同時,每一層次又提供了多種選擇,用戶可以任意的組合:

          如上圖所示:
          (1)IDL層,用戶可以選擇Protobuf或者Thrift;
          (2)協(xié)議層,可以選擇Thrift,bRPC,tRPC等;
          畫外音:因此,才能和其他RPC框架無縫互通。
          (3)通信層,可以選擇tcp或者h(yuǎn)ttp;

          在此分層架構(gòu)之下,RPC的客戶端要做什么工作,RPC的服務(wù)端要做什么工作,srpc框架又做了什么工作呢?

          首先必須在IDL中要定義好:
          (1)邏輯請求包request;
          (2)邏輯響應(yīng)包response;
          (3)服務(wù)接口函數(shù)method;

          RPC-client的工作就異常簡單了:
          (1)調(diào)用method;
          (2)綁定回調(diào)函數(shù),處理回調(diào);
          對應(yīng)上圖中頂部方框的綠色部分

          RPC-server的工作也非常簡單,像實現(xiàn)一個本地函數(shù)一樣,提供遠(yuǎn)程的服務(wù):
          (1)實現(xiàn)method;
          (2)接受request,邏輯處理,返回response;
          對應(yīng)上圖中底部方框的黃色部分

          srpc框架完成了絕大部分的工作:
          (1)對request序列化,壓縮,處理生成二進(jìn)制報文;
          (2)連接池,超時,任務(wù)隊列,異步等處理;
          (3)對request二進(jìn)制報文處理,解壓縮,反序列化;
          ...
          對應(yīng)上圖中中間的方框的紅色部分,以及大部分流程。

          在這個過程中,srpc采用插件化設(shè)計,各種復(fù)雜性細(xì)節(jié),對接口調(diào)用方與服務(wù)提供方,都是透明的,并且具備良好的擴展性

          如上圖所示,用戶只需要關(guān)注IDL,即邏輯請求,響應(yīng),接口的調(diào)用與實現(xiàn)。框架層面,將各種能力以插件的方式集成進(jìn)來,向用戶提供不同能力的組合選擇。

          另外,定義好IDL之后,服務(wù)端的代碼可以利用框架提供的工具自動生成代碼,業(yè)務(wù)服務(wù)提供方,只需要專注于業(yè)務(wù)接口的實現(xiàn)即可,你說帥氣不帥氣?
          畫外音:具體的生成工具,與生成方法,請參看git上的文檔。

          最后,我覺得這個srpc最帥氣的地方之一,就是:開源版本即線上工程版本,更新快,issue響應(yīng)快,并且文檔真的很全
          畫外音:不少大公司,公司內(nèi)部的版本和開源的版本是兩套代碼,開源版本沒有文檔,KPI完成之后,開源就沒人維護(hù)了,結(jié)果坑了一大票人。

          文章的結(jié)尾,分享一些學(xué)習(xí)資源吧。

          項目地址:https://github.com/sogou/srpc

          項目demo:

          README_cn.md

          項目架構(gòu)設(shè)計:

          docs/wiki.md


          作者知乎:

          https://www.zhihu.com/people/liyingxin1412/posts


          作者聯(lián)系方式:

          發(fā)現(xiàn)bug可以隨時提交給她,響應(yīng)絕對快速。

          項目地址https://github.com/sogou/srpc
          Star:800+
          畫外音:srpc還有很多優(yōu)秀的設(shè)計,等待大家去挖掘。

          末了,希望這個1W行代碼的RPC框架,能夠幫助大家更透徹的了解RPC的底層原理。

          閱讀原文直達(dá)代碼,歡迎標(biāo)星。
          瀏覽 78
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  亚洲中文字幕2022 | 日韩欧美中文 | 大屌视频网 | 久久三级片视频 | 无码在线观看一区二区三区 |