3dwoo大學簡體電腦書店
Go編程進階實戰:開發命令行應用、HTTP應用和gRPC應用
( 簡體 字)
作者:[澳]阿米特·薩哈(Amit Saha)著 賈玉彬 劉光磊 譯 上海碳澤信息科技有限公司 審校 類別:1. -> 程式設計 -> Go語言
出版社:清華大學出版社Go編程進階實戰:開發命令行應用、HTTP應用和gRPC應用 3dWoo書號: 56146
詢問書籍請說出此書號!
有庫存
NT售價: 490
出版日:11/1/2022
頁數:337
光碟數:0
站長推薦:
印刷:黑白印刷語系: ( 簡體 字 )
ISBN:9787302615897 加入購物車加到我的最愛 (請先登入會員)
(簡體書上所述之下載連結耗時費功, 恕不適用在台灣, 若讀者需要請自行嘗試, 恕不保證, 繁體書的下載亦請直接連絡出版社)
第1章編寫命令行應用程序1
1.1我們的第一個應用程序1
1.2編寫單元測試8
1.3使用flag包14
1.4改進用戶界面22
1.4.1刪除重復的錯誤消息22
1.4.2自定義用例消息23
1.4.3通過位置參數接收姓名24
1.5更新單元測試27
1.6小結32
第2章高級命令行應用程序33
2.1實現子命令33
2.1.1子命令驅動的應用程序架構37
2.1.2測試main包43
2.1.3測試cmd包45
2.2使應用程序更健壯47
2.2.1帶有超時的用戶輸入48
2.2.2處理用戶信號51
2.3小結55
第3章編寫HTTP客戶端57
3.1下載數據57
3.2反序列化接收到的數據61
3.3發送數據65
3.4使用二進制數據71
3.5小結78
第4章高級HTTP客戶端79
4.1使用自定義HTTP客戶端79
4.1.1從過載的服務器下載79
4.1.2測試超時行為83
4.1.3配置重定向行為86
4.2定制請求89
4.3實現客戶端中間件90
4.3.1了解RoundTripper接口90
4.3.2日志中間件91
4.3.3給所有請求添加一個標頭94
4.4連接池97
4.5小結101
第5章構建HTTP服務器103
5.1我們的第一個HTTP服務器103
5.2設置請求處理程序106
處理程序106
5.3測試服務器109
5.4Request(請求)結構112
5.4.1方法112
5.4.2URL112
5.4.3Proto、ProtoMajor和ProtoMinor113
5.4.4標頭113
5.4.5主機113
5.4.6正文113
5.4.7Form、PostForm113
5.4.8MultipartForm114
5.5將元數據附加到請求115
5.6處理流請求118
5.7將流數據作為響應123
5.8小結128
第6章高級HTTP服務器應用程序129
6.1處理程序的類型129
6.2跨處理程序共享數據130
6.3編寫服務器中間件135
6.3.1自定義HTTP處理程序技術135
6.3.2HandlerFunc技術136
6.3.3鏈接中間件138
6.4為復雜的服務器應用程序編寫測試142
6.4.1組織代碼143
6.4.2測試處理程序148
6.4.3測試中間件151
6.4.4測試服務器啟動153
6.5小結155
第7章生產級HTTP服務器157
7.1終止請求處理157
7.1.1終止請求處理的策略160
7.1.2處理客戶端斷開連接165
7.2服務器范圍的超時168
7.2.1為所有處理程序實現超時169
7.2.2實現服務器超時169
7.3實施優雅的關機174
7.4使用TLS保護通信178
7.4.1配置TLS和HTTP/2179
7.4.2測試TLS服務器183
7.5小結186
第8章使用gRPC構建RPC應用程序187
8.1gRPC和協議緩沖區187
8.2編寫第一個服務190
8.2.1編寫服務器192
8.2.2編寫一個客戶端196
8.2.3測試服務器201
8.2.4測試客戶端204
8.3protobuf消息的詳細介紹207
8.3.1序列化和反序列化207
8.3.2向前和向后兼容212
8.4多個服務214
8.5錯誤處理219
8.6小結221
第9章高級gRPC應用223
9.1流通信223
9.1.1服務器端流傳輸223
9.1.2客戶端流傳輸231
9.1.3雙向流233
9.2接收和發送任意字節241
9.3使用攔截器實現中間件250
9.3.1客戶端攔截器251
9.3.2服務器端攔截器257
9.3.3包裝流262
9.3.4鏈接攔截器264
9.4小結265
第10章生產級gRPC應用267
10.1使用TLS保護通信267
10.2服務器健壯性270
10.2.1實施健康檢查270
10.2.2處理運行時錯誤277
10.2.3終止請求處理280
10.3客戶端健壯性289
10.3.1提高連接配置289
10.3.2處理瞬態故障291
10.3.3為方法調用設置超時296
10.4連接管理297
10.5小結299
第11章使用數據存儲301
11.1使用對象存儲302
11.1.1與包服務器集成303
11.1.2測試包上傳312
11.1.3訪問底層驅動類型315
11.2使用關系數據庫316
11.2.1與包服務器集成318
11.2.2測試數據存儲328
11.2.3數據類型轉換332
11.2.4使用數據庫事務335
11.3小結337
——以下部分通過掃描封底二維碼獲取——
附錄A使應用程序可觀察339
附錄B部署應用程序356
附錄C配置Go開發環境362
主要內容
● 編寫命令行應用程序
● 編寫HTTP服務和客戶端
● 使用gRPC編寫RPC應用程序
● 為網絡客戶端和服務器編寫中間件
● 在云對象存儲和SQL數據庫中存儲數據
● 使用慣用的技術測試應用程序
● 為應用程序增加可觀察性
● 管理應用程序的配置數據
Google于2009年發布了Go編程語言,2012年推出了1.0版本。自從向社區發布,以及1.0版本的兼容性承諾,Go語言已被用于編寫可擴展且具有高影響力的軟件程序。從命令行應用程序和關鍵基礎設施工具到大型分布式系統,Go語言為許多現代軟件成功案例的增長做出了巨大貢獻。多年來,我個人對Go的興趣一直是由于它沒有過多的關鍵字——這就是我喜歡它的地方。感覺就像它結合了C(我學習的第二種編程語言)的強大功能和Python(我最喜歡的另一種編程語言)自帶“電池”的特性。隨著我使用Go語言編寫越來越多的程序,我學會了欣賞它專注于提供所有必要的工具和功能來編寫生產級質量的軟件。我經常發現自己在想,“我能在這個應用程序中實現這種故障處理模式嗎?”然后我查看了標準庫文檔,答案一直都是響亮的“是!”一旦你掌握了Go語言的基礎知識,作為軟件開發人員,你幾乎不必付出任何努力,就可以開發一個開箱即用的高性能應用程序。
我撰寫《Go編程進階實戰:開發命令行應用、HTTP應用和gRPC應用》的目的是通過開發各種類型的應用程序來展示Go語言及其標準庫(以及一些社區維護的包)的各種特性。一旦你回顧或學習了Go語言的基礎知識,《Go編程進階實戰:開發命令行應用、HTTP應用和gRPC應用》將幫助你邁出下一步。我采用了這樣一種寫作風格:重點是使用語言及其庫的各種特性來解決手頭的特定問題——你關心的問題。
我不會對語言特性或某個包的每個功能進行詳細描述。你將學到足以構建命令行工具、Web應用程序和gRPC應用程序的知識。我專注于為此類應用程序嚴格挑選的基本構建塊的子集,以提供緊湊且可操作的指南。因此,你可能會發現《Go編程進階實戰:開發命令行應用、HTTP應用和gRPC應用》并未涵蓋你可能想要了解的更高級別的用例。這是有意而為之,因為這些更高級別用例的實現通常依賴于特定領域的軟件包,因此沒有一本書可以公正地建議使用某個軟件包而不會遺漏另一個軟件包。我也盡量使用標準庫包來編寫《Go編程進階實戰:開發命令行應用、HTTP應用和gRPC應用》中的應用程序,這樣做是為了確保學習經驗不會被稀釋。盡管如此,我希望《Go編程進階實戰:開發命令行應用、HTTP應用和gRPC應用》介紹的構建塊能為你提供堅實的基礎,使你能利用更高級別的庫來構建應用程序。
本書涵蓋的內容
《Go編程進階實戰:開發命令行應用、HTTP應用和gRPC應用》介紹使用Go編程語言構建各種應用程序的概念和模式。主要關注命令行應用程序、HTTP應用程序和gRPC應用程序。
第1~2章討論構建命令行應用程序。你將學習使用標準庫包來開發可擴展和可測試的命令行程序。
第3~4章教你如何構建生產級的HTTP客戶端。你將學習配置超時、了解連接池行為、實現中間件組件等。
第5~7章討論構建HTTP服務器應用程序。你將學習如何添加對流數據的支持、實現中間件組件、跨處理函數共享數據以及實現各種技術來提高應用程序的健壯性。
第8~10章深入研究使用gRPC構建RPC應用程序。你將了解Protocol Buffer,實現各種RPC通信模式,并實現客戶端和服務器端攔截器來執行常見的應用程序功能。
在第11章中,你將學習應用程序與對象存儲和關系數據庫管理系統的交互。
附錄A簡要討論如何將觀測儀表添加到應用程序中。
附錄B將提供一些有關部署應用程序的指南。
附錄C將幫助配置Go開發環境。
每組章節基本獨立于其他組。所以請隨意跳到任意組的第1章;但是,有些地方可能會引用前一章的內容。
然而,在每個組內,我建議從頭到尾閱讀章節,因為組內的章節建立在前一章的基礎上。例如,如果你想了解更多有關編寫HTTP客戶端的知識,我建議你按順序閱讀第3章和第4章。
我還鼓勵你在閱讀《Go編程進階實戰:開發命令行應用、HTTP應用和gRPC應用》的同時自己編寫和運行代碼,并嘗試那些練習。在你的代碼編輯器中自己編寫程序將增強編程能力,正如我在編寫《Go編程進階實戰:開發命令行應用、HTTP應用和gRPC應用》中的程序時所做的那樣。
源代碼和資源鏈接下載
你可掃描封底二維碼來查看與《Go編程進階實戰:開發命令行應用、HTTP應用和gRPC應用》相關的源代碼和資源的鏈接。
在閱讀《Go編程進階實戰:開發命令行應用、HTTP應用和gRPC應用》時,讀者會看到鏈接編號。形式是編號,加方括號。如[1]表示讀者可掃描封底二維碼下載Links文件,找到對應章節中[1]指向的鏈接。


本書指南
下面介紹有助于充分利用《Go編程進階實戰:開發命令行應用、HTTP應用和gRPC應用》的各種零碎信息。首先,將介紹代碼清單的模塊路徑選擇。
Go模塊
在《Go編程進階實戰:開發命令行應用、HTTP應用和gRPC應用》中,所有應用程序都將首先初始化一個模塊(Module)。通過運行go命令go mod init <模塊路徑>實現。在整本書中,我使用了一個“占位符”模塊路徑,即github.com/username/<應用名稱>。因此,在將模塊編寫為包含多個包的應用程序時,導入路徑為github.com/username/<應用名稱>/<包名>。
如果你不打算共享這些應用程序,則可以使用這些模塊路徑。如果你計劃共享應用程序,或進一步開發它們,鼓勵你使用自己的模塊路徑,該路徑指向你自己的存儲庫,可能是托管在[1]、[2]或[3]上的Git存儲庫。只需要在存儲庫托管服務中用你自己的用戶名替換即可。還值得注意的是,《Go編程進階實戰:開發命令行應用、HTTP應用和gRPC應用》的代碼存儲庫[4]包含的模塊路徑[5]是實際路徑而不是占位符路徑。
命令行和終端
全書都要求你執行命令行程序。對于Linux和macOS,使用默認的shell就足夠了。對于Windows,我假設你將使用Windows PowerShell終端而不是默認的命令行程序。大多數命令行執行顯示為在Linux/macOS終端上執行,由$符號指示。但是,你也應該能夠在Windows上運行相同的命令。無論我要求你在何處執行命令以創建目錄或復制文件,我都指出了Linux/macOS和Windows的不同之處。
術語
我在整本書中使用了一些術語,在這里澄清一下,以避免歧義并設定正確的期望。
健壯性和彈性
健壯性(Robustness)和彈性(Resiliency)這兩個術語都表達了應用程序處理意外情況的能力。但是,這些術語在這些情況下的預期行為與其正常行為相比有所不同。如果一個系統能夠承受意外情況并在一定程度上繼續運行,那么它就是健壯的。與正常行為相比,這可能是次優行為。另一方面,如果系統繼續表現出正常行為,則系統具有彈性。

在第2章,我們將學習對正在執行用戶指定程序的命令行應用程序功能強制超時。通過強制超時,可避免應用程序由于糟糕的用戶輸入而無限期掛起的情況。由于我們配置了允許用戶指定命令執行多長時間的上限,因此當持續時間在命令完成之前到期時,將退出并顯示錯誤。這不是應用程序的正常行為(應該等待命令完成),但是這種次優行為對于允許應用程序從意外情況中恢復是必要的,例如用戶指定的命令花費的時間比預期的要長。你會在全書中找到類似的示例,特別是在第4、7、10和11章中發送或接收網絡請求時。我們將這些技術稱為在應用程序中引入健壯性。
在第10章,你將學習處理gRPC客戶端應用程序中的瞬態故障。我們將以一種可以容忍可能很快解決臨時故障的方式編寫應用程序。我們將此稱為在應用程序中引入彈性行為。但是,我們也引入了一個允許解決潛在臨時故障的時間上限。如果超過這個時間限制,我們認為操作無法完成。因此,我們也引入了健壯性。
總之,彈性和健壯性都旨在處理應用程序中的意外情況,《Go編程進階實戰:開發命令行應用、HTTP應用和gRPC應用》使用這些術語來指代此類技術。
生產就緒
我在書中使用術語“生產就緒”(Production Readiness)作為在開發應用程序時但在將其部署到任何類型的生產環境之前應該考慮的所有步驟。當生產環境是你自己的個人服務器并且你是應用程序的唯一用戶時,你將學習的技術可能就足夠了。如果生產環境意味著應用程序將為你的用戶執行關鍵功能,那么《Go編程進階實戰:開發命令行應用、HTTP應用和gRPC應用》中的技術應該是絕對的基線和起點。生產就緒由大量通常特定于領域的技術組成,涵蓋健壯性、彈性、可觀察性和安全性等各個維度。《Go編程進階實戰:開發命令行應用、HTTP應用和gRPC應用》展示了如何實現這些主題的一小部分。
參考文檔
書中的代碼清單使用了各種標準庫包和一些第三方包。各種功能和類型的描述僅限于上下文使用。當你想了解有關包或函數的更多信息時,知道去哪里查找對于充分利用《Go編程進階實戰:開發命令行應用、HTTP應用和gRPC應用》非常重要。所有標準庫包的關鍵參考文檔均位于[6]。當我將包導入為net/http時,將在路徑[7]中找到該包的文檔。當我提到io.ReadAll()等函數時,可以查看[8]上的 io 包文檔。
對于第三方軟件包,可通過訪問地址[9]獲取文檔。例如,Go gRPC包被導入為[10]。其參考文檔可通過[11]獲得。



Go語言回顧
我建議閱讀[12]的A Tour of Go中的內容,以復習將用于實現《Go編程進階實戰:開發命令行應用、HTTP應用和gRPC應用》中的程序的各種功能,包括for循環、函數、方法、結構、接口類型以及錯誤值。此外,我想強調我們將廣泛使用的關鍵主題。
結構類型
還將在編寫測試時使用匿名結構(Struct)類型。這在Andrew Gerrand的演講“關于Go,你可能不知道的10件事”中有所描述,見[13]。
接口類型
為了使用各種庫函數并編寫可測試的應用程序,我們將廣泛使用接口(Interface)類型。例如,我們將廣泛使用滿足io.Reader和io.Writer接口的替代類型來為使用標準輸入和輸出接口的應用程序編寫測試。
學習定義滿足另一個接口的自定義類型是編寫Go應用程序的關鍵步驟,我們在其中插入需要的功能以與語言的其余部分一起工作。例如,為了在HTTP處理函數之間共享數據,我們將定義自己的類型來實現http.Handler接口。
A Tour of Go中的接口部分(見[14])有助于復習該主題。
協程和通道
我們將使用協程(Goroutine)和通道(Channel)在應用程序中實現并發執行。我建議閱讀A Tour of Go中有關并發的部分(見[15])。特別注意使用select語句等待多通道通信操作的示例。
測試
我們將使用標準庫的測試包專門編寫所有測試,我們將使用Go test來驅動所有測試執行。還使用net/http/httptest等庫提供的出色支持來測試HTTP客戶端和服務器端。gRPC庫提供了類似的支持。在最后一章,我們將使用第三方包(見[16])和Docker Desktop創建本地測試環境。
在一些測試中,特別是在編寫命令行應用程序時,我們在編寫測試時采用了“Table驅動測試”的風格,如[17]所述。
pagetop