微信后台开源框架,牛逼!

共 2914字,需浏览 6分钟

 ·

2021-07-10 11:38

微信后台主要使用C++。后台服务使用Svrkit框架搭建,服务之间通过同步RPC进行通讯。

使用 Svrkit 构建了数以千计的服务模块,提供数万个服务接口,每天 RPC 调用次数达几十万亿次。

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

Github 地址:

https://github.com/Tencent/phxrpc

但是这个开源的框架不是微信内部实际使用的,因为实际使用的版本有太多的内部依赖,已经不太好整理开源出来,所以这个是开源简化版。

PhxRPC  使用“协程” 来解决常规“异步 + 回调”方式存在的  IO 阻塞的问题,大大提高了整体性能。

它主要有以下几个特点:

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

用 PhxRPC 写一个服务非常简单,用 Protobuf 定义好接口协议后,直接就可以生成服务代码,你只需要关注业务逻辑实现即可,其它网络收发包、协议解析都由框架完成了:

另外,很多同学问我网络编程如何学习?

在这分享一点个人经验吧,我们知道有本网络编程圣经:《Unix网络编程》

但是我建议不要直接上来就去看《Unix网络编程》,这本书里面很大的篇幅都在讲解 API 和 Unix Socket API 细节,很容易看不下去。

我建议先去随便找菜鸟教程或者 man 手册熟悉常用的 socket api,先写几个网络聊天室这种小程序来,然后再去考虑进阶。

C++ 后台开发基本是离不开网络编程的,其实甚至整个后台开发也可以看做是在做网络编程。

只不过别人的框架帮我们做了协议解析、网络数据传输、解封包这些底层操作。

比如 SpringBoot 这种保姆级框架,基本上属于将一个框架能干的事都干完了,以至于我们开发业务只需要定义接收和返回包的数据格式,然后做逻辑处理就完了。

像序列化、解封包、IO 处理这种网络编程必备的脏活业务开发根本不会接触到。

但是网络编程技能还是很重要的,特别是对于 Linux C++ 开发来说。

Linux 下网络编程核心的包括系统编程和网络 IO 两个部分:

  • 进程间通信方式:信号量、管道、共享内存、socket 等
  • 多线程编程:互斥锁、条件变量、读写锁、线程池等
  • 五大 IO 模型:同步、异步、阻塞、非阻塞、信号驱动
  • 高性能 IO 两种模式:Reactor 和 Proactor( 但是 Linux 下由于缺少异步 IO 支持,基本没有 Proactor
  • IO 复用机制:epoll、select、poll(破解 C10K 问题的利器)

推荐的书:

  • 《Unix网络编程》
  • 《Unix环境高级编程》

这两本是砖头书,虽然是网络编程和 Unix 系统编程方面的无出其右的圣经,但主要用途还是垫显示器(逃, 个人觉得这种书不是面向读者的,具体原因和如何阅读这种书在后文介绍。

  • 《Linux高性能服务器编程》

我强烈推荐,这本书前半部分基本是在重复计网基础知识,但是后面几章关于高性能服务器程序框架、高性能IO、IO复用、定时器、多线程编程、线程池和进程池还是讲得非常全面到位的,值得一看,看完基本上对于整个网络编程就有了框架。

  • 《Linux多线程服务器端编程》

这本书同样强烈推荐,这是陈硕大佬写的书,说实话第一部分:C++ 多线程系统编程都直接把我看蒙了,没有想到 C++ 里要做到线程安全这么难,第一章我看了两三遍才看懂吧。。。这是难得的讲解 C++ 多线程编程的书。

并且在书中,陈硕大佬用了一章讲解了 Muduo 网络库设计与实现,Muduo 比较适合学完基础的网络编程后继续进阶学习如何设计和写一个网络库,是一个高质量的 Reactor 网络库,采用 one loop per thread + thread pool 实现,代码比较简洁,书和源码搭配着看作为学习网络编程方面来说是非常不错。

推荐的阅读顺序:

《Linux高性能服务器编程》—> 《Unix网络编程》(注意,不是全看,而是学习高性能服务器编程这本书的时候需要某个Socket API 或者 IO 模型时再去查阅 UNP) -> 《Linux 多线程服务端编程》

学完网络编程就可以写点小项目练手了,这里列举几个项目:

  • HTTP 服务器,这个似乎成了 Linux C/C++ 人手一个的项目了?

    这里推荐两个做为参考:https://github.com/imarvinle/WebServer、  https://github.com/linyacool/WebServer ,HTTP 服务器看着挺简单的,但是可以扩展写的地方还是挺多的,比如可以加入代理功能,这部分我在留学生 lab 中写过,但是没有集成到这个里面来,可以加入日志库,可以添加 CGI 支持等等。

  • 网络库 这个也算是造轮子了, 可以就采用 one loop per thread + thread pool 这种模式,先去看懂 Muduo 源码,然后自己再写一个类似的,这个过程就算是抄,你也可以学到不少东西的,学编程不就是这样先看,再模仿、修改,然后创新吗?

  • RPC  写一个 PRC 你需要考虑到序列化、网络传输、服务发现等,比较有名的有 grpc、brpc,这两个网上文档都比较完善,可以学习一下实现原理。完整的可以参考 PhxRPC,代码量不算大。

  • 类似 QQ的 网络聊天室 简单版的就可以直接在局域网内实现群聊、单聊等。更进一步可以考虑一下如何不通过服务器中转消息实现 P2P 聊天,类似 QQ,这里会涉及到 UDP 打洞、NAT 转换等知识,还是很有意思的,我大二用 Java 搞过。Java的话,这些基础的网络编程概念都是共通的,大家可以再去看看 Netty

PS公号内回复「Python」即可进入Python 新手学习交流群,一起 100 天计划!


老规矩,兄弟们还记得么,右下角的 “在看” 点一下如果感觉文章内容不错的话,记得分享朋友圈让更多的人知道!

神秘礼包获取方式

识别文末二维码,回复:1024

浏览 580
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报