微信後臺開源框架,牛逼!
微信後臺主要使用 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
你好,我是小北,畢業於某末流 985,前國外計算機公開課硬核 Lab 玩家,現職場萌新,微信後臺小開發。
高中編程 0 基礎,從小白到計算機,大三時通過實習和技術變現收入 10 W+,點擊藍字查看我的「編程能力突飛猛進之路」。
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源:https://mp.weixin.qq.com/s/x313D3X7M1iCmZ0bsauo4A