微信后臺(tái)開源框架,牛逼!
微信后臺(tái)主要使用C++。后臺(tái)服務(wù)使用Svrkit框架搭建,服務(wù)之間通過同步RPC進(jìn)行通訊。

使用 Svrkit 構(gòu)建了數(shù)以千計(jì)的服務(wù)模塊,提供數(shù)萬個(gè)服務(wù)接口,每天 RPC 調(diào)用次數(shù)達(dá)幾十萬億次。
PhxRPC 就是微信后臺(tái)團(tuán)隊(duì)推出的一個(gè)非常簡(jiǎn)潔小巧的 RPC 框架,編譯生成的庫(kù)只有450K:
Github 地址:
https://github.com/Tencent/phxrpc
但是這個(gè)開源的框架不是微信內(nèi)部實(shí)際使用的,因?yàn)閷?shí)際使用的版本有太多的內(nèi)部依賴,已經(jīng)不太好整理開源出來,所以這個(gè)是開源簡(jiǎn)化版。
PhxRPC 使用“協(xié)程” 來解決常規(guī)“異步 + 回調(diào)”方式存在的 IO 阻塞的問題,大大提高了整體性能。
它主要有以下幾個(gè)特點(diǎn):
使用 Protobuf 作為IDL用于描述 RPC 接口以及通信數(shù)據(jù)結(jié)構(gòu)。 基于 Protobuf 文件自動(dòng)生成 Client 以及 Server 接口,用于Client 的構(gòu)建,以及 Server 的實(shí)現(xiàn)。 半同步半異步模式,采用獨(dú)立多IO線程,通過 Epoll 管理請(qǐng)求的接入以及讀寫,工作線程采用固定線程池。IO 線程與工作線程通過內(nèi)存隊(duì)列進(jìn)行交互。 支持協(xié)程 Worker,可配置多個(gè)線程,每個(gè)線程多個(gè)協(xié)程。 提供完善的過載保護(hù),無需配置閾值,支持動(dòng)態(tài)自適應(yīng)拒絕請(qǐng)求。 提供簡(jiǎn)易的 Client/Server 配置讀入方式。 基于 Lambda 函數(shù)實(shí)現(xiàn)并發(fā)訪問 Server,可以非常方便地實(shí)現(xiàn) Google 提出的 Backup Requests 模式。
用 PhxRPC 寫一個(gè)服務(wù)非常簡(jiǎn)單,用 Protobuf 定義好接口協(xié)議后,直接就可以生成服務(wù)代碼,你只需要關(guān)注業(yè)務(wù)邏輯實(shí)現(xiàn)即可,其它網(wǎng)絡(luò)收發(fā)包、協(xié)議解析都由框架完成了:

另外,很多同學(xué)問我網(wǎng)絡(luò)編程如何學(xué)習(xí)?
在這分享一點(diǎn)個(gè)人經(jīng)驗(yàn)吧,我們知道有本網(wǎng)絡(luò)編程圣經(jīng):《Unix網(wǎng)絡(luò)編程》
但是我建議不要直接上來就去看《Unix網(wǎng)絡(luò)編程》,這本書里面很大的篇幅都在講解 API 和 Unix Socket API 細(xì)節(jié),很容易看不下去。
我建議先去隨便找菜鳥教程或者 man 手冊(cè)熟悉常用的 socket api,先寫幾個(gè)網(wǎng)絡(luò)聊天室這種小程序來,然后再去考慮進(jìn)階。
C++ 后臺(tái)開發(fā)基本是離不開網(wǎng)絡(luò)編程的,其實(shí)甚至整個(gè)后臺(tái)開發(fā)也可以看做是在做網(wǎng)絡(luò)編程。
只不過別人的框架幫我們做了協(xié)議解析、網(wǎng)絡(luò)數(shù)據(jù)傳輸、解封包這些底層操作。
比如 SpringBoot 這種保姆級(jí)框架,基本上屬于將一個(gè)框架能干的事都干完了,以至于我們開發(fā)業(yè)務(wù)只需要定義接收和返回包的數(shù)據(jù)格式,然后做邏輯處理就完了。
像序列化、解封包、IO 處理這種網(wǎng)絡(luò)編程必備的臟活業(yè)務(wù)開發(fā)根本不會(huì)接觸到。
但是網(wǎng)絡(luò)編程技能還是很重要的,特別是對(duì)于 Linux C++ 開發(fā)來說。
Linux 下網(wǎng)絡(luò)編程核心的包括系統(tǒng)編程和網(wǎng)絡(luò) IO 兩個(gè)部分:
進(jìn)程間通信方式:信號(hào)量、管道、共享內(nèi)存、socket 等 多線程編程:互斥鎖、條件變量、讀寫鎖、線程池等 五大 IO 模型:同步、異步、阻塞、非阻塞、信號(hào)驅(qū)動(dòng) 高性能 IO 兩種模式:Reactor 和 Proactor( 但是 Linux 下由于缺少異步 IO 支持,基本沒有 Proactor IO 復(fù)用機(jī)制:epoll、select、poll(破解 C10K 問題的利器)
推薦的書:
《Unix網(wǎng)絡(luò)編程》 《Unix環(huán)境高級(jí)編程》
這兩本是磚頭書,雖然是網(wǎng)絡(luò)編程和 Unix 系統(tǒng)編程方面的無出其右的圣經(jīng),但主要用途還是墊顯示器(逃, 個(gè)人覺得這種書不是面向讀者的,具體原因和如何閱讀這種書在后文介紹。
《Linux高性能服務(wù)器編程》
我強(qiáng)烈推薦,這本書前半部分基本是在重復(fù)計(jì)網(wǎng)基礎(chǔ)知識(shí),但是后面幾章關(guān)于高性能服務(wù)器程序框架、高性能IO、IO復(fù)用、定時(shí)器、多線程編程、線程池和進(jìn)程池還是講得非常全面到位的,值得一看,看完基本上對(duì)于整個(gè)網(wǎng)絡(luò)編程就有了框架。
《Linux多線程服務(wù)器端編程》
這本書同樣強(qiáng)烈推薦,這是陳碩大佬寫的書,說實(shí)話第一部分:C++ 多線程系統(tǒng)編程都直接把我看蒙了,沒有想到 C++ 里要做到線程安全這么難,第一章我看了兩三遍才看懂吧。。。這是難得的講解 C++ 多線程編程的書。
并且在書中,陳碩大佬用了一章講解了 Muduo 網(wǎng)絡(luò)庫(kù)設(shè)計(jì)與實(shí)現(xiàn),Muduo 比較適合學(xué)完基礎(chǔ)的網(wǎng)絡(luò)編程后繼續(xù)進(jìn)階學(xué)習(xí)如何設(shè)計(jì)和寫一個(gè)網(wǎng)絡(luò)庫(kù),是一個(gè)高質(zhì)量的 Reactor 網(wǎng)絡(luò)庫(kù),采用 one loop per thread + thread pool 實(shí)現(xiàn),代碼比較簡(jiǎn)潔,書和源碼搭配著看作為學(xué)習(xí)網(wǎng)絡(luò)編程方面來說是非常不錯(cuò)。
推薦的閱讀順序:
《Linux高性能服務(wù)器編程》—> 《Unix網(wǎng)絡(luò)編程》(注意,不是全看,而是學(xué)習(xí)高性能服務(wù)器編程這本書的時(shí)候需要某個(gè)Socket API 或者 IO 模型時(shí)再去查閱 UNP) -> 《Linux 多線程服務(wù)端編程》
學(xué)完網(wǎng)絡(luò)編程就可以寫點(diǎn)小項(xiàng)目練手了,這里列舉幾個(gè)項(xiàng)目:
HTTP 服務(wù)器,這個(gè)似乎成了 Linux C/C++ 人手一個(gè)的項(xiàng)目了?
這里推薦兩個(gè)做為參考:
https://github.com/imarvinle/WebServer、https://github.com/linyacool/WebServer,HTTP 服務(wù)器看著挺簡(jiǎn)單的,但是可以擴(kuò)展寫的地方還是挺多的,比如可以加入代理功能,這部分我在留學(xué)生 lab 中寫過,但是沒有集成到這個(gè)里面來,可以加入日志庫(kù),可以添加 CGI 支持等等。網(wǎng)絡(luò)庫(kù) 這個(gè)也算是造輪子了, 可以就采用 one loop per thread + thread pool 這種模式,先去看懂 Muduo 源碼,然后自己再寫一個(gè)類似的,這個(gè)過程就算是抄,你也可以學(xué)到不少東西的,學(xué)編程不就是這樣先看,再模仿、修改,然后創(chuàng)新嗎?
RPC 寫一個(gè) PRC 你需要考慮到序列化、網(wǎng)絡(luò)傳輸、服務(wù)發(fā)現(xiàn)等,比較有名的有 grpc、brpc,這兩個(gè)網(wǎng)上文檔都比較完善,可以學(xué)習(xí)一下實(shí)現(xiàn)原理。完整的可以參考 PhxRPC,代碼量不算大。
類似 QQ的 網(wǎng)絡(luò)聊天室 簡(jiǎn)單版的就可以直接在局域網(wǎng)內(nèi)實(shí)現(xiàn)群聊、單聊等。更進(jìn)一步可以考慮一下如何不通過服務(wù)器中轉(zhuǎn)消息實(shí)現(xiàn) P2P 聊天,類似 QQ,這里會(huì)涉及到 UDP 打洞、NAT 轉(zhuǎn)換等知識(shí),還是很有意思的,我大二用 Java 搞過。Java的話,這些基礎(chǔ)的網(wǎng)絡(luò)編程概念都是共通的,大家可以再去看看 Netty
PS:公號(hào)內(nèi)回復(fù)「Python」即可進(jìn)入Python 新手學(xué)習(xí)交流群,一起 100 天計(jì)劃!
老規(guī)矩,兄弟們還記得么,右下角的 “在看” 點(diǎn)一下,如果感覺文章內(nèi)容不錯(cuò)的話,記得分享朋友圈讓更多的人知道!


【神秘禮包獲取方式】
