微信开源C/C++ RPC框架PhxRPC

玉钏
• 阅读 2472

微信开源C/C++ RPC框架PhxRPC

PhxRPC是微信后台团队推出的一个非常简洁小巧的RPC框架,编译生成的库只有450K。

PhxRPC开源地址:

https://github.com/tencent-we...

总览

  • 使用Protobuf作为IDL用于描述RPC接口以及通信数据结构。
  • 基于Protobuf文件自动生成Client以及Server接口,用于Client的构建,以及Server的实现。
  • 半同步半异步模式,采用独立多IO线程,通过Epoll管理请求的接入以及读写,工作线程采用固定线程池。IO线程与工作线程通过内存队列进行交互。
  • 提供完善的过载保护,无需配置阀值,支持动态自适应拒绝请求。
  • 提供简易的Client/Server配置读入方式。
  • 基于lambda函数实现并发访问Server,可以非常方便地实现Google提出的 Backup Requests 模式。

局限

  • 不支持多进程模式。

性能

使用Sample目录下的Search RPC C/S进行Echo RPC调用的压测,相当于Worker空转情况。

运行环境

CPU:24 x Intel(R) Xeon(R) CPU E5-2620 v3 @ 2.40GHz
内存:32 GB
网卡:千兆网卡
Client/Server机器之间PING值: 0.05ms
请求写入并发:1000个线程
业务数据大小:除去HTTP协议部分20b
Worker线程数:20

性能测试结果(qps)

短连接
ucontext类型/IO线程13820
system4.1w8.5w9w9.2w
boost4.5w9.5w9.5w9.5w
长连接
ucontext类型/IO线程13820
system5.5w16w36w50w
boost6.2w17.5w41w50w

如何使用

编写proto文件

下面是sample目录下的proto文件样例。

 微信开源C/C++ RPC框架PhxRPC

生成代码
(PhxRPC根目录)/codegen/phxrpc_pb2server 
-I (PhxRPC根目录) -I (Protobuf include目录) -f (proto文件路径) -d (生成代码放置路径)#sample../codegen/phxrpc_pb2server -I ../ -I ../third_party/protobuf/include -f search.proto -d .调用完工具后,在生成代码放置目录下执行make,即可生成全部的RPC相关代码。
选择是否启用boost优化

打开生成代码放置目录下的Makefile文件。

#choose to use boost for network

#LDFLAGS := $(PLUGIN_BOOST_LDFLAGS) $(LDFLAGS)

可以看到以上两行,取消注释掉第二行,重新make clean, make即可开启boost对PhxRPC的优化。开启前记得编译好PhxRPC的boost插件。

补充自己的代码
Server(xxx_service_impl.cpp)

 微信开源C/C++ RPC框架PhxRPC

Client (xxx_client.cpp)

 微信开源C/C++ RPC框架PhxRPC

Client并发调用样例

 微信开源C/C++ RPC框架PhxRPC

uthread_begin, uthread_end, uthread_s, uthread_t这几个关键字是PhxRPC自定义的宏,分别表示协程的准备,结束,协程调度器以及协程的创建。

上面的代码实现了Google提出的 Backup Requests 模式。实现的功能是分别对两个Server同时发起Echo调用,当有一个Server响应的时候,则整个函数结束。在这段代码里面,我们提供了一种异步IO的同步写法,并给予了一些方便使用的宏定义。首先使用uthread_begin进行准备,然后使用uthread_t以lambda的形式创建一个协程,而在任意一个协程里面都可使用我们PhxRPC生成的Client API进行RPC调用,并可使用uthread_s随时结束所有RPC调用。最后的uthread_end真正通过协程调度发起这些lambda内的RPC调用,并等待结束。

当然你可以借用这4个宏定义,以同步代码的写法,进行更自定义的并发访问。

Server配置说明 (xxx_server.conf)

 微信开源C/C++ RPC框架PhxRPC

本文系微信后台团队,如有侵犯,请联系我们立即删除

hxRPC开源地址:

https://github.com/tencent-we...

OpenIMgithub开源地址:

https://github.com/OpenIMSDK/...

OpenIM官网 :https://www.rentsoft.cn

OpenIM官方论坛:https://forum.rentsoft.cn/

更多技术文章:

开源OpenIM:高性能、可伸缩、易扩展的即时通讯架构
https://forum.rentsoft.cn/thr...

【OpenIM原创】简单轻松入门 一文讲解WebRTC实现1对1音视频通信原理
https://forum.rentsoft.cn/thr...

点赞
收藏
评论区
推荐文章
捉虫大师 捉虫大师
3年前
小白也能看懂的dubbo3应用级服务发现详解
搜索关注微信公众号"捉虫大师",后端技术分享,架构设计、性能优化、源码阅读、问题排查、踩坑实践。本文已收录https://github.com/lkxiaolou/lkxiaolou欢迎star。dubbo是一款开源的RPC框架,主要有3个角色:提供者(provider)、消费者(consumer)、注册中心(registry)提供者启动时向
Wesley13 Wesley13
3年前
TBOOX开源社区论坛开通
TBOOX开源工程专注于c的跨平台开发,如果大家对TBOOX的项目或者对c语言跨平台开发感兴趣可以加入TBOOX开源社区互相交流或者反馈意见。。社区论坛地址:http://www.tboox.org/forum:)本文分享自微信公众号TBOOX开源工程(tbooxos)。如有侵权,请联系support@
Easter79 Easter79
3年前
Taro小程序自定义顶部导航栏
微信自带的顶部导航栏是无法支持自定义icon和增加元素的,在开发小程序的时候自带的根本满足不了需求,分享一个封装好的组件,支持自定义icon、扩展dom,适配安卓、ios、h5,全面屏。我用的是京东的Taro多端编译框架写的小程序,原生的也可以适用,用到的微信/taro的api做调整就行,实现效果如下。!在这里插入图片描述(https://i
Stella981 Stella981
3年前
Chrome扩展推荐:微信变弹幕,追剧也不错过新消息
!(https://oscimg.oschina.net/oscnet/0d0a4825f8c04848a39a1b965e4a19f2.png)微信弹幕虽然微信网页版可以让用户在使用电脑上网时减少查看手机的频率,但不管是微信网页版还是PC客户端,都有它的不便之处。缺少了手机顶部通知栏类似的功能,我们在用电脑登陆微
Stella981 Stella981
3年前
MoChat企业微信开源系统,让开发者快速搭建基于企业微信的私域流量运营系统
“经过行业的实战应用,企业微信已经成为”私域流量“运营的主要工具”尽管现在基于企业微信开发的第三方产品处于一个百家争鸣的时代,但仍旧未能看到一个开源的、真正为企业微信应用开发服务铺路的框架&引擎,此为Mo.Chat开源框架及其团队成员的初衷,做市场上最好用的开源企业微信应用开发框架。Mo.Chat开源框架提供开箱即用的企业微信管理工具,源代码1
Stella981 Stella981
3年前
MoChat企业微信开源系统,能否成为企业微信开源框架项目中的独角兽?
2020年,国内企业服务SaaS领域因疫情加速驶入快车道,一时间企业服务领域的创业项目从成为了兵家必争的赛道。这其中,基于企业微信生态的私域流量运营SaaS工具尤为引人瞩目,作为企业私域流量运营的重要场景和工具,吸引了大批的服务商和企业,行业进入了百花齐名百家开放的阶段。!(https://uploadimages.jianshu.io/uploa
Stella981 Stella981
3年前
DevOps&CloudNative技术交流群
微信群:添加微信:devsecopser,或者扫描下方二维码添加微信好友,备注加群。!(https://oscimg.oschina.net/oscnet/7f93ee88656c4ba36be309c9c097992721f.jpg)本文分享自微信公众号云原生生态圈(CloudNativeEcoSystem)。如有侵权,
Easter79 Easter79
3年前
Tiny微信框架是怎样设计的?
   微信对国人而言,想必大名鼎鼎,活跃用户数已经突破6.5亿,足以说明这款应用的生命力。但是使用人数众多,不代表微信的API设计优异,有过微信公众号开发经验的人,想必复杂的报文,众多的服务API以及各种公众号资源与权限设置搞得头痛。其实Tiny框架设计理念之一就是简化开发人员的工作,设计Tiny微信框架可以一定程度上减少一般开发人员的难度。