猜你喜欢
Go编程进阶实战:开发命令行应用、HTTP应用和gRPC应用

Go编程进阶实战:开发命令行应用、HTTP应用和gRPC应用

书籍作者:阿米特·萨哈 ISBN:9787302615897
书籍语言:简体中文 连载状态:全集
电子书格式:pdf,txt,epub,mobi,azw3 下载次数:1515
创建日期:2023-05-22 发布日期:2023-05-22
运行环境:PC/Windows/Linux/Mac/IOS/iPhone/iPad/Kindle/Android/安卓/平板
内容简介

主要内容

● 编写命令行应用程序

● 编写HTTP服务和客户端

● 使用gRPC编写RPC应用程序

● 为网络客户端和服务器编写中间件

● 在云对象存储和SQL数据库中存储数据

● 使用惯用的技术测试应用程序

● 为应用程序增加可观察性

● 管理应用程序的配置数据


作者简介

Amit Saha是位于澳大利亚悉尼市的Atlassian公司的高级DevOps工程师。Amit曾撰写Doing Math with Python: Use Programming to Explore Algebra, Statistics, Calculus, and More!和Write Your First Program等书籍。Amit已在软件行业工作10年,曾加盟Sun Microsystems、RedHat和多家初创公司。Amit在技术杂志、会议论文集和研究期刊上发表过大量文章。

前言

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]所述。


目录

目录


第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.4 Request(请求)结构 112

5.4.1 方法 112

5.4.2 URL 112

5.4.3 Proto、ProtoMajor和ProtoMinor 113

5.4.4 标头 113

5.4.5 主机 113

5.4.6 正文 113

5.4.7 Form、PostForm 113

5.4.8 MultipartForm 114

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.2 HandlerFunc技术 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/2 179

7.4.2 测试TLS服务器 183

7.5 小结 186

第8章 使用gRPC构建RPC应用程序 187

8.1 gRPC和协议缓冲区 187

8.2 编写第一个服务 190

8.2.1 编写服务器 192

8.2.2 编写一个客户端 196

8.2.3 测试服务器 201

8.2.4 测试客户端 204

8.3 protobuf消息的详细介绍 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


短评

经典永不过时 真的是最值得信赖的,发货快、包装好,非常让人放心,已经买了很多很多次了 这次买的书都是正版自营店授权,印刷清晰,字迹清楚,实体书的手感永远是电子书取代不了的

2022-12-12 12:19:59