作者 |
刘金亮 艾伦A. A.多诺万 布莱恩W.柯尼汉 |
丛书名 |
架构师书库 |
出版社 |
机械工业出版社 |
ISBN |
9782102101193 |
简要 |
简介 |
内容简介书籍计算机书籍 ---------------------------Go微服务实战--------------------------- 全书共分21章。分为四篇进行介绍:语言基础篇、语言进阶篇、微服务知识篇、微服务实战篇。 第 一篇包括6章:Go程序基础、基本数据类型、字符串及复合数据类型、函数、方法、接口及反射、并发。通过本篇的开发,可以让不是很熟悉Go语言的工程师掌握语法基础。 第二篇包括3章:Go Web编程、并发编程模式、分布式系统。通过本篇的学习可以让读者了解使用Go语言如何进行Web开发、Go并发模式如何设计、分布式系统使用Go如何设计。 第三篇包括5章:微服务介绍、Linux基础、Docker、Kubernetes、Go常用微服务框架。本篇是用Go进行微服务开发的基本知识储备,知识面教光,避免读者查阅多本资料,整篇学习完就可以达到微服务开发的技能入门水平。 第四篇包括7章:生产环境Docker及Kubernetes安装、基于Docker及Goland的开发测试环境搭建、测试驱动开发和IM系统核心功能的微服务化、持续化交付、事件驱动架构、日志和监控、安全。本篇是微服务实战,以IM系统为例,从系统安装、如何测试、如何迭代、如何运维都进行了介绍。 ---------------------------Go程序设计语言--------------------------- 本书由《C程序设计语言》的作者Kernighan和谷歌公司Go团队主管Alan Donovan联袂撰写,是学习Go语言程序设计的权威指南。本书共13章,主要内容包括:Go的基础知识、基本结构、基本数据类型、复合数据类型、函数、方法、接口、goroutine、通道、共享变量的并发性、包、go工具、测试、反射等。 本书适合作为计算机相关专业的教材,也可供Go语言爱好者阅读。 |
目录 |
---------------------------Go微服务实战--------------------------- 前言 第一部分 Go语言基础 第1章 Go语言程序基础 2 1.1 Hello,World! 2 1.2 变量、指针及赋值 5 1.2.1 变量和常量 5 1.2.2 指针 8 1.2.3 赋值 9 1.3 包及作用域 10 1.4 选择和循环 12 1.5 垃圾回收 13 1.6 小结 15 第2章 基本数据类型 16 2.1 整型 17 2.1.1 整型取值范围 17 2.1.2 运算符 18 2.2 浮点型 19 2.3 复数和布尔类型 21 2.4 格式化说明符 22 2.5 小结 22 第3章 字符串与复合数据类型 23 3.1 字符串和数组 23 3.1.1 字符串 24 3.1.2 数组 26 3.2 slice 27 3.2.1 结构定义 27 3.2.2 基本操作 28 3.2.3 append 30 3.2.4 copy 31 3.2.5 其他 32 3.3 map 33 3.3.1 定义 33 3.3.2 基本操作 33 3.4 struct 35 3.4.1 结构定义 36 3.4.2 基本操作 37 3.4.3 组合 38 3.5 JSON 40 3.6 小结 40 第4章 函数、方法、接口和反射 41 4.1 函数 41 4.1.1 函数的定义 41 4.1.2 闭包 42 4.1.3 作用域 43 4.1.4 多返回值及变长参数 45 4.1.5 defer关键字 46 4.2 方法 46 4.3 接口 50 4.4 反射 54 4.5 小结 57 第5章 并发编程 59 5.1 协程 59 5.1.1 核心概念 60 5.1.2 goroutine的基本使用 60 5.1.3 sync.WaitGroup 62 5.2 通道 64 5.2.1 channel写入数据 64 5.2.2 channel接收数据 65 5.2.3 以channel作为函数参数 66 5.2.4 缓存channel 67 5.2.5 select 70 5.2.6 超时检查 71 5.3 pipeline 74 5.4 小结 76 第6章 包和代码测试 77 6.1 包及Go工具 77 6.1.1 包导入 78 6.1.2 Go工具 79 6.2 代码优化 84 6.2.1 Go代码的优化 84 6.2.2 性能分析 84 6.3 测试 90 6.3.1 功能测试函数 91 6.3.2 基准测试函数 93 6.3.3 示例函数 96 6.4 小结 98 第7章 综合实战案例 99 7.1 案例需求 99 7.2 通信协议 100 7.3 服务器端 104 7.4 客户端 109 7.5 小结 116 第二部分 Go语言进阶 第8章 并发编程进阶 118 8.1 竞态与并发模式 118 8.1.1 数据竞态 118 8.1.2 并发原理 123 8.2 sync包 126 8.2.1 sync.Mutex互斥锁 126 8.2.2 sync.RWMutex多读写锁 128 8.2.3 sync.Once 130 8.2.4 sync.Cond 131 8.2.5 sync.Pool 134 8.2.6 sync.Map 136 8.3 context包 138 8.3.1 应用场景 138 8.3.2 定义 139 8.3.3 继承 141 8.3.4 示例 142 8.4 工作池 145 8.5 小结 151 第9章 Go Web编程 152 9.1 net/http包 152 9.1.1 Go Web工作的基本原理 152 9.1.2 http详解 156 9.2 Web框架 162 9.2.1 选择框架 162 9.2.2 httprouter框架 163 9.3 Web底层服务 165 9.3.1 Scoket简介 165 9.3.2 TCP Socket 166 9.3.3 UDP Socket 169 9.3.4 WebSocket 171 9.4 中间件 174 9.4.1 基本用法 174 9.4.2 进阶用法 176 9.5 数据库访问 179 9.5.1 database/sql接口 180 9.5.2 sqlx 182 9.6 小结 183 第10章 综合案例 184 10.1 案例需求 184 10.2 项目代码布局 186 10.3 配置和日志 187 10.3.1 配置 188 10.3.2 日志 190 10.4 模型 191 10.5 gin框架 193 10.6 小结 196 第三部分 微服务理论 第11章 微服务 198 11.1 微服务简介 198 11.1.1 什么是微服务 198 11.1.2 微服务的由来 198 11.1.3 微服务与微服务架构 199 11.2 系统架构的演进 199 11.2.1 单体架构 200 11.2.2 垂直架构 201 11.2.3 SOA 201 11.2.4 微服务架构 202 11.3 小结 205 第12章 微服务化策略 206 12.1 微服务架构风格 206 12.1.1 每个服务都拥有独立的数据库 206 12.1.2 基于API的模块化 207 12.2 微服务化进程中的重点问题 207 12.2.1 微服务的通信 207 12.2.2 事务管理的一致性 208 12.2.3 微服务数据查询 208 12.2.4 微服务部署 208 12.2.5 微服务生产环境监控 209 12.2.6 微服务的自动化测试 209 12.3 微服务的拆分 209 12.3.1 拆分的指导原则 210 12.3.2 依据业务能力拆分 210 12.3.3 依据领域驱动设计拆分 211 12.3.4 服务API的定义 213 12.4 小结 214 第13章 微服务中的进程间通信 215 13.1 微服务中的进程间通信概述 215 13.1.1 交互模式 215 13.1.2 API定义 217 13.2 protobuf格式 217 13.2.1 protobuf简介 217 13.2.2 protobuf的简单使用 217 13.3 gRPC包 219 13.3.1 net/rpc包 219 13.3.2 gRPC简介 221 13.3.3 Go语言实现gRPC调用 222 13.4 微服务发现:consul 224 13.5 小结 226 第14章 微服务中的分布式事务管理 227 14.1 微服务下的事务管理 227 14.1.1 面临的难题 227 14.1.2 SRP的折衷 228 14.2 微服务中处理事务的几种方式 229 14.2.1 避免跨微服务的事务 229 14.2.2 基于XA协议的两阶段提交协议 229 14.2.3 最终一致性和补偿 231 14.3 Saga模式 234 14.3.1 Saga模式介绍 234 14.3.2 编排模式 235 14.3.3 编配模式 237 14.4 Saga模式的Go语言示例 238 14.4.1 Saga对象的Go语言实现 238 14.4.2 中央协调器的Go语言实现 239 14.5 小结 243 第15章 领域驱动设计的Go语言实现 244 15.1 聚合模式介绍 244 15.2 使用聚合模式 247 15.2.1 聚合拥有明确的边界 247 15.2.2 聚合的规则 248 15.2.3 聚合颗粒度 250 15.2.4 使用聚合设计业务逻辑 250 15.3 领域事件 251 15.4 Go语言领域模型的模拟实现 252 15.4.1 聚合 253 15.4.2 实体和值对象 253 15.4.3 服务 255 15.5 小结 257 第16章 微服务中的测试 258 16.1 测试金字塔 258 16.2 单元测试 260 16.3 依赖注入和mock测试 263 16.4 行为驱动开发 266 16.5 使用Docker Compose测试 272 16.6 小结 275 第17章 微服务运行环境:Docker 276 17.1 Docker介绍 276 17.1.1 Docker引擎 276 17.1.2 守护进程 277 17.1.3 镜像及容器 277 17.1.4 仓库 278 17.1.5 数据卷 278 17.2 运行第一个Docker容器 279 17.2.1 Docker安装 279 17.2.2 HelloWorld程序示例 279 17.2.3 运行复杂一点的容器 280 17.3 Docker数据持久化 282 17.3.1 数据卷 282 17.3.2 bind mount 284 17.4 Docker网络 285 17.4.1 桥接驱动及自定义bridge 285 17.4.2 Host模式、Overlay模式及None模式 288 17.5 小结 289 第18章 Go语言基于ES-CQRS的微服务实践 290 18.1 理论介绍 290 18.1.1 事件溯源 290 18.1.2 命令查询职责分离 291 18.2 ES-CQRS在Go语言中的实现示例 292 18.2.1 需求 293 18.2.2 分析与设计 293 18.2.3 核心实现 296 18.3 小结 299 第四部分 微服务实战 第19章 生产环境的微服务安全 302 19.1 加密和签名 302 19.1.1 对称密钥加密 302 19.1.2 公钥密码 303 19.1.3 X.509数字证书 303 19.1.4 TLS/SSL 304 19.2 外部安全 304 19.2.1 防火墙 304 19.2.2 页面应用的防火墙 305 19.2.3 API网关 305 19.2.4 DDoS保护 306 19.3 应用安全 307 19.3.1 攻击者如何绕过防火墙 308 19.3.2 输入校验 308 19.3.3 TLS 310 19.3.4 在rest中进行数据保护 313 19.3.5 JWT 314 19.3.6 大消息的非对称加密 315 19.4 运维安全 316 19.4.1 修补容器 316 19.4.2 软件更新 317 19.4.3 修补应用程序代码 317 19.4.4 日志 317 19.5 小结 317 第20章 日志和监控 318 20.1 日志最佳实践 319 20.2 指标 319 20.2.1 指标数据类型 320 20.2.2 命名约定 320 20.2.3 存储和查询 322 20.2.4 Grafana 323 20.3 日志记录 326 20.3.1 具有关联ID的分布式跟踪 326 20.3.2 ElasticSearch、Logstash和Kibana 327 20.3.3 Kibana 328 20.4 异常 330 20.5 小结 332 第21章 持续交付 333 21.1 持续交付简介 333 21.1.1 手动部署 334 21.1.2 持续交付的好处 334 21.1.3 持续交付面面观 335 21.1.4 持续交付的过程 337 21.2 容器编排的选项和基础架构 338 21.3 Terraform 339 21.3.1 提供者 340 21.3.2 Terraform配置入口点 341 21.3.3 VPC模块 342 21.3.4 输出变量 346 21.3.5 创建基础架构 348 21.4 应用范例 348 21.4.1 持续部署的工作流程 349 21.4.2 构建 352 21.4.3 测试 353 21.4.4 基准测试 354 21.4.5 静态代码测试 354 21.4.6 集成测试 355 21.4.7 部署 356 21.4.8 冒烟测试 357 21.4.9 监控和预警 357 21.5 小结 359 第22章 使用Go kit框架构建微服务 360 22.1 创建服务 361 22.1.1 测试 361 22.1.2 Go语言中的构造函数 362 22.1.3 使用bcrypt进行Hash处理并验证密码 363 22.2 使用请求和响应对方法调用进行建模 364 22.2.1 Go kit中的端点 365 22.2.2 为服务方法设定终点 366 22.2.3 不同级别的错误 366 22.2.4 将端点包装到服务实现中 367 22.3 使用Go kit实现一个HTTP服务器 368 22.4 Go kit中的gRPC服务器 368 22.5 创建服务器命令 371 22.5.1 使用Go kit端点 373 22.5.2 运行HTTP服务器 373 22.5.3 运行gRPC服务器 373 22.5.4 防止main函数突然终止 374 22.5.5 通过HTTP使用服务 374 22.6 构建一个gRPC客户端 375 22.6.1 使用服务的命令行工具 376 22.6.2 在CLI中解析参数 377 22.7 服务中间件的速率限制 378 22.7.1 Go kit中的中间件 378 22.7.2 速率限制 380 22.8 小结 380 附录 Go语言中的关键字 381 ---------------------------Go程序设计语言--------------------------- 出版者的话 译者序 前言 第1章 入门 1 1.1 hello,world 1 1.2 命令行参数 3 1.3 找出重复行 6 1.4 GIF动画 10 1.5 获取一个URL 12 1.6 并发获取多个URL 13 1.7 一个Web服务器 14 1.8 其他内容 17 第2章 程序结构 20 2.1 名称 20 2.2 声明 21 2.3 变量 22 2.3.1 短变量声明 22 2.3.2 指针 23 2.3.3 new函数 25 2.3.4 变量的生命周期 26 2.4 赋值 27 2.4.1 多重赋值 27 2.4.2 可赋值性 28 2.5 类型声明 29 2.6 包和文件 30 2.6.1 导入 31 2.6.2 包初始化 33 2.7 作用域 34 第3章 基本数据 38 3.1 整数 38 3.2 浮点数 42 3.3 复数 45 3.4 布尔值 47 3.5 字符串 47 3.5.1 字符串字面量 49 3.5.2 Unicode 49 3.5.3 UTF-8 50 3.5.4 字符串和字节slice 53 3.5.5 字符串和数字的相互转换 56 3.6 常量 56 3.6.1 常量生成器iota 57 3.6.2 无类型常量 59 第4章 复合数据类型 61 4.1 数组 61 4.2 slice 63 4.2.1 append函数 66 4.2.2 slice就地修改 69 4.3 map 71 4.4 结构体 76 4.4.1 结构体字面量 78 4.4.2 结构体比较 80 4.4.3 结构体嵌套和匿名成员 80 4.5 JSON 82 4.6 文本和HTML模板 87 第5章 函数 92 5.1 函数声明 92 5.2 递归 93 5.3 多返回值 96 5.4 错误 98 5.4.1 错误处理策略 99 5.4.2 文件结束标识 101 5.5 函数变量 102 5.6 匿名函数 104 5.7 变长函数 110 5.8 延迟函数调用 111 5.9 宕机 115 5.10 恢复 118 第6章 方法 120 6.1 方法声明 120 6.2 指针接收者的方法 122 6.3 通过结构体内嵌组成类型 124 6.4 方法变量与表达式 127 6.5 示例:位向量 128 6.6 封装 130 第7章 接口 133 7.1 接口即约定 133 7.2 接口类型 135 7.3 实现接口 136 7.4 使用flag.Value来解析参数 139 7.5 接口值 141 7.6 使用sort.Interface来排序 144 7.7 http.Handler接口 148 7.8 error接口 152 7.9 示例:表达式求值器 154 7.10 类型断言 160 7.11 使用类型断言来识别错误 161 7.12 通过接口类型断言来查询特性 162 7.13 类型分支 164 7.14 示例:基于标记的XML解析 166 7.15 一些建议 168 第8章 goroutine和通道 170 8.1 goroutine 170 8.2 示例:并发时钟服务器 171 8.3 示例:并发回声服务器 174 8.4 通道 176 8.4.1 无缓冲通道 177 8.4.2 管道 178 8.4.3 单向通道类型 180 8.4.4 缓冲通道 181 8.5 并行循环 183 8.6 示例:并发的Web爬虫 187 8.7 使用select多路复用 190 8.8 示例:并发遍历 192 8.9 取消 195 8.10 示例:聊天服务器 198 第9章 使用共享变量实现并发 201 9.1 竞态 201 9.2 互斥锁:sync.Mutex 205 9.3 读写互斥锁:sync.RWMutex 208 9.4 内存同步 208 9.5 延迟初始化:sync.Once 210 9.6 竞态检测器 212 9.7 示例:并发非阻塞缓存 212 9.8 goroutine与线程 218 9.8.1 可增长的栈 219 9.8.2 goroutine调度 219 9.8.3 GOMAXPROCS 219 9.8.4 goroutine没有标识 220 第10章 包和go工具 221 10.1 引言 221 10.2 导入路径 221 10.3 包的声明 222 10.4 导入声明 223 10.5 空导入 223 10.6 包及其命名 225 10.7 go工具 226 10.7.1 工作空间的组织 227 10.7.2 包的下载 228 10.7.3 包的构建 229 10.7.4 包的文档化 231 10.7.5 内部包 232 10.7.6 包的查询 233 第11章 测试 235 11.1 go test工具 235 11.2 Test函数 236 11.2.1 随机测试 239 11.2.2 测试命令 240 11.2.3 白盒测试 242 11.2.4 外部测试包 245 11.2.5 编写有效测试 246 11.2.6 避免脆弱的测试 247 11.3 覆盖率 248 11.4 Benchmark函数 250 11.5 性能剖析 252 11.6 Example函数 254 第12章 反射 256 12.1 为什么使用反射 256 12.2 reflect.Type和reflect.Value 257 12.3 Display:一个递归的值显示器 259 12.4 示例:编码S表达式 263 12.5 使用reflect.Value来设置值 266 12.6 示例:解码S表达式 268 12.7 访问结构体字段标签 271 12.8 显示类型的方法 273 12.9 注意事项 274 第13章 低级编程 276 13.1 unsafe.Sizeof、Alignof 和Offsetof 276 13.2 unsafe.Pointer 278 13.3 示例:深度相等 280 13.4 使用cgo调用C代码 282 13.5 关于安全的注意事项 286 |