1万行代码,单机50万QPS,今年最值得学习的开源RPC框架!

58沈剑 2021-11-25 19:17:28
代码 单机 今年 万行 qps

又发现一个不错的,工业级的,高性能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://blog.csdn.net/shenjian58/article/details/121528639

  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