這是一本手把手教讀者如何零基礎快速掌握企業級Go項目全流程開發的實戰性著作。內容初稿源于極客時間上的專欄(有超過25000人付費學習),圖書內容在專欄的基礎上做了全面的更新和大量的補充。
作者是騰訊云的技術專家,有多年的企業級Go項目開發經驗。全書圍繞一個可部署、可運行的企業級Go應用(附源碼,可二次開發)展開,覆蓋項目全生命周期的所有環節,不僅將每個環節涉及的原理、步驟講解得非常詳細,而且把項目涉及的Go語言知識點全部娓娓道來。每個知識點都朝著*佳實踐方向去設計,采用了業界共識程度*高的Go包、Go設計模式、Go開發規范、Go簡潔架構等,不僅能讓讀者事半功倍地掌握企業級Go項目的開發方法,而且能學到一線大廠的*佳實踐。
本書內容翔實,篇幅較大,一共31章,分為六個部分:第一部分是項目開始前的準備工作,包括貫穿全書的實戰項目IAM的介紹與部署,以及Go開發環境的搭建;第二至六部分詳細講解了項目的設計、管理、開發、測試、部署等。包含了規范設計、文檔編寫、開發流程管理、功能設計與實現、項目測試、性能優化、高可用、高安全、水平擴展等方方面面。旨在幫助讀者徹底學會如何構建企業級 Go 項目,并解決 Go 項目開發所面臨的各類問題。
第一部分 項目準備
第1章 Go開發環境準備2
1.1 機器選擇2
1.1.1 開發機選擇3
1.1.2 辦公機選擇3
1.2 Windows終端模擬器安裝和配置3
1.3 Linux服務器申請和配置4
1.3.1 Linux服務器申請4
1.3.2 登錄Linux服務器5
1.3.3 Linux服務器配置6
1.3.4 依賴安裝和配置8
1.4 Go編譯環境安裝和配置9
1.4.1 Go編譯工具安裝和配置10
1.4.2 Protobuf編譯環境安裝11
1.5 Go IDE安裝和配置12
1.6 本章總結14
第2章 快速部署IAM系統15
2.1 為什么選擇IAM系統作為實戰項目15
2.2 IAM系統概述16
2.2.1 IAM資源授權流程16
2.2.2 IAM系統架構介紹17
2.2.3 通過使用流程理解架構18
2.3 下載IAM項目代碼20
2.4 安裝和配置數據庫21
2.4.1 配置scripts/install/environment.sh21
2.4.2 安裝和配置MariaDB21
2.4.3 安裝和配置Redis22
2.4.4 安裝和配置MongoDB22
2.5 安裝和配置IAM系統24
2.5.1 準備工作25
2.5.2 安裝和配置iam-apiserver28
2.5.3 安裝iamctl32
2.5.4 安裝和配置iam-authz-server34
2.5.5 安裝和配置iam-pump36
2.5.6 安裝和配置 iam-watcher38
2.5.7 安裝 man 文件39
2.5.8 測試IAM系統是否安裝成功40
2.6 彩蛋:一鍵安裝40
2.7 本章總結41
第二部分 項目設計
第3章 規范設計44
3.1 有哪些地方需要制定規范44
3.2 開源規范45
3.2.1 開源協議概述45
3.2.2 開源協議選擇46
3.2.3 開源規范有什么47
3.2.4 開源規范詳細內容47
3.2.5 運營開源項目48
3.3 文檔規范49
3.3.1 README 文檔規范49
3.3.2 項目文檔規范50
3.3.3 API文檔規范51
3.4 Commit Message規范53
3.4.1 Commit Message規范有哪些53
3.4.2 與Commit Message相關的3個
重要內容59
3.4.3 Commit Message規范自動化66
3.5 版本規范67
3.5.1 什么是語義化版本規范67
3.5.2 語義化版本規范示例69
3.5.3 如何確定版本號69
3.6 本章總結69
第4章 目錄結構設計71
4.1 如何規范目錄71
4.2 平鋪式目錄結構72
4.3 結構化目錄結構73
4.3.1 Go應用:主要存放前后端代碼75
4.3.2 Go應用:主要存放測試相關的
文件和代碼78
4.3.3 Go應用:存放與應用部署相關
的文件78
4.3.4 項目管理:存放管理Go項目的
各類文件79
4.3.5 文檔:主要存放項目的各類文檔80
4.3.6 不建議的目錄82
4.4 一些建議82
4.5 本章總結83
第5章 工作流設計84
5.1 集中式工作流84
5.2 功能分支工作流85
5.3 Git Flow工作流88
5.3.1 Git Flow的5種分支88
5.3.2 Git Flow開發流程88
5.4 Forking工作流91
5.5 本章總結93
第6章 研發流程設計95
6.1 如何設計Go項目的研發流程95
6.2 在設計研發流程時,需要關注
哪些點96
6.3 業界相對標準的研發流程96
6.3.1 需求階段96
6.3.2 設計階段98
6.3.3 開發階段98
6.3.4 測試階段100
6.3.5 發布階段100
6.3.6 運營階段102
6.4 角色與分工102
6.5 如何管理應用的生命周期104
6.6 應用生命周期管理技術有哪些104
6.7 研發模式105
6.8 CI/CD:自動化構建和部署應用106
6.8.1 持續集成107
6.8.2 持續交付107
6.8.3 持續部署107
6.9 DevOps:研發運維一體化108
6.9.1 AIOps:智能運維108
6.9.2 ChatOps:聊著天就把事情
給辦了109
6.9.3 GitOps:一種實現云原生的
持續交付模型109
6.9.4 NoOps:無運維110
6.10 如何選擇合適的應用生命周期
管理技術111
6.11 本章總結111
第7章 如何寫出優雅的Go項目112
7.1 優雅Go項目實現思路112
7.2 編寫高質量的Go應用113
7.2.1 代碼結構114
7.2.2 代碼規范115
7.2.3 代碼質量116
7.2.4 編程哲學119
7.2.5 軟件設計方法124
7.3 高效管理項目125
7.3.1 高效的開發流程125
7.3.2 使用Makefile管理項目126
7.3.3 自動生成代碼126
7.3.4 善于借助工具127
7.3.5 對接CI/CD127
7.4 編寫高質量的項目文檔128
7.5 本章總結128
第8章 Go語言設計模式?130
8.1 創建型模式131
8.1.1 單例模式131
8.1.2 工廠模式133
8.2 行為型模式136
8.2.1 策略模式136
8.2.2 模板模式138
8.3 結構型模式139
8.3.1 代理模式139
8.3.2 選項模式140
8.4 本章總結144
第三部分 項目管理
第9章 如何編寫Makefile148
9.1 規劃Makefile要實現的功能149
9.2 設計合理的Makefile結構151
9.3 掌握Makefile編寫技巧153
9.3.1 善用通配符和自動變量153
9.3.2 善用函數153
9.3.3 依賴需要用到的工具154
9.3.4 把常用功能放在/Makefile中,
不常用的放在分類Makefile中154
9.3.5 編寫可擴展的Makefile155
9.3.6 將所有輸出存放在一個目錄下,
方便清理和查找156
9.3.7 使用帶層級的命名方式156
9.3.8 做好目標拆分157
9.3.9 設置OPTIONS157
9.3.10 定義環境變量158
9.3.11 自己調用自己159
9.4 本章總結159
第10章 IAM項目研發流程實戰160
10.1 開發階段160
10.1.1 代碼開發160
10.1.2 代碼提交165
10.2 測試階段167
10.3 IAM項目的Makefile項目管理
技巧168
10.3.1 Makefile help命令自動解析169
10.3.2 在options中指定變量值169
10.3.3 自動生成CHANGELOG169
10.3.4 自動生成版本號169
10.3.5 保持行為一致170
10.4 本章總結171
第11章 靜態代碼檢查172
11.1 為什么選擇golangci-lint做靜態
代碼檢查172
11.2 golangci-lint命令173
11.3 golangci-lint配置175
11.4 如何使用golangci-lint進行靜態
代碼檢查178
11.5 golangci-lint使用技巧180
11.6 本章總結182
第12章 生成Swagger API文檔183
12.1 Swagger介紹183
12.2 Swagger和OpenAPI的區別184
12.3 用go-swagger來生成Swagger API
文檔184
12.3.1 安裝swagger工具185
12.3.2 swagger命令行工具介紹185
12.4 如何使用swagger命令生成
Swagger文檔186
12.4.1 解析注釋生成Swagger文檔186
12.4.2 go-swagger其他常用功能介紹192
12.5 IAM Swagger文檔194
12.6 本章總結195
第四部分 項目開發
第13章 錯誤處理198
13.1 錯誤碼設計198
13.1.1 期望錯誤碼實現的功能199
13.1.2 常見的錯誤碼實現方式199
13.1.3 錯誤碼設計建議201
13.1.4 業務Code碼設計201
13.1.5 如何設置HTTP狀態碼202
13.2 IAM項目錯誤碼設計規范203
13.2.1 錯誤碼設計規范203
13.2.2 錯誤信息規范說明204
13.2.3 IAM API返回值說明204
13.3 錯誤包204
13.3.1 錯誤包需要具有哪些功能204
13.3.2 錯誤包的實現208
13.3.3 如何記錄錯誤212
13.4 一個錯誤碼的具體實現215
13.5 錯誤碼實際使用示例218
13.6 本章總結219
第14章 日志處理220
14.1 如何設計日志包220
14.1.1 基礎功能220
14.1.2 高級功能222
14.1.3 可選功能224
14.1.4 設計時需要關注的點226
14.2 如何記錄日志226
14.2.1 在何處打印日志227
14.2.2 在哪個日志級別打印日志228
14.2.3 如何記錄日志內容229
14.2.4 記錄日志的佳實踐總結230
14.3 拓展內容:分布式日志解決方案
(EFK/ELK)230
14.4 有哪些優秀的開源日志包231
14.4.1 標準庫log包232
14.4.2 glog232
14.4.3 logrus232
14.4.4 zap233
14.4.5 開源日志包選擇233
14.5 從零開始編寫一個日志包234
14.5.1 定義日志級別和日志選項234
14.5.2 創建Logger及各級別日志
打印方法236
14.5.3 將日志記錄到支持的輸出中237
14.5.4 自定義日志輸出格式239
14.5.5 測試日志包239
14.6 IAM項目日志包設計實戰240
14.7 本章總結244
第15章 GORM ORM應用245
15.1 GORM基礎知識245
15.2 通過示例學習GORM246
15.2.1 自動遷移表結構248
15.2.2 插入表記錄248
15.2.3 獲取符合條件的記錄248
15.2.4 更新表記錄248
15.2.5 刪除表記錄249
15.2.6 獲取表記錄列表249
15.3 GORM常用操作講解249
15.3.1 模型定義250
15.3.2 連接數據庫251
15.3.3 創建記錄251
15.3.4 刪除記錄252
15.3.5 更新記錄253
15.3.6 查詢數據253
15.3.7 高級查詢254
15.3.8 原生SQL255
15.3.9 GORM鉤子255
15.4 iam-apiserver中的CURD操作256
15.5 本章總結260
第16章 Web服務功能實現261
16.1 Web服務的核心功能261
16.1.1 基礎功能262
16.1.2 高級功能262
16.2 Web框架為什么選擇Gin263
16.3 Gin是如何支持Web服務的基礎
功能的264
16.3.1 HTTP/HTTPS支持268
16.3.2 JSON數據格式支持269
16.3.3 路由匹配270
16.3.4 路由分組270
16.3.5 一進程多服務271
16.3.6 參數解析、參數校驗、邏輯
處理、返回結果272
16.4 Gin是如何支持Web服務的高級
功能的274
16.4.1 中間件274
16.4.2 認證、RequestID、跨域277
16.4.3 優雅關停277
16.5 本章總結279
第17章 IAM應用構建280
17.1 如何構建應用框架280
17.2 應用構建三劍客281
17.2.1 命令行參數解析工具:Pflag281
17.2.2 配置解析神器:Viper285
17.2.3 現代化的命令行框架:Cobra291
17.3 構建應用的基礎:應用的三大
基本功能297
17.4 iam-apiserver是如何構建應用
框架的298
17.5 App包的設計和實現300
17.5.1 構建應用301
17.5.2 命令行程序構建301
17.5.3 命令行參數解析302
17.5.4 配置文件解析305
17.6 IAM應用構建的優秀特性306
17.7 構建應用的注意事項307
17.8 本章總結307
第18章 IAM認證功能實現309
18.1 認證與授權的區別309
18.2 4種基本的認證方式310
18.2.1 基礎認證310
18.2.2 摘要認證311
18.2.3 開放授權認證312
18.2.4 令牌認證314
18.3 基于JWT的Token認證機制實現314
18.3.1 JWT簡介314
18.3.2 JWT認證流程315
18.3.3 JWT格式315
18.4 如何設計IAM項目的認證功能318
18.5 IAM項目是如何實現Basic
認證的320
18.6 IAM項目是如何實現Bearer
認證的326
18.6.1 iam-authz-server Bearer認證
實現326
18.6.2 iam-apiserver Bearer認證
實現330
18.7 IAM項目認證功能設計技巧333
18.8 本章總結334
第19章 IAM API服務構建335
19.1 RESTful API介紹335
19.1.1 什么是RESTful API336
19.1.2 RESTful API設計原則337
19.1.3 RESTful API示例341
19.2 RPC API介紹341
19.2.1 什么是RPC 341
19.2.2 gRPC簡介342
19.2.3 Protocol Buffers介紹343
19.2.4 gRPC示例344
19.3 REST與gRPC351
19.4 iam-apiserver服務介紹352
19.4.1 iam-apiserver功能介紹352
19.4.2 iam-apiserver使用方法介紹353
19.5 iam-apiserver代碼實現357
19.5.1 iam-apiserver配置處理357
19.5.2 iam-apiserver啟動流程359
19.5.3 iam-apiserver的RESTful API
請求處理流程360
19.5.4 iam-apiserver代碼架構361
19.6 iam-apiserver服務核心功能實現
講解369
19.6.1 與應用框架相關的特性369
19.6.2 與編程規范相關的特性375
19.6.3 其他特性383
19.7 本章總結387
第20章 IAM Authz服務構建388
20.1 權限基礎知識介紹388
20.1.1 權限相關術語介紹389
20.1.2 權限模型介紹389
20.1.3 相關開源項目395
20.1.4 開源項目選擇建議396
20.2 iam-authz-server的功能介紹396
20.2.1 github.com/ory/ladon包介紹396
20.2.2 iam-authz-server使用方法
介紹399
20.3 iam-authz-server的代碼實現401
20.3.1 iam-authz-server的配置處理401
20.3.2 iam-authz-server啟動流程402
20.3.3 iam-authz-server的RESTful
API請求處理流程402
20.3.4 iam-authz-server的代碼架構403
20.4 iam-authz-server關鍵代碼分析404
20.4.1 資源授權404
20.4.2 緩存設計406
20.4.3 數據一致性412
20.5 本章總結412
第21章 IAM Pump服務構建414
21.1 數據采集方式的分類414
21.2 數據采集系統設計415
21.2.1 設計時需要解決的核心問題415
21.2.2 數據上報功能設計416
21.2.3 數據采集功能設計416
21.2.4 數據采集應用模型417
21.3 數據采集系統落地項目:
iam-authz-server+iam-pump417
21.3.1 iam-authz-server:數據上報
設計417
21.3.2 啟動數據上報服務420
21.3.3 異步上報授權日志422
21.3.4 優雅關停數據上報423
21.4 iam-pump:數據采集設計423
21.4.1 數據采集插件定義424
21.4.2 初始化數據采集插件425
21.4.3 健康檢查426
21.4.4 定期消費Redis數據426
21.4.5 優雅關停數據采集服務428
21.4.6 使用分布式鎖機制,避免
重復消費428
21.5 本章總結429
第22章 分布式作業系統設計與實現430
22.1 任務分類430
22.2 作業系統的常見實現431
22.3 IAM作業系統設計與實現434
22.3.1 IAM作業系統實現所使用的
Go包435
22.3.2 IAM作業系統特點437
22.3.3 IAM作業系統實現438
22.3.4 IAM作業系統實現解讀440
22.4 本章總結441
第23章 IAM SDK設計與實現442
23.1 什么是SDK442
23.2 SDK設計要點443
23.2.1 如何給SDK命名443
23.2.2 SDK的目錄結構443
23.2.3 SDK的設計方法444
23.3 公有云廠商采用的SDK設計
方式445
23.3.1 API層:創建客戶端實例446
23.3.2 基礎層:構建并執行HTTP
請求447
23.4 marmotedu-sdk-go客戶端設計與
創建451
23.4.1 marmotedu-sdk-go客戶端
設計453
23.4.2 項目級別客戶端創建455
23.4.3 應用級別客戶端創建455
23.4.4 服務級別客戶端創建456
23.5 marmotedu-sdk-go的實現456
23.5.1 RESTClient客戶端實現457
23.5.2 Request模塊實現459
23.5.3 請求認證463
23.6 本章總結464
第24章 IAM客戶端工具構建465
24.1 常見客戶端介紹465
24.2 大型系統客戶端的特點466
24.3 iamctl的核心實現468
24.3.1 iamctl的功能468
24.3.2 iamctl代碼結構468
24.3.3 iamctl命令行選項469
24.3.4 iamctl配置文件解析469
24.4 iamctl中子命令是如何構建的470
24.4.1 如何優雅地構建一個命令470
24.4.2 自動生成命令471
24.4.3 命令自動補全472
24.4.4 更友好的輸出473
24.5 iamctl是如何調用API的473
24.5.1 客戶端配置文件474
24.5.2 SDK調用475
24.5.3 RESTful API調用475
24.6 本章總結475
第五部分 項目測試
第25章 代碼測試478
25.1 如何測試Go代碼478
25.2 測試命名規范479
25.2.1 測試文件的命名規范479
25.2.2 測試包的命名規范479
25.2.3 測試函數的命名規范480
25.2.4 測試變量的命名規范480
25.3 4種基本測試類型481
25.3.1 單元測試481
25.3.2 性能測試486
25.3.3 模糊測試489
25.3.4 示例測試490
25.4 Go語言其他測試類型493
25.4.1 TestMain函數493
25.4.2 Mock測試494
25.4.3 Fake測試499
25.5 何時編寫和執行單元測試用例499
25.5.1 編碼前:TDD測試500
25.5.2 編碼中:增量測試500
25.5.3 編碼后:存量測試500
25.6 測試覆蓋率500
25.7 IAM項目測試實戰502
25.7.1 IAM項目是如何執行測試
用例的502
25.7.2 IAM項目測試案例分享504
25.8 其他測試工具和包507
25.9 本章總結507
第26章 性能分析509
26.1 生成性能數據文件509
26.1.1 通過命令行生成性能數據
文件509
26.1.2 通過代碼生成性能數據文件510
26.1.3 通過net/http/pprof生成
性能數據文件511
26.2 生成IAM測試用例的性能數據513
26.3 CPU性能分析513
26.4 內存性能分析521
26.5 本章總結523
第27章 API Server性能測試和
調優524
27.1 API性能測試指標524
27.2 API性能測試方法525
27.2.1 Wrk的安裝方法525
27.2.2 Wrk的使用方法526
27.3 API Server性能測試實踐527
27.3.1 性能測試腳本介紹528
27.3.2 關閉Debug配置選項530
27.3.3 使用wrktest.sh測試IAM API
性能530
27.4 API Server性能分析533
27.5 API Server性能測試注意事項536
27.6 本章總結537
第六部分 項目部署
第28章 基于虛擬機部署IAM系統540
28.1 部署方案540
28.2 Nginx安裝和配置542
28.2.1 Nginx功能簡介542
28.2.2 Nginx安裝和配置步驟544
28.2.3 Nginx常用命令544
28.3 Keepalived安裝和配置545
28.3.1 Keepalived介紹545
28.3.2 Keepalived安裝步驟546
28.3.3 Keepalived配置文件解析546
28.4 部署IAM系統549
28.4.1 部署IAM系統中的服務549
28.4.2 配置Nginx作為反向代理550
28.4.3 配置Nginx處理負載均衡552
28.4.4 配置Keepalived556
28.5 IAM系統安全性加固564
28.5.1 iptables簡介564
28.5.2 網絡數據包處理流程565
28.5.3 iptables工具的使用566
28.5.4 IAM安全加固(內網不
安全)569
28.5.5 IAM安全加固(內網安全)573
28.6 彈性伸縮574
28.6.1 系統擴容575
28.6.2 系統縮容575
28.7 本章總結575
第29章 IAM容器化部署576
29.1 Docker鏡像的構建原理和方式576
29.1.1 通過docker commit命令
構建鏡像576
29.1.2 通過Dockerfile來構建鏡像577
29.1.3 其他鏡像構建方式579
29.2 編寫Dockerfile文件580
29.2.1 Dockerfile指令介紹580
29.2.2 Dockerfile佳實踐581
29.3 編寫Kubernetes資源定義文件582
29.3.1 為什么選擇YAML格式來
定義Kubernetes資源582
29.3.2 Kubernetes資源定義概述584
29.3.3 常用的Kubernetes資源定義586
29.3.4 YAML文件編寫技巧593
29.3.5 使用Kubernetes YAML時的
一些推薦工具594
29.4 Kubernetes部署實戰:部署準備
工作596
29.4.1 開通騰訊云容器服務鏡像
倉庫596
29.4.2 安裝Docker599
29.4.3 準備一個Kubernetes集群601
29.5 Kubernetes部署實戰:安裝IAM
系統602
29.6 Kubernetes部署實戰:測試IAM
系統605
29.7 Kubernetes部署實戰:銷毀
Serverless集群及其資源605
29.8 本章總結606
第30章 Helm應用部署607
30.1 Helm基礎知識介紹607
30.1.1 Helm是什么607
30.1.2 Helm中的三大基本概念608
30.1.3 我們為什么要使用Helm609
30.2 Helm基本操作實戰611
30.2.1 安裝Helm611
30.2.2 Helm快速入門611
30.2.3 Helm命令616
30.3 使用Helm部署IAM系統617
30.3.1 制作IAM Chart包618
30.3.2 IAM Chart包部署621
30.3.3 多環境部署IAM系統624
30.4 本章總結624
第31章 基于GitHub Actions的CI
實戰625
31.1 GitHub Actions的基礎知識625
31.1.1 GitHub Actions的基本概念626
31.1.2 工作流程文件介紹626
31.2 GitHub Actions的進階用法629
31.2.1 為工作流加一個Badge標記629
31.2.2 構建矩陣630
31.2.3 使用密鑰630
31.2.4 使用Artifact保存構建產物631
31.3 GitHub Actions實戰632
31.4 IAM GitHub Actions實戰636
31.5 本章總結639