描述
內容簡介
◆從零建置:Linux基礎與環境設定
◆Shell腳本:變數、流程控制、偵錯 ◆編譯連結:掌握程式轉化機制 ◆Git版控:版本管理與分支協作 ◆網路基礎:TCP/IP、socket通訊 ◆高併發:多程式、多執行緒、I/O多工 ◆後端架構:守護程式、日誌、啟停 ◆協定設計:序列化與應用層格式 ◆MyRPC框架:事件分發與併發模型 ◆微服務叢集:Redis、User/Auth整合 ◆工具集:壓力測試、介面測試、生成 ◆思維養成:跨語言、動手實踐、工匠魂
【內容簡介】 本書從內容上可分為三大部分:基礎部分、進階部分和高級部分。 基礎部分(第1~6章)的內容主要包括Linux後端開發概述、開發環境架設、伺服器運行維護、shell程式設計簡介、實現簡易shell以及使用Git管理程式等方面的知識。 進階部分(第7~10章)的內容主要包括C/C++程式的編譯、連結、執行與偵錯,後端服務撰寫,網路通訊基礎以及I/O模型與併發等方面的知識。 高級部分(第11~14章)的內容主要包括公共程式提煉、應用層協定設計與實現、MyRPC框架設計與實現以及微服務叢集等方面的知識。 這些內容將幫助讀者更深入地了解Linux C/C++後端開發的高級技術。
【目標讀者】 • C/C++ 開發人員。 • Linux 後端開發人員。 • 大專院校電腦相關專業的師生及教育訓練學校的學員。 • 對Linux 後端開發感興趣,或希望從事Linux 後端開發的人員。 |
作者簡介
|
目錄
▌第1章 概述
1.1 本書不會涉及的內容 1.2 本書專注的內容 1.3 為什麼這麼安排 1.4 Linux 是什麼 1.5 後端開發是什麼 1.6 您將學到什麼 1.7 程式目錄結構說明 1.7.1 目錄MyRPC 1.7.2 第三方相依 1.8 如何學習Linux 後端開發 1.8.1 堅持不懈的心態 1.8.2 以問題作為切入點 1.8.3 動手實踐和創造 1.9 本章小結
▌第2章 開發環境架設 2.1 本機開發環境 2.1.1 程式編輯器 2.1.2 終端管理器 2.1.3 測試工具 2.2 遠端執行環境 2.3 本章小結
▌第3章 伺服器運行維護 3.1 什麼是shell 3.2 shell 下的命令列 3.2.1 命令列的組成 3.2.2 大部分命令具備的共通性 3.2.3 使用man 命令查詢線上手冊 3.2.4 命令和檔案補全 3.2.5 命令列的萬用字元和特殊符號 3.2.6 內建命令與外部命令 3.3 基本的命令操作 3.3.1 螢幕相關 3.3.2 目錄和檔案相關 3.3.3 處理程序相關 3.3.4 網路相關 3.3.5 系統相關 3.3.6 使用者相關 3.3.7 命令執行相關 3.3.8 日期相關 3.4 man 的替代工具 3.5 命令黏合劑:管道機制 3.5.1 如何使用管道 3.5.2 行過濾命令grep 3.5.3 文字分析處理工具awk 3.5.4 串流編輯命令sed 3.5.5 參數傳遞命令xargs 3.5.6 其他常用的輔助命令 3.6 命令輸入/ 輸出的重定向 3.7 命令的連續執行 3.8 vi 編輯器簡介 3.9 本章小結
▌第4章 shell 程式設計簡介 4.1 什麼是shell 程式設計 4.2 「hello world」程式 4.3 shell 的執行過程 4.4 偵錯 4.5 執行方式的不同 4.5.1 直接執行 4.5.2 使用bash 來執行 4.5.3 使用source 或英文點號「.」來執行 4.6 變數 4.6.1 環境變數 4.6.2 自訂變數 4.6.3 特殊變數 4.6.4 在C 語言中作業環境變數 4.6.5 查看處理程序執行時期的環境變數 4.7 選擇與判斷 4.7.1 test 命令與判斷符號「[]」 4.7.2 if 敘述 4.7.3 case 敘述 4.8 迴圈 4.8.1 while 迴圈 4.8.2 until 迴圈 4.8.3 for 迴圈 4.8.4 break 敘述和continue 敘述 4.9 函數 4.10 命令選項 4.11 本章小結
▌第5章 實現簡易shell 5.1 實現的特性 5.2 執行邏輯 5.3 實現原理 5.3.1 命令列解析 5.3.2 特性實現 5.3.3 函數介紹 5.4 程式實作 5.5 特性測試 5.6 本章小結
▌第6章 使用Git 管理程式 6.1 初始化 6.1.1 安裝Git 工具 6.1.2 設置使用者名稱和電子郵件 6.1.3 建立倉庫 6.1.4 建立readme.md 檔案 6.1.5 建立.gitignore 檔案 6.2 核心概念 6.3 常用操作 6.3.1 查看當前倉庫的狀態 6.3.2 增加檔案 6.3.3 刪除檔案 6.3.4 回退變更 6.3.5 查看提交日誌 6.3.6 查看差異 6.3.7 分支管理 6.3.8 其他操作 6.4 團隊協作 6.4.1 同步程式倉庫 6.4.2 建立自己的分支 6.4.3 推送分支到遠端倉庫 6.4.4 發起合入請求 6.4.5 發佈變更 6.5 本章小結
▌第7章 編譯、連結、執行與偵錯 7.1 單檔案程式的編譯與連結 7.1.1 前置處理階段 7.1.2 編譯階段 7.1.3 組合語言階段 7.1.4 連結階段 7.1.5 ELF 概述 7.1.6 符號解析與重定位 7.2 專案工程的編譯與連結 7.2.1 makefile 7.2.2 一個實例 7.2.3 實現簡易的make 命令 7.2.4 常用的編譯和連結選項 7.3 動態連結與靜態連結 7.4 Linux 動態連結程式庫規範 7.4.1 動態連結程式庫的命名 7.4.2 動態連結程式庫的三個不同名稱 7.4.3 動態連結程式庫的管理 7.5 自訂的動態連結程式庫 7.5.1 相關原始程式碼 7.5.2 生成攜帶「so name」的動態連結程式庫 7.5.3 生成不攜帶「so name」的動態連結程式庫 7.6 處理程序的記憶體模型 7.6.1 處理程序的虛擬位址空間版面配置 7.6.2 堆疊與堆積的區別 7.6.3 經典問題剖析 7.7 偵錯工具 7.7.1 gdb 的啟動 7.7.2 gdb 常用命令 7.8 本章小結
▌第8章 後端服務撰寫 8.1 守護處理程序 8.1.1 什麼是守護處理程序 8.1.2 守護處理程序如何撰寫 8.1.3 程式實現 8.2 設置資源限制 8.3 訊號處理 8.4 載入配置功能 8.5 命令列參數解析 8.6 日誌輸出功能 8.7 服務啟停指令稿 8.7.1 載入系統附帶的shell 函數 8.7.2 服務相關變數宣告 8.7.3 服務啟動函數 8.7.4 服務停止函數 8.7.5 服務重新啟動函數 8.7.6 服務狀態查看函數 8.7.7 case 敘述 8.8 本章小結
▌第9章 網路通訊基礎 9.1 TCP/IP 協定層概述 9.2 物理層與資料連結層 9.2.1 物理層 9.2.2 資料連結層 9.3 網路層 9.3.1 網際協定的特點 9.3.2 IP 資料封包格式 9.3.3 IP 位址 9.3.4 路由選擇 9.3.5 ARP 與RARP 9.3.6 ICMP 9.4 傳輸層 9.4.1 UDP 9.4.2 TCP 9.5 網路程式設計介面 9.5.1 TCP 網路通訊的基本流程 9.5.2 socket 網路程式設計 9.6 TCP 經典異常場景分析 9.6.1 場景1:Address already in use 9.6.2 場景2:Connection refused 9.6.3 場景3:Broken pipe 9.6.4 場景4:Connection timeout 9.6.5 場景5:Connection reset by peer 9.7 本章小結
▌第10章 I/O 模型與併發 10.1 I/O 模型概述 10.1.1 阻塞I/O 10.1.2 非阻塞I/O 10.1.3 I/O 多工 10.1.4 非同步I/O 10.2 併發實例——EchoServer 10.2.1 Echo 協定 10.2.2 程式碼協同 10.2.3 benchmark 工具 10.2.4 單處理程序 10.2.5 多處理程序 10.2.6 多執行緒 10.2.7 處理程序池1 10.2.8 處理程序池2 10.2.9 執行緒池 10.2.10 簡單的領導者- 跟隨者模型 10.2.11 I/O 多工之select( 單處理程序)- 阻塞I/O 10.2.12 I/O 多工之poll( 單處理程序)- 阻塞I/O 10.2.13 I/O 多工之epoll( 單處理程序)- 阻塞I/O 10.2.14 I/O 多工之epoll( 單處理程序)-Reactor 10.2.15 I/O 多工之epoll( 單處理程序)-Reactor-ET 模式 10.2.16 I/O 多工之epoll( 單處理程序)-Reactor- 程式碼協同池 10.2.17 I/O 多工之epoll( 執行緒池)-Reactor 10.2.18 I/O 多工之epoll( 執行緒池)-Reactor-HSHA 10.2.19 I/O 多工之epoll( 執行緒池)-Reactor-MS 10.2.20 I/O 多工之epoll( 處理程序池)-Reactor- 程式碼協同池 10.3 基準性能對比與分析 10.3.1 非I/O 重複使用模型對比 10.3.2 I/O 重複使用模型對比 10.3.3 epoll 下LT 模式和ET 模式對比 10.3.4 epoll 下程式碼協同池模式和非程式碼協同池模式對比 10.3.5 HSHA 模式下工作執行緒和I/O 執行緒寫入應答對比 10.3.6 MS 模式下MainReactor 執行緒是否監聽讀取事件對比 10.3.7 epoll 下動態和固定逾時時間對比 10.3.8 epoll 下處理程序池和執行緒池對比 10.4 本章小結
▌第11章 公共程式提煉 11.1 參數列表 11.2 命令列參數解析 11.3 字串 11.4 設定檔讀取 11.5 延遲執行 11.6 單例範本 11.7 百分位數計算 11.8 堅固的I/O 11.9 時間處理 11.10 狀態碼 11.11 轉換 11.12 socket 選項 11.13 「龍套」 11.14 日誌 11.15 服務鎖 11.16 本章小結
▌第12章 應用層協定設計與實現 12.1 協定概述 12.2 協定分類 12.2.1 按編碼方式對協定進行分類 12.2.2 按邊界劃分方式對協定進行分類 12.3 協定評判 12.4 自訂協定的優缺點 12.4.1 優點 12.4.2 缺點 12.5 協定設計 12.5.1 協定訊息格式 12.5.2 協定設計權衡 12.6 預備知識 12.6.1 大小端 12.6.2 位元組序 12.6.3 位元組序的互轉 12.6.4 記憶體物件與版面配置 12.6.5 指標類型的本質 12.6.6 序列化與反序列化 12.7 其他協定 12.7.1 HTTP 訊息格式 12.7.2 RESP 訊息格式 12.8 協定實現 12.8.1 協定編解碼抽象 12.8.2 MySvr 實現 12.8.3 HTTP 實現 12.8.4 RESP 實現 12.8.5 混合協定實現 12.8.6 共通性總結 12.9 本章小結
▌第13章 MyRPC 框架設計與實現 13.1 框架概述 13.2 併發模型 13.3 框架具體實現 13.3.1 服務啟動流程 13.3.2 事件分發流程 13.3.3 伺服器端請求處理流程 13.3.4 用戶端請求處理流程 13.3.5 分散式呼叫堆疊追蹤 13.3.6 逾時管理 13.3.7 本機程式碼協同變數管理 13.3.8 業務層的併發 13.4 範例服務Echo 13.4.1 目錄結構劃分 13.4.2 服務描述檔案 13.4.3 服務啟動 13.4.4 業務處理 13.4.5 配置與說明文件 13.4.6 通用的服務啟停指令稿 13.4.7 介面測試 13.5 工具集合 13.5.1 服務程式生成工具myrpcc 13.5.2 介面測試工具myrpct 13.5.3 介面壓力測試工具myrpcb 13.6 本章小結
▌第14章 微服務叢集 14.1 叢集架構概述 14.2 持久化層 14.2.1 Redis 服務 14.2.2 authstore 服務 14.2.3 userstore 服務 14.3 業務邏輯層 14.3.1 auth 服務 14.3.2 user 服務 14.4 連線層 14.4.1 目錄結構 14.4.2 程式與配置 14.4.3 介面測試 14.5 本章小結
▌第15章 回顧總結 15.1 6種思維模式 15.1.1 不要被程式語言所限制 15.1.2 掌握多種程式語言是必然的 15.1.3 電腦本身就是一個狀態機 15.1.4 動手是最好的實踐 15.1.5 依靠工具提高效率和品質 15.1.6 像工匠一樣為自己創造工具 15.2 寫在最後 |
序
前言
為什麼寫這本書 作為一名擁有超過12 年研發經驗的Linux C/C++ 後端開發工程師,我深刻地意識到這個領域所面臨的挑戰和機遇。在閱讀大量資料之後,我發現市面上雖然有很多關於UNIX 和Linux 程式設計的圖書,但更多的是Linux 系統運行維護手冊,缺乏針對後端開發和專案實踐的圖書。因此,我決定撰寫這本書,以填補這個空缺,為這個領域的讀者提供一個全面而實用的指南。 本書從實踐出發,提供具體的案例和實現程式,幫助讀者了解後端開發的實際工作流程和常用工具,以及如何在實踐中掌握Linux C/C++ 後端開發的核心技能。值得強調的是,市面上還沒有完整描述如何從0 到1 建構Linux C/C++後端微服務叢集的書,而本書將透過實踐案例和詳細的程式,幫助讀者從0 到1建構一個完整的後端微服務叢集。 初學者可以透過閱讀本書快速掌握Linux C/C++ 後端開發的核心技能,並直接從事相關職位的研發工作。對初級、中級或高級後端開發工程師來說,本書也能夠幫助他們快速提升技術水準,完善自身的技術知識系統,掌握Linux 後端開發的技術。無論是想要入門Linux 後端開發,還是想要深入了解這個領域的讀者,本書都將為您提供有價值的內容。
目標讀者 在閱讀本書之前,我建議讀者應具備一定的電腦理論基礎、Linux 基礎、C/C++ 語言基礎。將會有助讀者更進一步地理解本書中的概念和實踐案例。本書的目標讀者主要包括以下幾類人員。 • C/C++ 開發人員。 • Linux 後端開發人員。 • 大專院校電腦相關專業的師生及教育訓練學校的學員。 • 對Linux 後端開發感興趣,或希望從事Linux 後端開發的人員。
如何閱讀 本書從內容上可分為三大部分:基礎部分、進階部分和高級部分。 基礎部分(第1 ∼ 6 章)的內容主要包括Linux 後端開發概述、開發環境架設、伺服器運行維護、shell 程式設計簡介、實現簡易shell 以及使用Git 管理程式等方面的知識。對初學者來說,這些內容是非常有幫助的。 進階部分(第7 ∼ 10 章)的內容主要包括C/C++ 程式的編譯、連結、執行與偵錯,後端服務撰寫,網路通訊基礎以及I/O 模型與併發等方面的知識。這些內容將幫助讀者更深入地理解Linux C/C++ 後端開發的關鍵技術和實踐方法。 高級部分(第11 ∼ 14 章)的內容主要包括公共程式提煉、應用層協定設計與實現、MyRPC 框架設計與實現以及微服務叢集等方面的知識。這些內容將幫助讀者更深入地了解Linux C/C++ 後端開發的高級技術。 初學者可以從頭開始閱讀,按照章節順序逐步深入,先掌握基礎部分的知識,再逐步學習進階部分和高級部分的內容。這樣讀者就可以建立起一個完整的知識系統,快速掌握Linux C/C++ 後端開發的核心技能。 有一定基礎的讀者則可以跳過基礎部分,直接從進階部分開始閱讀。 已經掌握進階部分內容的讀者,則可以直接跳躍到高級部分,學習更加高級和實用的知識。
勘誤與建議 由於本人水準有限,本書難免存在一些疏漏或描述不當的地方,我非常歡迎讀者批評指正。 本書的全部程式可以從我的 GitHub 專案「BackEnd」上下載,專案連結為 https:// github.com/wanmuc/BackEnd。如果您對本書的內容有更好的意見和建議,您可以在GitHub 上留言,我會認真回覆您的回饋。
致謝 在此,我要特別感謝人民郵電出版社的編輯,他們的幫助使我能夠順利地完成本書的全部內容。他們的專業知識和耐心指導,讓我深刻地領悟到了編輯工作的艱辛和重要性。 同時,我也要感謝我的家人和朋友,感謝他們一直以來對我的支援和鼓勵,讓我能夠堅定地走在自己的職業道路上。沒有他們的陪伴和支援,我不可能完成這本書的寫作。 最後,我要向所有熱愛軟體開發的工程師致以崇高的敬意。正是你們的努力和創造,推動了軟體行業的不斷發展和進步。我希望本書能夠成為廣大軟體工程師有價值的學習資料,幫助他們更進一步地掌握Linux C/C++ 後端開發的核心技術。
註:一些圖中的英文沒有翻譯,是為了和程式碼一致,也是為了和一些開發文件一致。 |