本書全面介紹了Linux后端開發(fā)的相關(guān)知識(shí)和技能,涵蓋了Linux系統(tǒng)的各種功能和工具、Linux編程的相關(guān)知識(shí)和技能,以及開發(fā)后端服務(wù)和應(yīng)用程序的內(nèi)容。本書分為15章,主要內(nèi)容包括Linux后端開發(fā)概述,開發(fā)環(huán)境搭建,服務(wù)器運(yùn)維,shell編程簡(jiǎn)介,實(shí)現(xiàn)簡(jiǎn)易shell,使用Git管理代碼,編譯、鏈接、運(yùn)行與調(diào)試,后端服務(wù)編寫,網(wǎng)絡(luò)通信基礎(chǔ),I/O模型與并發(fā),公共代碼提煉,應(yīng)用層協(xié)議設(shè)計(jì)與實(shí)現(xiàn),MyRPC框架設(shè)計(jì)與實(shí)現(xiàn)以及微服務(wù)集群的構(gòu)建等。
本書講解通俗易懂,實(shí)例豐富,適合C/C++開發(fā)人員、Linux后端開發(fā)人員、對(duì)Linux后端開發(fā)感興趣或者希望從事Linux后端開發(fā)的人員閱讀,也適合作為高等院校計(jì)算機(jī)相關(guān)專業(yè)師生的學(xué)習(xí)用書及培訓(xùn)學(xué)校的教材。
詳細(xì)解讀Linux后端開發(fā),體系化介紹了后端開發(fā)人員所需的關(guān)鍵技能;
來自互聯(lián)網(wǎng)大廠的資審工程師,結(jié)合工作實(shí)踐寫作的Linux后端開發(fā)的圖書;
全面涵蓋了構(gòu)建RPC框架和微服務(wù)集群的技術(shù)難點(diǎn),附贈(zèng)源代碼;
幫助讀者從零開始構(gòu)建高效的RPC框架和微服務(wù)集群。
高等院校計(jì)算機(jī)相關(guān)專業(yè)的師生、C/C++研發(fā)人員、Linux后端研發(fā)人員、Linux C/C++后端研發(fā)人員、對(duì)Linux后端研發(fā)感興趣或者希望從事Linux后端研發(fā)的人員
目 錄
第 1章 概述 1
1.1 本書不會(huì)涉及的內(nèi)容 1
1.2 本書專注的內(nèi)容 1
1.3 為什么這么安排 1
1.4 Linux是什么 2
1.5 后端開發(fā)是什么 2
1.6 您將學(xué)到什么 3
1.7 代碼目錄結(jié)構(gòu)說明 3
1.7.1 目錄MyRPC 4
1.7.2 第三方依賴 4
1.8 如何學(xué)習(xí)Linux后端開發(fā) 4
1.8.1 堅(jiān)持不懈的心態(tài) 4
1.8.2 以問題作為切入點(diǎn) 4
1.8.3 動(dòng)手實(shí)踐和創(chuàng)造 5
1.9 本章小結(jié) 5
第 2章 開發(fā)環(huán)境搭建 6
2.1 本地開發(fā)環(huán)境 6
2.1.1 代碼編輯器 6
2.1.2 終端管理器 6
2.1.3 測(cè)試工具 6
2.2 遠(yuǎn)端運(yùn)行環(huán)境 7
2.3 本章小結(jié) 9
第3章 服務(wù)器運(yùn)維 10
3.1 什么是shell 10
3.2 shell下的命令行 11
3.2.1 命令行的組成 11
3.2.2 大部分命令具備的共性 11
3.2.3 使用man命令查詢?cè)诰手冊(cè) 12
3.2.4 命令和文件補(bǔ)全 13
3.2.5 命令行的通配符和特殊符號(hào) 13
3.2.6 內(nèi)置命令與外部命令 13
3.3 基本的命令操作 14
3.3.1 屏幕相關(guān) 14
3.3.2 目錄和文件相關(guān) 14
3.3.3 進(jìn)程相關(guān) 21
3.3.4 網(wǎng)絡(luò)相關(guān) 22
3.3.5 系統(tǒng)相關(guān) 22
3.3.6 用戶相關(guān) 24
3.3.7 命令執(zhí)行相關(guān) 25
3.3.8 日期相關(guān) 27
3.4 man的替代工具 27
3.5 命令黏合劑:管道機(jī)制 28
3.5.1 如何使用管道 28
3.5.2 行過濾命令grep 28
3.5.3 文本分析處理工具awk 29
3.5.4 流編輯命令sed 30
3.5.5 參數(shù)傳遞命令xargs 32
3.5.6 其他常用的輔助命令 34
3.6 命令輸入/輸出的重定向 35
3.7 命令的連續(xù)執(zhí)行 36
3.8 vi編輯器簡(jiǎn)介 36
3.9 本章小結(jié) 37
第4章 shell編程簡(jiǎn)介 38
4.1 什么是shell編程 38
4.2 “hello world”程序 38
4.3 shell的執(zhí)行過程 38
4.4 調(diào)試 39
4.5 執(zhí)行方式的不同 39
4.5.1 直接執(zhí)行 39
4.5.2 使用bash來執(zhí)行 40
4.5.3 使用source或英文點(diǎn)號(hào)“.”來執(zhí)行 40
4.6 變量 41
4.6.1 環(huán)境變量 41
4.6.2 自定義變量 41
4.6.3 特殊變量 42
4.6.4 在C語言中操作環(huán)境變量 43
4.6.5 查看進(jìn)程運(yùn)行時(shí)的環(huán)境變量 44
4.7 選擇與判斷 44
4.7.1 test命令與判斷符號(hào)“[]” 44
4.7.2 if語句 46
4.7.3 case語句 47
4.8 循環(huán) 48
4.8.1 while循環(huán) 48
4.8.2 until循環(huán) 48
4.8.3 for循環(huán) 49
4.8.4 break語句和continue語句 50
4.9 函數(shù) 50
4.10 命令選項(xiàng) 51
4.11 本章小結(jié) 51
第5章 實(shí)現(xiàn)簡(jiǎn)易shell 52
5.1 實(shí)現(xiàn)的特性 52
5.2 執(zhí)行邏輯 52
5.3 實(shí)現(xiàn)原理 52
5.3.1 命令行解析 52
5.3.2 特性實(shí)現(xiàn) 53
5.3.3 函數(shù)介紹 53
5.4 編碼實(shí)現(xiàn) 55
5.5 特性測(cè)試 64
5.6 本章小結(jié) 65
第6章 使用Git管理代碼 66
6.1 初始化 66
6.1.1 安裝Git工具 66
6.1.2 設(shè)置用戶名和郵箱 66
6.1.3 創(chuàng)建倉庫 66
6.1.4 創(chuàng)建readme.md文件 67
6.1.5 創(chuàng)建.gitignore文件 67
6.2 核心概念 67
6.3 常用操作 68
6.3.1 查看當(dāng)前倉庫的狀態(tài) 68
6.3.2 添加文件 69
6.3.3 刪除文件 69
6.3.4 回退變更 70
6.3.5 查看提交日志 70
6.3.6 查看差異 71
6.3.7 分支管理 71
6.3.8 其他操作 73
6.4 團(tuán)隊(duì)協(xié)作 74
6.4.1 同步代碼倉庫 74
6.4.2 創(chuàng)建自己的分支 74
6.4.3 推送分支到遠(yuǎn)程倉庫 75
6.4.4 發(fā)起合入請(qǐng)求 75
6.4.5 發(fā)布變更 75
6.5 本章小結(jié) 75
第7章 編譯、鏈接、運(yùn)行與調(diào)試 76
7.1 單文件程序的編譯與鏈接 76
7.1.1 預(yù)處理階段 77
7.1.2 編譯階段 78
7.1.3 匯編階段 79
7.1.4 鏈接階段 80
7.1.5 ELF概述 80
7.1.6 符號(hào)解析與重定位 82
7.2 工程項(xiàng)目的編譯與鏈接 85
7.2.1 makefile 86
7.2.2 一個(gè)實(shí)例 87
7.2.3 實(shí)現(xiàn)簡(jiǎn)易的make命令 92
7.2.4 常用的編譯和鏈接選項(xiàng) 100
7.3 動(dòng)態(tài)鏈接與靜態(tài)鏈接 102
7.4 Linux動(dòng)態(tài)鏈接庫規(guī)范 103
7.4.1 動(dòng)態(tài)鏈接庫的命名 104
7.4.2 動(dòng)態(tài)鏈接庫的三個(gè)不同名稱 104
7.4.3 動(dòng)態(tài)鏈接庫的管理 105
7.5 自定義的動(dòng)態(tài)鏈接庫 107
7.5.1 相關(guān)源代碼 107
7.5.2 生成攜帶“so name”的動(dòng)態(tài)鏈接庫 108
7.5.3 生成不攜帶“so name”的動(dòng)態(tài)鏈接庫 109
7.6 進(jìn)程的內(nèi)存模型 110
7.6.1 進(jìn)程的虛擬地址空間布局 110
7.6.2 棧與堆的區(qū)別 111
7.6.3 經(jīng)典問題剖析 111
7.7 調(diào)試程序 115
7.7.1 gdb的啟動(dòng) 115
7.7.2 gdb常用命令 115
7.8 本章小結(jié) 118
第8章 后端服務(wù)編寫 119
8.1 守護(hù)進(jìn)程 119
8.1.1 什么是守護(hù)進(jìn)程 119
8.1.2 守護(hù)進(jìn)程如何編寫 119
8.1.3 代碼實(shí)現(xiàn) 121
8.2 設(shè)置資源限制 122
8.3 信號(hào)處理 123
8.4 加載配置功能 124
8.5 命令行參數(shù)解析 125
8.6 日志輸出功能 125
8.7 服務(wù)啟停腳本 126
8.7.1 加載系統(tǒng)自帶的shell函數(shù) 128
8.7.2 服務(wù)相關(guān)變量聲明 128
8.7.3 服務(wù)啟動(dòng)函數(shù) 128
8.7.4 服務(wù)停止函數(shù) 128
8.7.5 服務(wù)重啟函數(shù) 128
8.7.6 服務(wù)狀態(tài)查看函數(shù) 129
8.7.7 case語句 129
8.8 本章小結(jié) 129
第9章 網(wǎng)絡(luò)通信基礎(chǔ) 130
9.1 TCP/IP協(xié)議棧概述 130
9.2 物理層與數(shù)據(jù)鏈路層 132
9.2.1 物理層 132
9.2.2 數(shù)據(jù)鏈路層 132
9.3 網(wǎng)絡(luò)層 133
9.3.1 網(wǎng)際協(xié)議的特點(diǎn) 133
9.3.2 IP數(shù)據(jù)報(bào)格式 133
9.3.3 IP地址 135
9.3.4 路由選擇 138
9.3.5 ARP與RARP 139
9.3.6 ICMP 145
9.4 傳輸層 156
9.4.1 UDP 157
9.4.2 TCP 158
9.5 網(wǎng)絡(luò)編程接口 173
9.5.1 TCP網(wǎng)絡(luò)通信的基本流程 173
9.5.2 socket網(wǎng)絡(luò)編程 174
9.6 TCP經(jīng)典異常場(chǎng)景分析 181
9.6.1 場(chǎng)景1:Address already in use 181
9.6.2 場(chǎng)景2:Connection refused 181
9.6.3 場(chǎng)景3:Broken pipe 182
9.6.4 場(chǎng)景4:Connection timeout 182
9.6.5 場(chǎng)景5:Connection reset by peer 184
9.7 本章小結(jié) 184
第 10章 I/O模型與并發(fā) 185
10.1 I/O模型概述 185
10.1.1 阻塞I/O 185
10.1.2 非阻塞I/O 185
10.1.3 I/O多路復(fù)用 185
10.1.4 異步I/O 186
10.2 并發(fā)實(shí)例——EchoServer 186
10.2.1 Echo協(xié)議 186
10.2.2 協(xié)程 190
10.2.3 benchmark工具 201
10.2.4 單進(jìn)程 204
10.2.5 多進(jìn)程 205
10.2.6 多線程 206
10.2.7 進(jìn)程池1 207
10.2.8 進(jìn)程池2 208
10.2.9 線程池 209
10.2.10 簡(jiǎn)單的領(lǐng)導(dǎo)者-跟隨者模型 210
10.2.11 I/O多路復(fù)用之select(單進(jìn)程)-阻塞I/O 212
10.2.12 I/O多路復(fù)用之poll(單進(jìn)程)-阻塞I/O 214
10.2.13 I/O多路復(fù)用之epoll(單進(jìn)程)-阻塞I/O 216
10.2.14 I/O多路復(fù)用之epoll(單進(jìn)程)-Reactor 222
10.2.15 I/O多路復(fù)用之epoll(單進(jìn)程)-Reactor-ET模式 225
10.2.16 I/O多路復(fù)用之epoll(單進(jìn)程)-Reactor-協(xié)程池 226
10.2.17 I/O多路復(fù)用之epoll(線程池)-Reactor 229
10.2.18 I/O多路復(fù)用之epoll(線程池)-Reactor-HSHA 230
10.2.19 I/O多路復(fù)用之epoll(線程池)-Reactor-MS 233
10.2.20 I/O多路復(fù)用之epoll(進(jìn)程池)-Reactor-協(xié)程池 236
10.3 基準(zhǔn)性能對(duì)比與分析 239
10.3.1 非I/O復(fù)用模型對(duì)比 239
10.3.2 I/O復(fù)用模型對(duì)比 240
10.3.3 epoll下LT模式和ET模式對(duì)比 240
10.3.4 epoll下協(xié)程池模式和非協(xié)程池模式對(duì)比 241
10.3.5 HSHA模式下工作線程和I/O線程寫應(yīng)答對(duì)比 241
10.3.6 MS模式下MainReactor線程是否監(jiān)聽可讀事件對(duì)比 241
10.3.7 epoll下動(dòng)態(tài)和固定超時(shí)時(shí)間對(duì)比 242
10.3.8 epoll下進(jìn)程池和線程池對(duì)比 242
10.4 本章小結(jié) 243
第 11章 公共代碼提煉 244
11.1 參數(shù)列表 244
11.2 命令行參數(shù)解析 245
11.3 字符串 248
11.4 配置文件讀取 249
11.5 延遲執(zhí)行 251
11.6 單例模板 252
11.7 百分位數(shù)計(jì)算 252
11.8 魯棒的I/O 253
11.9 時(shí)間處理 254
11.10 狀態(tài)碼 255
11.11 轉(zhuǎn)換 256
11.12 socket選項(xiàng) 257
11.13 “龍?zhí)住?258
11.14 日志文件 260
11.15 服務(wù)鎖 262
11.16 本章小結(jié) 263
第 12章 應(yīng)用層協(xié)議設(shè)計(jì)與實(shí)現(xiàn) 264
12.1 協(xié)議概述 264
12.2 協(xié)議分類 264
12.2.1 按編解碼方式對(duì)協(xié)議進(jìn)行分類 265
12.2.2 按邊界劃分方式對(duì)協(xié)議進(jìn)行分類 265
12.3 協(xié)議評(píng)判 266
12.4 自定義協(xié)議的優(yōu)缺點(diǎn) 266
12.4.1 優(yōu)點(diǎn) 266
12.4.2 缺點(diǎn) 267
12.5 協(xié)議設(shè)計(jì) 267
12.5.1 協(xié)議消息格式 267
12.5.2 協(xié)議設(shè)計(jì)權(quán)衡 268
12.6 預(yù)備知識(shí) 268
12.6.1 大小端 268
12.6.2 字節(jié)序 269
12.6.3 字節(jié)序的互轉(zhuǎn) 270
12.6.4 內(nèi)存對(duì)象與布局 272
12.6.5 指針類型的本質(zhì) 272
12.6.6 序列化與反序列化 273
12.7 其他協(xié)議 274
12.7.1 HTTP消息格式 275
12.7.2 RESP消息格式 276
12.8 協(xié)議實(shí)現(xiàn) 276
12.8.1 協(xié)議編解碼抽象 277
12.8.2 MySvr實(shí)現(xiàn) 279
12.8.3 HTTP實(shí)現(xiàn) 284
12.8.4 RESP實(shí)現(xiàn) 289
12.8.5 混合協(xié)議實(shí)現(xiàn) 293
12.8.6 共性總結(jié) 295
12.9 本章小結(jié) 296
第 13章 MyRPC框架設(shè)計(jì)與實(shí)現(xiàn) 297
13.1 框架概述 297
13.2 并發(fā)模型 298
13.3 框架具體實(shí)現(xiàn) 299
13.3.1 服務(wù)啟動(dòng)流程 300
13.3.2 事件分發(fā)流程 304
13.3.3 服務(wù)器端請(qǐng)求處理流程 311
13.3.4 客戶端請(qǐng)求處理流程 321
13.3.5 分布式調(diào)用棧追蹤 334
13.3.6 超時(shí)管理 338
13.3.7 本地協(xié)程變量管理 338
13.3.8 業(yè)務(wù)層的并發(fā) 339
13.4 示例服務(wù)Echo 339
13.4.1 目錄結(jié)構(gòu)劃分 340
13.4.2 服務(wù)描述文件 340
13.4.3 服務(wù)啟動(dòng) 341
13.4.4 業(yè)務(wù)處理 341
13.4.5 配置與輔助文件 342
13.4.6 通用的服務(wù)啟停腳本 345
13.4.7 接口測(cè)試 346
13.5 工具集合 347
13.5.1 服務(wù)代碼生成工具myrpcc 347
13.5.2 接口測(cè)試工具myrpct 362
13.5.3 接口壓測(cè)工具myrpcb 365
13.6 本章小結(jié) 371
第 14章 微服務(wù)集群 372
14.1 集群架構(gòu)概述 372
14.2 持久化層 372
14.2.1 Redis服務(wù) 373
14.2.2 authstore服務(wù) 373
14.2.3 userstore服務(wù) 375
14.3 業(yè)務(wù)邏輯層 379
14.3.1 auth服務(wù) 379
14.3.2 user服務(wù) 383
14.4 接入層 387
14.4.1 目錄結(jié)構(gòu) 387
14.4.2 代碼與配置 388
14.4.3 接口測(cè)試 389
14.5 本章小結(jié) 389
第 15章 回顧總結(jié) 390
15.1 6種思維模式 390
15.1.1 不要被編程語言所限制 390
15.1.2 掌握多種編程語言是必然的 390
15.1.3 計(jì)算機(jī)本身就是一個(gè)狀態(tài)機(jī) 391
15.1.4 動(dòng)手是最好的實(shí)踐 391
15.1.5 依靠工具提高效率和質(zhì)量 391
15.1.6 像工匠一樣為自己創(chuàng)造工具 391
15.2 寫在最后 391