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

58沈劍 2021-11-25 19:17:48
qps 今年 rpc 框架

又發現一個不錯的,工業級的,高性能RPC框架srpc,分享給大家。

(1)RPC簡介;

(2)行業常見RPC框架;

(3)srpc特點;

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

(5)srpc架構設計;

(6)srpc相關資料與資源;

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

什麼是RPC?

Remote Procedure Call,遠程過程調用。

什麼是“遠程”,為什麼“遠”?

先來看下什麼是“近”,即“本地函數調用”。

當我們寫下:

int result = Add(1, 2);

這行代碼的時候,到底發生了什麼?

a9e264ceefc331fb37461d24267eabc8.png

(1)傳遞兩個入參;

(2)調用了本地代碼段中的函數,執行運算邏輯;

(3)返回一個出參;

這三個動作,都發生在同一個進程空間裏,這是本地函數調用。

那有沒有辦法,調用一個跨進程的函數呢?

典型的,這個進程部署在另一臺服務器上。

42b71bf7bacd31540a15d7006a4bf55f.png

最容易想到的,兩個進程約定一個協議格式,使用Socket通信,來傳輸:

(1)入參;

(2)調用哪個函數;

(3)出參;

如果能够實現,那這就是“遠程”過程調用。

為什麼需要RPC框架呢?

如果沒有統一的RPC框架,各個團隊的服務提供方就需要各自實現一套序列化、反序列化、網絡框架、連接池、收發線程、超時處理、狀態機等“業務之外”的重複技術勞動,造成整體的低效。

RPC框架的職責,就是要屏蔽各種複雜性:

(1)調用方client感覺就像調用本地函數一樣,來調用服務;

(2)提供方server感覺就像實現一個本地函數一樣,來實現服務;

有哪些常見的,出圈的RPC框架呢?

(1)gRPC,Google出品,支持多語言;

(2)Thrift,Facebook出品,支持多語言;

(3)Dubbo,阿裏開源的,支持Java;

(4)bRPC,百度開源的,支持C++,Java;

(5)tRPC,騰訊RPC框架,支持多語言;

(6)...

畫外音:還有哪些?

今天和大家分享的srpc,作者是搜狗的媛架構師liyingxin,基於WF,代碼量1W左右:

(1)非常適合用來學習RPC的架構設計;

(2)又是一個工業級的產品,QPS可以到50W,應該是行業能目前性能最好的RPC框架了吧,有不少超高並發的線上應用都使用它。

畫外音:不服?來戰!

什麼是srpc?

基於WF的輕量級,超高性能,工業級RPC框架,兼容多協議,例如百度bRPC,騰訊tRPC,Google的gRPC,以及FB的thrift協議。

srpc有些什麼特點?

(1)支持多種IDL格式,包括Protobuf,Thrift等,對於這類項目,可以一鍵遷移;

(2)支持多種序列化方式,包括Protobuf,Thrift,json等;

(3)支持多壓縮方法,對應用透明,包括gzip,zlib,lz4,snappy等;

(4)支持多協議,對應用透明,包括http,https,ssl,tcp等;

(5)高性能;

18042874de92e823ce392053708863e6.png

不同客戶端線程壓力下的性能錶現非常穩定,QPS在50W左右,優於同等壓測配置的bRPC與thrift。

(6)輕量級,低門檻,1W行左右代碼,只需引入一個靜態庫;

如何快速上手,體驗這個帥氣的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);

};

第二步:生成代碼,並實現ServiceIMPL,server端就搞定了。

class ExampleServiceImpl : public Example::Service

{

public:

   void Echo(EchoRequest *request,

        EchoResponse *response,

        RPCContext *ctx) override

    {

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

    }

};

make一把,一氣呵成。

第三步:自己定義一個請求客戶端,向服務端發送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;

}

文末的資料集裏,有非常詳細的手册鏈接,一步步照著來就行。

srpc的架構設計思路是怎樣的?

作為一個RPC框架,srpc的架構是异常清晰的,用戶需要關注這3個層次:

(1)IDL接口描述文件層

(2)RPC序列化協議層

(3)網絡通訊層

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

d7d6308078fa9188b020dc5deb1d65fc.png

如上圖所示:

(1)IDL層,用戶可以選擇Protobuf或者Thrift;

(2)協議層,可以選擇Thrift,bRPC,tRPC等;

畫外音:因此,才能和其他RPC框架無縫互通。

(3)通信層,可以選擇tcp或者http;

在此分層架構之下,RPC的客戶端要做什麼工作,RPC的服務端要做什麼工作,srpc框架又做了什麼工作呢?

首先必須在IDL中要定義好:

(1)邏輯請求包request;

(2)邏輯響應包response;

(3)服務接口函數method;

e1191f76afb7a2932830f77337239de7.png

RPC-client的工作就异常簡單了:

(1)調用method;

(2)綁定回調函數,處理回調;

對應上圖中頂部方框的綠色部分。

RPC-server的工作也非常簡單,像實現一個本地函數一樣,提供遠程的服務:

(1)實現method;

(2)接受request,邏輯處理,返回response;

對應上圖中底部方框的黃色部分。

srpc框架完成了絕大部分的工作:

(1)對request序列化,壓縮,處理生成二進制報文;

(2)連接池,超時,任務隊列,异步等處理;

(3)對request二進制報文處理,解壓縮,反序列化;

...

對應上圖中中間的方框的紅色部分,以及大部分流程。

在這個過程中,srpc采用插件化設計,各種複雜性細節,對接口調用方與服務提供方,都是透明的,並且具備良好的擴展性

94f34b8acb73832bd34b3a6651d7c22e.png

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

另外,定義好IDL之後,服務端的代碼可以利用框架提供的工具自動生成代碼,業務服務提供方,只需要專注於業務接口的實現即可,你說帥氣不帥氣?

畫外音:具體的生成工具,與生成方法,請參看git上的文檔。

最後,我覺得這個srpc最帥氣的地方之一,就是:開源版本即線上工程版本,更新快,issue響應快,並且文檔真的很全!

畫外音:不少大公司,公司內部的版本和開源的版本是兩套代碼,開源版本沒有文檔,KPI完成之後,開源就沒人維護了,結果坑了一大票人。

文章的結尾,分享一些學習資源吧。

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

項目demo:

e53263b8d74e8670c3ad5613c3fc8939.png

README_cn.md

項目架構設計:

45481b539f0238e5c509c7ef8b57fedf.png

docs/wiki.md

作者知乎:

e5d1c62dda5c1508fcf07b46cece6c95.png

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

作者聯系方式:

865dad08d9b39ef15507b9ce6a9d27c3.png

發現bug可以隨時提交給她,響應絕對快速。

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

Star:800+

畫外音:srpc還有很多優秀的設計,等待大家去挖掘。

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

閱讀原文,直達代碼,歡迎標星。

版权声明
本文为[58沈劍]所创,转载请带上原文链接,感谢
https://javamana.com/2021/11/20211125191700023l.html

  1. Fonction de flèche JavaScript
  2. JavaScript - déconstruction assignations
  3. Building CentOS 7.6 with Linux
  4. JavaScript - type d'emballage
  5. linux deepin/ubuntu安装flameshot火焰截图
  6. JavaScript - encapsulation et héritage (deux)
  7. JavaScript JS method for writing 99 multiplication table
  8. 從零開始學java - 第二十五天
  9. Apprendre Java à partir de zéro - jour 25
  10. Les voitures d'hiver, les voitures électriques et les voitures à essence ne sont pas les mêmes?
  11. JavaScript - ceci pointe vers le problème
  12. Copie JavaScript
  13. Spring boot quickly integrates swagger
  14. linux deepin/ubuntu安裝flameshot火焰截圖
  15. Capture d'écran de flamme de l'installateur de flamme Linux deepin / Ubuntu
  16. Jquery DOM et jquery, fonctions d'entrée (bases)
  17. Méthode d'instance jquery
  18. Méthode et démonstration de code dans l'interface de liste en Java
  19. 【错误记录】Java 中 ArrayList 排序 ( 使用 Comparator 接口时注意 compare 返回值是 -1 和 +1 )
  20. Démarrage du Zookeeper
  21. Java oom Cognition
  22. Java 开发者最困惑的四件事,值得一看!,BAT面试文档
  23. Java 将两个对象list里面的 某个字段值抽取到一个list里,java选择排序原理
  24. Java 多线程 —— 生产者消费者问题,从基础到深入案例
  25. Java 中设计模式 之 工厂模式,java反射机制的底层原理
  26. 【錯誤記錄】Java 中 ArrayList 排序 ( 使用 Comparator 接口時注意 compare 返回值是 -1 和 +1 )
  27. 【 enregistrement des erreurs 】 tri ArrayList en Java (Notez que les valeurs de retour de comparaison sont - 1 et + 1 lors de l'utilisation de l'interface de comparaison)
  28. Pourquoi Xiaopeng P5 est - il devenu un grand succès dans le cercle? Le Salon de l'automobile de Guangzhou montre encore des compétences polyvalentes
  29. Java 開發者最困惑的四件事,值得一看!,BAT面試文檔
  30. Les quatre choses les plus déroutantes pour les développeurs Java valent la peine d'être regardées! Document d'entrevue sur les MTD
  31. k8s-Pod污点与容忍
  32. k8s-Pod污点与容忍
  33. K8s POD Contamination and Tolerance
  34. K8s POD Contamination and Tolerance
  35. mysql常用语句——GROUP BY和HAVING
  36. Spring boot quickly integrates swagger
  37. mysql常用語句——GROUP BY和HAVING
  38. MySQL Common statements - group by and having
  39. Le défi du pinceau leetcode - Javascript: 110. Arbre binaire équilibré
  40. [notes d'apprentissage de première ligne] day44: XMLHttpRequest
  41. java调用RFC延长调用时间
  42. java調用RFC延長調用時間
  43. Java call RFC prolonge le temps d'appel
  44. Le modèle d'usine du modèle de conception en Java, le principe sous - jacent du mécanisme de réflexion Java
  45. Java Multithreading - producer Consumer issues, From Basic to Deep case
  46. OushuDB 安装与升级之安装 HDFS
  47. OushuDB 安装与升级之安装 Zookeeper
  48. Java-String-对象,你真的了解了吗?,mysql教程入门到精通
  49. Linux引导过程与服务控制
  50. Java-8新特性:学习如何使用Lambda表达式(一,线程池的实现原理
  51. Java 读写锁 ReentrantReadWriteLock 源码分析,headfirstjavapdf百度云
  52. JAVA 获取系统日期时间,初级java开发常见的面试题
  53. MySQL judges the salary changes based on the existing data
  54. k8s-Pod污點與容忍
  55. Java extrait une valeur de champ de deux listes d'objets dans une liste, et Java sélectionne le principe de tri
  56. java中ArrayList应用实例,阿里巴巴java面试流程
  57. Java个人技术知识点总结(框架篇),kafka聊天服务器架构
  58. JavaWeb快速入门--Servlet(2),java程序设计精编教程第三版上机实践
  59. JavaWeb - 文件的上传,核心API的使用,文件下载,附学习笔记 面试整理 进阶书籍
  60. Netty原理:pipeline