建議收藏,牛人都在瘋傳的C++開源專案

大家好,我是檸檬哥,專注程式設計知識分享。

歡迎關注@程式設計師檸檬橙

,程式設計路上不迷路

很多粉絲問的是後臺開發方向的C++開源專案,今天我們就聊聊這方面的

大部分人都有 C++經驗了,那應該可以看懂一些大中型C++專案原始碼,所以我推薦的專案有小型的也有大型成熟的,但是都是C++後臺開發相關的專案。

專案涉及後臺開發元件包括:

網路庫、RPC框架、資料庫、配置檔案處理、訊息佇列、序列化等等

話不多說,我們開始吧。

下面這個專案,我最先推薦。

Google開原始碼規範

我們學習開源專案原始碼,但是自己寫程式碼的時候,良好的程式碼規範也必不可少,這方面可以參考Google 開原始碼規範。

C++ 是 Google 大部分開源專案的主要程式語言,正如每個 C++ 程式設計師都知道的, C++ 有很多強大的特性, 但這種強大不可避免地導致它走向複雜,使程式碼更容易產生 bug,難以閱讀和維護。

本指南的目的是透過詳細闡述 C++ 注意事項來駕馭其複雜性。 這些規則在保證程式碼易於管理的同時, 也能高效使用 C++ 的語言特性。

這個程式碼規範的PDF文件,已經有人已經在評論區給出。

專案主頁

:https://github。com/zh-google-styleguide/zh-google-styleguide

資料庫

cpp_redis

專案主頁

:https://github。com/Cylix/cpp_redis/

C++11 Lightweight Redis client: async, thread-safe, no dependency, pipelining, multi-platform

這是一個 C++11編寫的輕量級 Redis 客戶端,具有非同步、執行緒安全、無依賴、pipelining、跨平臺等特性。程式碼量不大,可以學習如何編寫一個簡潔高效的網路通訊客戶端程式,另外專案採用了C++11編寫,透過這個開源專案,你還可以學習如何使用這些語言新特性。

LevelDb

專案主頁:

https://github。com/google/leveldb

由 Google 的兩位工程師 Sanjay Ghemawat 和 Jeff Dean 開發的鍵/值對(Key/Value Pair)嵌入式資料庫,具有很高的隨機寫,順序讀/寫效能,採用 LSM樹 (Log Structured-Merge Tree)實現,LSM樹的核心思想就是放棄部分讀的效能,換取最大的寫入能力。

關於LevelDb 詳細內容學習可參考教程:

https://kevins。pro/leveldb_chinese_doc。html

https://leveldb-handbook。readthedocs。io/zh/latest/basic。html

檔案解析器

在後臺專案中需要經常處理配置檔案解析工作,這些配置檔案可以是XML、JSON或者是YAML等格式的標記語言檔案,下面這幾個專案就是幾個不錯的檔案解析器,程式碼可讀性好。

JSON處理

C++ JSON 解析器

JSON++ is a light-weight JSON parser, writer and reader written in C++。 JSON++ can also convert JSON documents into lossless XML documents。

用C++寫的輕量級 JSON 解析器,同時還可以將 jSON 文件轉換成 XML 文件

專案主頁

:https://github。com/hjiang/jsonxx

迷你的C++11 JSON庫

json11 is a tiny JSON library for C++11, providing JSON parsing and serialization。

同樣是是個mini JSON 庫,僅 1個 CPP 檔案和一個頭檔案,方便地嵌入到自己的專案中

專案主頁

:https://github。com/dropbox/json11

TinyXML

我們經常需要在專案中處理 XML 配置檔案,有沒有想過自己編寫一個簡單透過的XML解析器,這裡就是一個用C++ 編寫的,非常簡單小巧的 XML 解析器,可以很容易地整合到其它專案中,出於C++學習目的的話,你也可以把程式碼下載下來學習練手。

專案主頁

: http://sourceforge。net/projects/tinyxml/

yaml-cpp

YAML 也是一種類似XML和JSON一樣的配置檔案語言,YAML 的意思其實是:“Yet Another Markup Language”(仍是一種標記語言),是專門用來寫配置檔案的語言,相比 JSON 更加簡潔和方便閱讀。

這個專案就是一個用cpp寫的yaml檔案解析器,專案程式碼量也不大,結構清晰,可以用作學習參考。

專案主頁:

https://github。com/jbeder/yaml-cpp

如果說前面的是練手,那下面介紹的專案會高階一些

下面會介紹幾個 C++ 後臺開發中,具有代表性的專案和開源框架,做後臺開發,這些專案你或多或少會使用到,瞭解一些專案原始碼自然更好。

網路庫

Muduo

https://github。com/chenshuo/muduo

說到開源網路庫,就不得不提 muduo ,它是一個基於 Reactor 模式的現代 C++ 網路庫,採用非阻塞 IO 模型,基於事件驅動和回撥,原生支援多核多執行緒,適合編寫 Linux 服務端多執行緒網路應用程式。

muduo 是知乎大神陳碩開發,基於 Reactor 模式,Redis和Java的Netty庫也是採用這種模式實現,具有如下特點:採用非阻塞 IO 模型、基於事件驅動和回撥,原生支援多核多執行緒。

學習 moduo 原始碼可以配合陳碩的《

Linux多執行緒伺服器端程式設計

》,這本書以muduo 網路庫為例,講解這種程式設計模型的使用方法及注意事項,重點講解一種適應性較強的多執行緒伺服器的程式設計模型,即one loop per thread。

訊息佇列

後端開發常用到訊息佇列,訊息佇列是分散式系統中重要的元件,主要解決了應用耦合、非同步處理、流量削鋒等問題。

訊息佇列在實際應用中包括如下四個場景:

應用耦合:多應用間透過訊息佇列對同一訊息進行處理,避免呼叫介面失敗導致整個過程失敗;

非同步處理:多應用對訊息佇列中同一訊息進行處理,應用間併發處理訊息,相比序列處理,減少處理時間;

限流削峰:廣泛應用於秒殺或搶購活動中,避免流量過大導致應用系統掛掉的情況;

訊息驅動的系統:系統分為訊息佇列、訊息生產者、訊息消費者,生產者負責產生訊息,消費者(可能有多個)負責對訊息進行處理;

訊息佇列詳細介紹參考:https://cloud。tencent。com/developer/article/1006035

業界有名的 zeromq 核心程式碼也是用 C++ 編寫,如果想深入研究訊息佇列,可以從這入手試試,下面給出專案主頁和入口網站。

https://zeromq。org/

https://github。com/zeromq/libzmq

序列化

序列化: 將資料結構或物件轉換成二進位制串的過程

反序列化:將在序列化過程中所生成的二進位制串轉換成資料結構或者物件的過程

資料結構、物件與二進位制串

不同的計算機語言中,資料結構,物件以及二進位制串的表示方式並不相同。

資料結構和物件:對於類似Java這種完全面向物件的語言,工程師所操作的一切都是物件(Object),來自於類的例項化。在Java語言中最接近資料結構的概念,就是POJO(Plain Old Java Object)或者Javabean--那些只有setter/getter方法的類。而在C++這種半面向物件的語言中,資料結構和struct對應,物件和class對應。

二進位制串:序列化所生成的二進位制串指的是儲存在記憶體中的一塊資料。C++語言具有記憶體運算子,所以二進位制串的概念容易理解,例如,C++語言的字串可以直接被傳輸層使用,因為其本質上就是以’\0’結尾的儲存在記憶體中的二進位制串。在Java語言裡面,二進位制串的概念容易和String混淆。實際上String 是Java的一等公民,是一種特殊物件(Object)。對於跨語言間的通訊,序列化後的資料當然不能是某種語言的特殊資料型別。二進位制串在Java裡面所指的是byte[],byte是Java的8中原生資料型別之一(Primitive data types)。

序列化參考連結: https://tech。meituan。com/2015/02/26/serialization-vs-deserialization。html

Protobuf

Protocol Buffer (簡稱Protobuf) 是Google 出品的效能優異、跨語言、跨平臺的序列化庫。

專案主頁

https://github。com/protocolbuffers/protobuf

教程參考:

Protobuf 終極教程

RPC

RPC (Remote Procedure Call)

遠端過程呼叫是一個計算機通訊協議。我們一般的程式呼叫是本地程式內部的呼叫,

RPC

允許你像呼叫本地函式一樣去呼叫另一個程式的函式,這中間會涉及網路通訊和程序間通訊,但你無需知道實現細節,

RPC

框架為你遮蔽了底層實現。RPC是一種伺服器-客戶端(Client/Server)模式,經典實現是一個透過

「傳送請求-接受迴應」

進行資訊互動的系統。

推薦幾個RPC開源專案,供學習研究,

先從簡單的玩具專案入手

rest_rpc

https://github。com/qicosmos/rest_rpc

c++11, high performance, cross platform, easy to use rpc framework。

It‘s so easy to love RPC。

Modern C++開發的RPC庫就是這麼簡單好用!

rest_rpc是一個高效能、易用、跨平臺、header only的c++11 rpc庫,它的目標是讓tcp通訊變得非常簡單易用,即使不懂網路通訊的人也可以直接使用它。 可以快速上手,使用者只需要關注自己的業務邏輯即可。

再介紹幾個業內成熟的後臺開發RPC框架:

谷歌gRPC

谷歌開源的高效能遠端過程呼叫系統。

在 gRPC 裡

客戶端

應用可以像呼叫本地物件一樣直接呼叫另一臺不同的機器上

服務端

應用的方法,使得您能夠更容易地建立分散式應用和服務。與許多 RPC 系統類似,gRPC 也是基於以下理念:定義一個

服務

,指定其能夠被遠端呼叫的方法(包含引數和返回型別)。在服務端實現這個介面,並執行一個 gRPC 伺服器來處理客戶端呼叫。在客戶端擁有一個

存根

能夠像服務端一樣的方法

建議收藏,牛人都在瘋傳的C++開源專案

專案主頁

:https://github。com/grpc/grpc

百度brpc

百度內最常使用的工業級RPC框架, 有1,000,000+個例項(不包含client)和上千種多種服務。“brpc”的含義是“better RPC”。

你可以使用它:

搭建能在

一個埠

支援多協議的服務, 或訪問各種服務

restful http/https, h2/gRPC。使用brpc的http實現比libcurl方便多了。從其他語言透過HTTP/h2+json訪問基於protobuf的協議。

redis和memcached, 執行緒安全,比官方client更方便。

rtmp/flv/hls, 可用於搭建流媒體服務。

hadoop_rpc(可能開源)

支援rdma(即將開源)

支援thrift , 執行緒安全,比官方client更方便

各種百度內使用的協議: baidu_std, streaming_rpc, hulu_pbrpc, sofa_pbrpc, nova_pbrpc, public_pbrpc, ubrpc和使用nshead的各種協議。

基於工業級的RAFT演算法實現搭建高可用分散式系統,已在braft開源。

Server能同步或非同步處理請求。

Client支援同步、非同步、半同步,或使用組合channels簡化複雜的分庫或併發訪問。

透過http介面除錯服務, 使用cpu, heap, contention profilers。

獲得更好的延時和吞吐。

把你組織中使用的協議快速地加入brpc,或定製各類元件, 包括命名服務 (dns, zk, etcd), 負載均衡 (rr, random, consistent hashing)

專案主頁:

apache/incubator-brpc

騰訊tars

騰訊開源的RPC框架

TARS是Linux基金會的開源專案,它是基於名字服務使用TARS協議的高效能RPC開發框架,配套一體化的運營管理平臺,並透過伸縮排程,實現運維半托管服務。

TARS是騰訊從2008年到今天一直在使用的後臺邏輯層的統一應用框架,覆蓋騰訊100多個產品。目前支援C++,Java,PHP,Nodejs,Go語言。該框架為使用者提供了涉及到開發、運維、以及測試的一整套解決方案,幫助一個產品或者服務快速開發、部署、測試、上線。 它集可擴充套件協議編解碼、高效能RPC通訊框架、名字路由與發現、釋出監控、日誌統計、配置管理等於一體,透過它可以快速用微服務的方式構建自己的穩定可靠的分散式應用,並實現完整有效的服務治理。

建議收藏,牛人都在瘋傳的C++開源專案

目前該框架在騰訊內部,各大核心業務都在使用,頗受歡迎,基於該框架部署執行的服務節點規模達到上萬個。

TARS-CPP專案主頁

: https://github。com/TarsCloud/TarsCpp

搜狗srpc

這是搜狗自研的RPC系統,主要功能和特點:

這是一個基於Sogou C++ Workflow的專案,兼具:

高效能

低開發和接入門檻

完美相容workflow的串並聯任務流

對於已有pb/thrift描述檔案的專案,可以做到一鍵遷移

支援多種IDL格式,包括:

Protobuf

Thrift

支援多種資料佈局,使用上完全透明,包括:

Protobuffer serialize

Thrift Binary serialize

json serialize

支援多種壓縮,使用上完全透明,包括:

gzip

zlib

snappy

lz4

支援多種通訊協議,使用上完全透明,包括:

tcp

http

sctp

ssl

https

使用者可以透過http+json實現跨語言:

如果自己是server提供方,用任何語言的http server接受post請求,解析若干http header即可

如果自己是client呼叫方,用任何語言的http client傳送post請求,新增若干http header即可

內建了可以與其他RPC框架的server/client無縫互通的client/server,包括:

BPRC

Thrift Framed Binary

Thrift Http Binary

相容workflow的使用方式:

提供建立任務的介面來建立一個rpc任務

可以把rpc任務放到任務流圖中,回撥函數里也可以拿到當前的任務流

workflow所支援的其他功能,包括upstream、計算排程、非同步檔案IO等

專案主頁

:sogou/srpc

單元測試

Google Test

程式寫的好,單元測試少不了。現在流行的軟體開發模式「測試驅動開發」,學習使用單元測試保證程式碼健壯性,Google 的開源 C++ 單元測試框架 Google Test 也稱為 gtest ,提供了豐富的斷言和各類比較操作。

斷言

gtest 使用一系列斷言的宏來檢查值是否符合預期,主要分為兩類:ASSERT 和 EXPECT。區別在於 ASSERT 不透過的時候會認為是一個 fatal 的錯誤,退出當前函式(只是函式)。而 EXPECT 失敗的話會繼續運行當前函式,所以對於函式內幾個失敗可以同時報告出來。通常我們用 EXPECT 級別的斷言就好,除非你認為當前檢查點失敗後函式的後續檢查沒有意義。

專案主頁:

https://github。com/google/googletest/

特別是初學者推薦用影片+看書的方式學習

,能極大降低學習門檻,提高學習效率,

這塊我整理了一系列優質的C++公開課和教程影片資源

有沒有什麼好的C++影片教程?

87 贊同 · 0 評論回答

建議收藏,牛人都在瘋傳的C++開源專案

C 語言練手專案

C++和 C 語言有很大聯絡,但又有很大區別,很多同學是從 C語言入門的程式設計,之後再轉向面向物件的 C++ 開發,如果你學 C++ 之前沒有 C 語言基礎,或者你正在學習 C 語言,我也給你找了 21 個適合 C 語言練手的專案。這些小專案做完,基本算是掌握 C 語言綽綽有餘的。

有什麼好的C語言小專案適合剛學C語言的小白嗎?

2 贊同 · 0 評論回答

建議收藏,牛人都在瘋傳的C++開源專案

加個餐

上面推薦的開源專案,有些用到了現代C++特性,你可能會在專案原始碼中看到C++1x甚至更現代的C++20語法,不要慌,參考下面這個11。7K star 的現代C++教程專案快速上手:

這是一本現代C++快速上手電子書,目標讀者:

本書假定讀者已經熟悉了傳統 C++ ,至少在閱讀傳統 C++ 程式碼上不具備任何困難。換句話說,那些長期使用傳統 C++進行編碼的人、渴望在短時間內迅速瞭解

現代 C++

特性的人非常適合閱讀本書;

本書一定程度上介紹了一些現代 C++ 的

黑魔法

,但這些魔法畢竟有限,不適合希望進階學習現代 C++ 的讀者,本書的定位系

現代 C++ 的快速上手

。當然,希望進階學習的讀者可以使用本書來回顧並檢驗自己對

現代 C++

的熟悉度。

建議收藏,牛人都在瘋傳的C++開源專案

專案主頁

: https://github。com/changkun/modern-cpp-tutorial

除了利用優秀開源專案學習之外,最務實的學習方式就是看書!我從事軟體行業這麼些年,開始也有迷茫不知方向,也不懂要看啥書學些什麼內容,為了避免這樣的問題,我整理了程式設計師進階書單,讓你少走些彎路。

附帶了一份我整理的 C++ 電子書合集:C++ 必讀書籍推薦(含下載方式)

另外,除了開源專案以外,

還可以嘗試用C++去牛客或者LeetCode上刷演算法題,既能鍛鍊演算法能力(現在大廠面試幾乎必考演算法),又能提高C++使用熟練度

演算法可以說是計算機專業學習的一座大山,翻過去,海闊天空。

我曾經也在刷LeetCode 演算法的時候非常苦惱,做了好幾次的題目再來刷也毫無頭緒,差點被勸退

,後來我找到了演算法套路,就像打通 任督二脈一樣,神清氣爽!在下面這個回答中,我把自己這幾年演算法的刷題經驗,毫無保留的分享給你:

分享我參考的這本谷歌大神找工作時寫的演算法刷題筆記,感興趣的童鞋可以透過下面的渠道獲取:

私信傳送 1024 打包下載10個G程式設計資源學習資料

私信傳送 001 獲取阿里大神LeetCode 刷題筆記

私信傳送 002 獲取獲取谷歌公司程式設計程式碼規範

私信傳送 003 獲取10個精美簡歷模板PDF和Word版

私信傳送 004 獲取100道精選 C++ 面試題和答案word版

私信傳送 005 獲取獲取谷歌LeetCode演算法筆記