今年你参与开源了吗?
hi 大家好,今天給大家推薦一些值得學習的優秀開源項目,包括C, C++,Golang,Java等后臺開發主流語言,大家可以抽點時間學習一下這些優秀項目的代碼設計和實現。
C經典開源項目
1.Libev
libev是一個全功能和高性能的事件驅動庫,基于epoll,kqueue等OS提供的基礎設施。其以高效出名,它可以將IO事件,定時器,和信號統一起來,統一放在事件處理這一套框架下處理。基于Reactor模式,效率較高,并且代碼精簡(4.15版本8000多行),是學習事件驅動編程的很好的資源。
特點
不使用全局變量,而是每個函數都有一個循環上下文。
對每種事件類型使用小的觀察器(一個I/O觀察器在x86_64機器上使用56字節,而用libevent的話使用136字節)。
沒有http庫等組件。libev的功能非常少。
允許更多事件類型,例如基于wall clock或者單調時間的定時器、線程間中斷等等。
更簡單地說,libev的設計遵循UNIX工具箱的哲學,盡可能好地只做一件事。
整體架構:
開源地址:
https://github.com/enki/libev
2.?Redis
Redis 是一種經典的開源內存Key-Value數據結構存儲,用作數據庫、緩存和消息代理。Redis 提供了數據結構,例如字符串、散列、列表、集合、帶有范圍查詢的排序集合、位圖、超級日志、地理空間索引和流。Redis 內置復制、Lua 腳本、LRU 驅逐、事務和不同級別的磁盤持久化,并通過 Redis Sentinel 和 Redis Cluster 自動分區提供高可用性。
代碼架構:
開源地址:
https://github.com/redis/redis
3. Nginx
Nginx是一款輕量級的Web服務器、反向代理服務器,由于它的內存占用少,啟動極快,高并發能力強,在互聯網項目中廣泛應用。
特點:
Nginx可以部署在網絡上使用FastCGI腳本、SCGI處理程序、WSGI應用服務器或Phusion Passenger模塊的動態HTTP內容,并可作為軟件負載均衡器。
Nginx使用異步事件驅動的方法來處理請求。Nginx的模塊化事件驅動架構可以在高負載下提供更可預測的性能。
Nginx是一款面向性能設計的HTTP服務器,相較于Apache、lighttpd具有占有內存少,穩定性高等優勢。與舊版本(≤2.2)的Apache不同,Nginx不采用每客戶機一線程的設計模型,而是充分使用異步邏輯從而削減了上下文調度開銷,所以并發服務能力更強。整體采用模塊化設計,有豐富的模塊庫和第三方模塊庫,配置靈活。在Linux操作系統下,Nginx使用epoll事件模型,得益于此,Nginx在Linux操作系統下效率相當高。同時Nginx在OpenBSD或FreeBSD操作系統上采用類似于epoll的高效事件模型kqueue。
整體架構:
開源地址:
https://github.com/nginx/nginx
4.SQLite
SQLite是一個開源的嵌入式關系數據庫,實現自包容、零配置、支持事務的SQL數據庫引擎。其特點是高度便攜、使用方便、結構緊湊、高效、可靠。足夠小,大致3萬行C代碼,250K。
整體架構:
開源地址:
http://www.sqlite.org/
5.Linux
Linux 是一套免費使用和自由傳播的類 Unix 操作系統,是一個基于 POSIX 和 UNIX 的多用戶、多任務、支持多線程和多 CPU 的操作系統。Linux 能運行主要的 UNIX 工具軟件、應用程序和網絡協議。它支持 32 位和 64 位硬件。Linux 繼承了 Unix 以網絡為核心的設計思想,是一個性能穩定的多用戶網絡操作系統,目前最為流行后臺服務器操作系統。
整體架構:
開源地址:
https://www.kernel.org/
C++開源項目
? ? 1.TinyWebServer(初學者)
這是一個幫助初學者快速實現網絡編程、搭建屬于自己的輕量級Web服務器的小項目。
項目雖小但真的五臟俱全:
使用線程池、非阻塞Socket、epoll(ET/LT均實現)、事件處理(Reactor及模擬Proactor)的并發模型。
使用狀態機解析HTTP請求報文,支持解析GET和POST請求
訪問服務器數據庫實現web端用戶注冊、登錄功能,可以請求服務器圖片和視頻文件
實現同步/異步日志系統,記錄服務器運行狀態
經Webbench壓力測試可以實現上萬的并發連接數據交換
? ?代碼地址:
https://github.com/qinguoyi/TinyWebServer
2.sylar
C++高性能分布式服務器框架,功能最全webserver/websocket server,自定義tcp_server(包含日志模塊,配置模塊,線程模塊,協程模塊,協程調度模塊,io協程調度模塊,hook模塊,socket模塊,bytearray序列化,http模塊,TcpServer模塊,Websocket模塊,Https模塊等, Smtp郵件模塊, MySQL, SQLite3, ORM,Redis,Zookeeper)。
優點:
基于epoll的IO復用機制實現Reactor模式,采用邊緣觸發(ET)模式,和非阻塞模式
由于采用ET模式,read、write和accept的時候必須采用循環的方式,直到error==EAGAIN為止,防止漏讀等清況,這樣的效率會比LT模式高很多,減少了觸發次數
Version-0.1.0基于單線程實現,Version-0.2.0利用線程池實現多IO線程,Version-0.3.0實現通用worker線程池,基于one loop per thread的IO模式,Version-0.4.0增加定時器,Version-0.5.0增加簡易協程實現和異步日志實現
線程模型將劃分為主線程、IO線程和worker線程,主線程接收客戶端連接(accept),并通過Round-Robin策略分發給IO線程,IO線程負責連接管理(即事件監聽和讀寫操作),worker線程負責業務計算任務(即對數據進行處理,應用層處理復雜的時候可以開啟)基于時間輪實現定時器功能,定時剔除不活躍連接,時間輪的插入、刪除復雜度為O(1),執行復雜度取決于每個桶上的鏈表長
采用智能指針管理多線程下的對象資源增加簡易協程實現,目前版本基于ucontext.h(供了解學習,尚未應用到本項目中)From:
simple-coroutine增加簡易C++異步日志庫 From: simple-log
支持HTTP長連接
支持優雅關閉連接
通常情況下,由客戶端主動發起FIN關閉連接客戶端發送FIN關閉連接后,服務器把數據發完才close,而不是直接暴力close,如果連接出錯,則服務器可以直接close.
代碼地址:
https://github.com/sylar-yin/sylar
3. OpenSSL
一個強大的安全套接字層密碼庫,加密HTTPS,加密SSH都賊好用,同時它還可以用于跨平臺密碼工具。
OpenSSL實現了以下功能:
數據保密性:信息加密就是把明碼的輸入文件用加密算法轉換成加密的文件以實現數據的保密。加密的過程需要用到密鑰來加密數據然后再解密。
數據完整性:加密也能保證數據的一致性。例如:消息驗證碼(MAC),能夠校驗用戶提供的加密信息,接收者可以用MAC來校驗加密數據,保證數據在傳輸過程中沒有被篡改過。
安全驗證:加密的另外一個用途是用來作為個人的標識,用戶的密鑰可以作為他的安全驗證的標識。SSL是利用公開密鑰的加密技術(RSA)來作為用戶端與服務器端在傳送機密資料時的加密通訊協定。
代碼地址:
https://www.openssl.org/source
4.LevelDB?
LevelDB 是一個由 Google 編寫的快速鍵值存儲庫,它提供了從字符串鍵到字符串值的有序映射。
LevelDB?有以下優點:
提供應用程序運行上下文,方便跟蹤調試
可擴展的、多種方式記錄日志,包括命令行、文件、回卷文件、內存、syslog服務器、Win事件日志等
可以動態控制日志記錄級別,在效率和功能中進行調整
所有配置可以通過配置文件進行動態調整
支持Java、C++、C、python等多種語言
整體架構:
MemTable:內存數據結構,具體實現是 SkipList。接受用戶的讀寫請求,新的數據修改會首先在這里寫入。
Immutable MemTable:當 MemTable 的大小達到設定的閾值時,會變成 Immutable MemTable,只接受讀操作,不再接受寫操作,后續由后臺線程 Flush 到磁盤上。
SST Files:Sorted String Table Files,磁盤數據存儲文件。分為 Level0 到 LevelN 多層,每一層包含多個 SST 文件,文件內數據有序。Level0 直接由 Immutable Memtable Flush 得到,其它每一層的數據由上一層進行 Compaction 得到。
Manifest Files:Manifest 文件中記錄 SST 文件在不同 Level 的分布,單個 SST 文件的最大、最小 key,以及其他一些 LevelDB 需要的元信息。由于 LevelDB 支持 snapshot,需要維護多版本,因此可能同時存在多個 Manifest 文件。
Current File:由于 Manifest 文件可能存在多個,Current 記錄的是當前的 Manifest 文件名。
Log Files (WAL):用于防止 MemTable 丟數據的日志文件。
開源地址:
https://github.com/google/leveldb
5.Chromium
Chromium是由Google主導開發的網頁瀏覽器。以BSD許可證等多重自由版權發行并開放源代碼,Chromium的開發可能早自2006年即開始.?Chromium?是Google 的Chrome瀏覽器背后的引擎,其目的是為了創建一個安全、穩定和快速的通用瀏覽器.
整體架構:
chromium的代碼目錄包含這些模塊:
base:通用代碼集和基礎組件實現庫,包含字符串、文件、線程、消息隊列等工具類集合。
cc:負責渲染繪制,chrome為什么高效就是因為有它。chrome:瀏覽器界面模塊,大量調用了cc提供的接口。
content:多進程沙盒瀏覽器莫款,管理多進程和多線程。
gpu,OpenGL封裝實現:CommandBuffer和OpenGL的兼容支持模塊。
net:網絡功能實現模塊。
media:多媒體封裝代碼,實現視頻播放等功能。
mojo:跨語言(C++ / Java / JavaScript)跨平臺的進程間對象通信模塊,類似AIDL的功能。
skia:圖形庫。
third_party:排版引擎。
ui:UI庫。
ipc:?網絡進程通信模塊。
v8,V8 JavaScript 引擎庫。
以上每一個模塊要想真正理解,都得花很大的功夫,簡單用一張圖來說明以上模塊的關系:
開源地址:
https://chromium.googlesource.com/chromium/src.git
Go經典開源項目
Golang有哪些好像優秀的項目呢?列舉一下我收集到的golang開發的優秀項目。
1.docker
golang頭號優秀項目,通過虛擬化技術實現的操作系統與應用的隔離,也稱為容器。
特點:
Docker是世界領先的軟件容器平臺。
Docker使用Google公司推出的Go語言進行開發實現,基于Linux內核的cgroup,namespace,以及AUFS類的UnionFS等技術,對進程進行封裝隔離,屬于操作系統層面的虛擬化技術。由于隔離的進程獨立于宿主和其它的隔離的進程,因此也稱其為容器。Docke最初實現是基于LXC。
Docker能夠自動執行重復性任務,例如搭建和配置開發環境,從而解放了開發人員以便他們專注在真正重要的事情上:構建杰出的軟件。
用戶可以方便地創建和使用容器,把自己的應用放入容器。容器還可以進行版本管理、復制、分享、修改,就像管理普通的代碼一樣。
整體架構:
開源地址:
https://github.com/docker
2.kubernetes
Kubernetes(常簡稱為K8s)是用于自動部署、擴展和管理“容器化(containerized)應用程序”的開源系統。
特點:
跨主機編排容器
更充分地利用硬件資源來最大化地滿足企業應用的需求
可移植 : 支持公有云,私有云,混合云,多重云
可擴展 : 模塊化,插件化,可掛載,可組合,支持各種形式的擴展
自動化 : 自動部署,自動重啟,自動復制,自動伸縮/擴展,通過聲明式語法提供了
整體架構:
etcd保存了整個集群的狀態;
apiserver提供了資源操作的唯一入口,并提供認證、授權、訪問控制、API注冊和發現等機制;
controller manager負責維護集群的狀態,比如故障檢測、自動擴展、滾動更新等;
scheduler負責資源的調度,按照預定的調度策略將Pod調度到相應的機器上;
kubelet負責維護容器的生命周期,同時也負責Volume(CVI)和網絡(CNI)的管理;
Container runtime負責鏡像管理以及Pod和容器的真正運行(CRI);
kube-proxy負責為Service提供cluster內部的服務發現和負載均衡;
Kubernetes設計理念和功能其實就是一個類似Linux的分層架構,如下圖所示:
核心層:Kubernetes最核心的功能,對外提供API構建高層的應用,對內提供插件式應用執行環境
應用層:部署(無狀態應用、有狀態應用、批處理任務、集群應用等)和路由(服務發現、DNS解析等)
管理層:系統度量(如基礎設施、容器和網絡的度量),自動化(如自動擴展、動態Provision等)以及策略管理(RBAC、Quota、PSP、NetworkPolicy等)
接口層:kubectl命令行工具、客戶端SDK以及集群聯邦
生態系統:在接口層之上的龐大容器集群管理調度的生態系統,可以劃分為兩個范疇
Kubernetes外部:日志、監控、配置管理、CI、CD、Workflow、FaaS、OTS應用、ChatOps等
Kubernetes內部:CRI、CNI、CVI、鏡像倉庫、Cloud Provider、集群自身的配置和管理等
開源地址:
https://github.com/kubernetes/kubernetes
3.etcd
etcd 是 CoreOS 團隊于 2013 年 6 月發起的開源項目,它的目標是構建一個高可用的分布式鍵值(key-value)數據庫。
特點:
簡單:定義明確、面向用戶的 API (gRPC)
安全:具有可選客戶端證書身份驗證的自動 TLS
快速:基準測試為 10,000 次寫入/秒
可靠:使用 Raft 正確分布
etcd 是用 Go 編寫的,使用Raft共識算法來管理高可用的復制日志。
許多公司在生產中使用 etcd ,在關鍵部署場景中,開發團隊支持它,在這些場景中,etcd 經常與Kubernetes、locksmith、vulcand、Doorman等應用程序合作。嚴格的測試進一步確保了可靠性。
整體架構:
httpserver
etcd node之間進行通信,接收來自其他node的消息;raft
實現分布式一致性raft協議, raft模塊與server模塊的通信采用了四個channel:propc:處理client來的命令
recvc:處理http消息
readyc: 消息經過raft處理之后封裝成Ready交給server處理
advanceC:server處理一條消息之后通知raft
WAL
server為了防止數據丟失而實現的write ahead log,與很多數據庫的實現類似snapshotter
防止wal的無限制增長,定期生成snap文件僅保留 term,index以及key value data;
mvcc
實現多版本的并發控制,使用revision(main和sub)來描述一個key的整個過程,從創建到刪除。mvcc中還包含了watcher,用于實現監聽key,prefix, range的變化。
backend & boltdb
持久化key value到boltdb數據庫
raftlog
raftlog模塊包含unstable和raft的snapshot,unstable保存log entries,但是entries數量比較多的時候,就需要compact,創建一個snapshot,這里的snapshot還是保存在memory中的。raft模塊會定時收集entries交給server處理。
開源地址:
https://github.com/etcd-io/etcd
4.Tidb
TiDB(“Ti”代表 Titanium)是一個開源的 NewSQL 數據庫,支持混合事務和分析處理 (HTAP) 工作負載。它兼容 MySQL,具有水平可擴展性、強一致性和高可用性。
特點:
水平可擴展性
TiDB 通過簡單地添加新節點來擴展 SQL 處理和存儲。這使得基礎設施容量規劃比僅垂直擴展的傳統關系數據庫更容易且更具成本效益。
MySQL 兼容語法
TiDB 就像是您的應用程序的 MySQL 5.7 服務器。您可以繼續使用所有現有的 MySQL 客戶端庫,并且在許多情況下,您不需要更改應用程序中的任何一行代碼。由于 TiDB 是從頭開始構建的,而不是 MySQL 的 fork,請查看已知兼容性差異列表。
分布式事務
TiDB 在內部將表分片成基于范圍的小塊,我們稱之為“區域”。每個 Region 默認大小約為 100 MiB,TiDB 使用優化的兩階段提交來確保 Region 以事務一致的方式維護。
云原生
TiDB 旨在在云中工作——公共、私有或混合——使部署、供應、操作和維護變得簡單。TiDB 的存儲層,稱為 TiKV,是一個Cloud Native Computing Foundation (CNCF) 畢業項目。TiDB 平臺的架構還允許 SQL 處理和存儲以非常云友好的方式相互獨立擴展。
最小化 ETL
TiDB 旨在支持事務處理 (OLTP) 和分析處理 (OLAP) 工作負載。這意味著,雖然傳統上您可能在 MySQL 上進行交易,然后將 (ETL) 數據提取、轉換和加載到列存儲中以進行分析處理,但不再需要此步驟。
高可用性
TiDB 使用 Raft 共識算法來確保數據在 Raft 組中的整個存儲中的高可用和安全復制。如果發生故障,Raft 組會自動為故障成員選舉新的領導者,并在無需任何人工干預的情況下自愈 TiDB 集群。故障和自愈操作對應用程序也是透明的。
整體架構:
開源地址:
https://github.com/pingcap/tidb
5.Netpoll
Netpoll是字節跳動內部的 Golang 高性能、I/O 非阻塞的網絡庫,專注于 RPC 場景。
開源社區目前缺少專注于 RPC 方案的 Go 網絡庫。類似的項目如:evio、gnet 等,均面向 Redis、Haproxy 這樣的場景。因此 Netpoll 應運而生,它借鑒了 evio 和 Netty 的優秀設計,具有出色的性能,更適用于微服務架構。
整體架構:
netpoll 將 Reactor 以 1:N 的形式組合成主從模式。
MainReactor 主要管理 Listener,負責監聽端口,建立新連接;
SubReactor 負責管理 Connection,監聽分配到的所有連接,并將所有觸發的事件提交到協程池里進行處理。
netpoll 在 I/O Task 中引入了主動的內存管理,向上層提供 NoCopy 的調用接口,由此支持 NoCopy RPC。
使用協程池集中處理 I/O Task,減少 goroutine 數量和調度開銷。
開源地址:
https://github.com/cloudwego/netpoll
Java經典開源項目
這里推薦一些最值得閱讀優秀的Java開源項目。
1.Netty
Netty是一個Java NIO技術的開源異步事件驅動的網絡編程框架,用于快速開發可維護的高性能協議服務器和客戶端。
往通俗了講,可以將Netty理解為:一個將Java NIO進行了大量封裝,并大大降低Java NIO使用難度和上手門檻的超牛逼框架。
特點:
設計
各種傳輸類型的統一 API - 阻塞和非阻塞套接字
基于靈活和可擴展的事件模型,允許清晰的關注點分離
高度可定制的線程模型——單線程、一個或多個線程池,如 SEDA
真正的無連接數據報套接字支持(自 3.1 起)
便于使用
有據可查的 Javadoc、用戶指南和示例
沒有額外的依賴,JDK 5 (Netty 3.x) 或 6 (Netty 4.x) 就足夠了
注意:某些組件(例如 HTTP/2)可能有更多要求。?有關更多信息,請參閱?要求頁面。
表現
更高的吞吐量,更低的延遲
更少的資源消耗
最小化不必要的內存復制
安全
完整的 SSL/TLS 和 StartTLS 支
開源地址:
https://github.com/netty/netty
2.J2EE框架 Spring
star:45.1k; fork:31.8k
Spring Framework 是一個開源的Java/Java EE全功能棧(full-stack)的應用程序框架,以Apache許可證形式發布,也有.NET平臺上的移植版本。該框架基于 Expert One-on-One Java EE Design and Development(ISBN 0-7645-4385-7)一書中的代碼,最初由 Rod Johnson 和 Juergen Hoeller等開發。Spring Framework 提供了一個簡易的開發方式,這種開發方式,將避免那些可能致使底層代碼變得繁雜混亂的大量的屬性文件和幫助類。
Spring 中包含的關鍵特性:
強大的基于 JavaBeans 的采用控制翻轉(Inversion of Control,IoC)原則的配置管理,使得應用程序的組建更加快捷簡易。
一個可用于從 applet 到 Java EE 等不同運行環境的核心 Bean 工廠。
數據庫事務的一般化抽象層,允許宣告式(Declarative)事務管理器,簡化事務的劃分使之與底層無關。
內建的針對 JTA 和 單個 JDBC 數據源的一般化策略,使 Spring 的事務支持不要求 Java EE 環境,這與一般的 JTA 或者 EJB CMT 相反。
JDBC 抽象層提供了有針對性的異常等級(不再從SQL異常中提取原始代碼), 簡化了錯誤處理, 大大減少了程序員的編碼量. 再次利用JDBC時,你無需再寫出另一個 '終止' (finally) 模塊. 并且面向JDBC的異常與Spring 通用數據訪問對象 (Data Access Object) 異常等級相一致.
以資源容器,DAO 實現和事務策略等形式與 Hibernate,JDO 和 iBATIS SQL Maps 集成。利用眾多的翻轉控制方便特性來全面支持, 解決了許多典型的Hibernate集成問題. 所有這些全部遵從Spring通用事務處理和通用數據訪問對象異常等級規范.
靈活的基于核心 Spring 功能的 MVC 網頁應用程序框架。開發者通過策略接口將擁有對該框架的高度控制,因而該框架將適應于多種呈現(View)技術,例如 JSP,FreeMarker,Velocity,Tiles,iText 以及 POI。值得注意的是,Spring 中間層可以輕易地結合于任何基于 MVC 框架的網頁層,例如 Struts,WebWork,或 Tapestry。
提供諸如事務管理等服務的面向方面編程框架。
開源地址:
https://github.com/spring-projects/spring-framework
3.Android 開源框架 EventBus Android
star:23.1k; fork:4.6k
如果你學習過設計模式,那么當想通知其他組件某些事情發生時你一定會使用觀察者模式。好了,既然能想到這個設計模式,那么就來看一個屌爆天的Android開源框架EventBus。主要功能是替代Intent、Handler、BroadCast在Fragment、Activity、Service、線程之間傳遞消息。他的最牛逼優點是開銷小,代碼簡潔,解耦代碼。
特點:
簡化組件之間的通信
分離事件發送者和接收者
在 UI 工件(例如活動、片段)和后臺線程中表現良好
避免復雜且容易出錯的依賴關系和生命周期問題
很快;專為高性能而優化
很小(~60k jar)
是在實踐中被證明通過應用與1,000,000,000+安裝
具有交付線程、訂閱者優先級等高級功能。
開源地址:
https://github.com/greenrobot/EventBus
4.Java 設計模式 java-design-patterns
star:71.4k;fork:22.2k
設計模式是程序員在設計應用程序或系統時解決常見問題的最佳實踐,重用設計模式有助于防止可能導致重大問題的細微問題,同時熟悉模式的程序員和架構師的代碼也更具可讀性。
開源地址:
https://github.com/iluwatar/java-design-patterns
參考
https://www.jianshu.com/p/2614fdb5d1c3
https://www.jianshu.com/p/6e49aa5182f0
https://walterzhaojr.github.io/
https://www.zhihu.com/question/26415445
- END -
看完一鍵三連在看,轉發,點贊
是對文章最大的贊賞,極客重生感謝你
推薦閱讀
基本功為什么如此重要!
深入理解虛擬化
深入理解Golang 編程思維和工程實戰
總結
以上是生活随笔為你收集整理的今年你参与开源了吗?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 深入理解分布式消息队列
- 下一篇: 130 道 K8s + Docker +