点击上方" 程序员历小冰 ",选择“置顶或者星标”
你的关注意义重大!
恍惚 之间,2020年业已过了三分之一,看着手中刚收到的《Go语言高并发和微服务实战》,不仅思绪万千。 从19年初开始筹划到20年5月份最终出版,一共花费了接近一年半的时间,个中滋味以及对此书的寄托,尽在此文,慢慢向大家说来。
缘由
还记得19年年初时,在公司年会返程的大巴车 上 ,鑫哥 @a oho 和黄总 @CANG WU 找到我, 说 希望 写一本 Go 语言在微服务领域实践的书籍。 当时大家对 微服务架构都很熟悉,并且对 Go 语言在 微服务领域的前景 都比较看好。 说干就干! 鑫哥随后在很短的时间里就 列出了详细的 每章目录和写书计划, 三个初出茅庐 的 后( 韭 ) 浪( 菜 )就 开始了 本书的写作之旅。
后续就是大家按照划分的章节任务,各自去准备材料,设计代码,编辑初稿,自我审阅;然后交换审阅,按照审阅意见修改;交给编辑审阅,再修改,再审阅,再修改.... 一本书,不仅包含了一年半的时光,也倾注了三人和编辑们的付出和努力 。
微服务架构是近年来较为流行的互联网大型项目架构,它将单体应用,转化为多个可以独立运行、独立开发、独立部署、独立维护的服务或者应用的聚合,从而满足业务快速变化及多团队并行开发的需求。
各个语言都有其自身的微服务框架,比如Java 的 Spring Cloud 和 Python 的nameko。而Go 语言也因其特性而在微服务和云原生领域大放异彩:
语法简单,上手快
性能高,编译快,开发效率也不低
原生支持并发,协程模型是非常优秀的服务端模型,同时也适合网络调用
部署方便,编译包小,几乎无依赖
一个语言的流行受到三方面因素的影响:一、自身足够优秀;二、开源社区足够多的投入;三、大公司的背书。
如今 Go 1.14 版本发布,Go语言更加成熟,缺点更加少;Go 相关的开源项目比如 Docker,Etcd,Prometheus 都已经成为顶级开源项目,使用 Go 编写的小型中间件项目更是数不尽数;头条,滴滴,腾讯等各大公司也都正在使用 Go 或者将原有项目迁移到 Go。所以,Go 语言在未来一段时间会变得越来越流行,也越来越有价值。
本书内容正是以上述 的微服务架构和 Go 语言为主线,介绍 Go 语言微服务的各个组件和并发实战。 本书包含四个部分的内容:
第一部分浅谈云原生与微服务,涉及云原生架构的全貌介绍和微服务的概述。
第二部分介绍 Go 语言基础,侧重于介绍 Go 语言的一些特性。
第三部分是 Go 语言的微服务实践,介绍微服务架构中涉及的基础组件,如分布式配置中心、服务注册于发现、轻量级通信机制与负载均衡、微服务的容错处理和分布式链路追踪等组件,在熟悉组件原理的基础上进行并发实践。
最后一部分为综合实战,将会结合 Go 语言微服务框架 Go-kit实现一个完整的商品秒杀系统,涉及本书介绍的各个微服务组件,将这些组件进行整合。
欢迎购买笔者的图书,现已出版上市,可以通过下方的二维码购买。
书籍目录如下所示(具体目录以实物为准)
1.1 云计算的历史 1
1.1.1 云计算的基础: 虚拟化技术 1
1.1.2 基于虚拟机的云计算 3
1.1.3 容器的横空出世和容器编排大战 5
1.1.4云计算演进总结 6
1.2 云原生是什么 7
1.2.1 云原生出现的背景 7
1.2.2 云原生的定义 8
1.2.3 云原生与12因素 9
1.3 云原生的基础架构 11
1.3.1 微服务 11
1.3.2 容器 12
1.3.3 服务网格 13
1.3.4 DevOps 14
1.4 小结 15
2.1 系统架构的演进 16
2.1.1 单体架构 16
2.1.2 垂直分层架构 17
2.1.3 SOA 面向服务架构 17
2.1.4 微服务架构 19
2.1.5 云原生架构 21
2.2 常见的微服务框架 22
2.2.1 Java中的Spring Cloud与Dubbo框架 22
2.2.2 Go语言中的Go Kit与Go Micro框架 24
2.3 微服务设计的六大原则 27
2.4 领域驱动设计 28
2.4.1 设计微服务的困境 28
2.4.2 解困之法:领域驱动设计(DDD) 29
2.4.3 DDD的应用领域 30
2.4.4 DDD领域划分 31
2.4.5 微服务架构中的团队组织和管理 33
2.5 小结 34
3.1 Go语言介绍 35
3.2 环境安装 36
3.2.1 Go开发包安装 36
3.2.2 第一个Go语言程序 38
3.2.3 编译工具 40
3.3 基本语法 41
3.3.1 变量的声明与初始化 41
3.3.2 原生数据类型 43 【实例3-1】分别以byte和rune的方式遍历字符串 44
3.3.3 指针 45 【实例3-2】使用flag从命令行中读取参数 47
3.3.4 常量与类型别名 48
3.3.5 分支与循环控制 49
3.4 Go中常用的容器 50
3.4.1 数组 50
3.4.2 切片 51 【实例3-3】切片的动态扩容 53
3.4.3 列表与字典 54
3.4.4 容器遍历 57 【实例3-4】对给出的数组nums、切片slis和字典tmpMap分别进行遍历。57
3.5 函数与接口 58
3.5.1 函数声明和参数传递 58
3.5.2 匿名函数和闭包 59 【实例3-5】使用回调函数处理字符串 59 【实例3-6】用闭包的特性实现一个简单的计数器 60
3.5.3 接口声明和嵌套 61
3.5.4 函数体实现接口 62
3.6 结构体和方法 62
3.6.1 结构体的定义 63
3.6.2 结构体的实例化和初始化 63
3.6.3 方法与接收器 64 【实例3-7】为Person结构体添加修改姓名和输出个人信息两个方法 65
3.6.4 结构体实现接口 66 【实例3-8】使用一个结构体同时实现Cat和Dog接口 66
3.6.5 内嵌和组合 67 【实例3-9】内嵌不同结构体表现不同行为 68
3.7 小结 69
4.1 依赖管理 70
4.1.1 包管理 70
4.1.2 GOPATH 72
4.1.3 Go Modules 73
4.2 反射基础 73
4.2.1 reflect.Type 类型对象 74
4.2.2 类型对象reflect.StructField和reflect.Method 76
4.2.3 reflect.Value 反射值对象 78 【实例4-1】使用反射调用接口方法 80
4.3 并发模型 82
4.3.1 并发与并行 82
4.3.2 CSP并发模型 82
4.3.3 常见的线程模型 83
4.3.4 MPG线程模型概述 85
4.4 并发实践 87
4.4.1 协程goroutine 87
4.4.2 通道channel 89
【实例4-2】协程使用channel发送和接收数据 90
实例4-3】使用带缓冲区的channel 91
【实例4-4】使用switch从多个channel中读取数据 92
4.4.3 sync同步包 94
【实例4-5】使用sync.Mutex控制多goroutine串行执行 94
【实例4-6】sync.RWMutex允许多读和单写 95
【实例4-7】sync.WaitGroup阻塞主goroutine直到其他goroutine执行结束 97 【实例4-8】使用sync.Map并发添加数据 98
4.5 小结 99
第5章 构建Go Web服务器
5.1 Web的工作原理 100
5.1.1 HTTP协议详解 100
5.1.2 访问Web站点的过程 103
5.2 使用Go语言构建服务器 104
【实例5-1】快速搭建一个Go Web服务器 104
5.3 接收和处理请求 105
5.3.1 Web工作的几个概念 106
5.3.2 处理器处理请求 107
5.3.3 解析请求体 109
【实例5-2】Go Web请求体解析 109
5.3.4 返回响应体 111
【实例5-3】返回响应体实践 112
5.4 实践案例:Golang Web框架Gin实践 113
5.5 服务端数据存储 116
5.5.1 内存存储 116
【实例5-4】服务端基于内存的存储方式实践 116
5.5.2 database/sql接口 118
5.5.3 关系数据库存储(MySQL) 118
【实例5-5】服务端基于MySQL的存储方式实践 119
5.5.4 Nosql数据库存储(MongoDB) 120
【实例5-6】服务端基于MongoDB的存储方式实践 121
5.6 Golang ORM框架beego实践 122
5.7 小结 125
第6章 服务注册与发现
6.1 服务注册与发现的基本原理 126
6.1.1 服务注册与发现中心的职责 126
6.1.2 服务实例注册服务信息 127
6.1.3 CAP原理 127
6.2 常用的服务注册与发现框架 128
6.2.1 基于Raft算法的开箱即用服务发现组件Consul 128
6.2.2 基于HTTP协议的分布式key/Value存储组件Etcd 130
6.2.3 重量级一致性服务组件Zookeeper 131
6.2.4 服务注册与发现组件的对比与选型 132
6.3 Consul安装和接口定义 133
6.3.1 Consul的安装与启动 133
6.3.2 Go-kit项目结构 134
6.3.3 服务注册与发现接口 135
6.3.4 项目的总体结构 135
6.4 实践案例:直接使用HTTP的方式和Consul交互 140
6.4.1 服务注册与健康检查 142
6.4.2 服务注销 144
6.4.3 服务发现 146
6.5 实践案例:借助Go-kit服务注册与发现包和Consul交互 147
6.5.1 服务注册与健康检查 148
6.5.2 服务注销 149
6.5.3 服务发现 150
6.5.4 服务实例信息缓存 150
6.5.5 MyDiscoverClient和KitDiscoverClient的比较 153
6.6 实践案例:基于服务注册与发现的string-service 153
6.6.1 项目结构 153
6.6.2 各层构建 154
6.7 小结 162
第7章 远程过程调用RPC
7.1 RPC机制和实现过程 164
7.1.1 RPC机制 164
7.1.2 传递参数 167
7.1.3 通信协议制定 168
7.1.4 出错和超时处理 170
7.1.5 通用RPC接口 171
7.2 简易的Go语言原生RPC 172
7.2.1 实践案例:Go语言RPC过程调用实践 172
7.2.2 服务端注册实现原理分析 175
7.2.3 服务端处理RPC请求原理分析 178
7.2.4 客户端发送RPC请求原理分析 182
7.2.5 资源重用 187
7.3 高性能的gRPC 188
7.3.1 gRPC的安装 189
7.3.2 实践案例:gRPC过程调用实践 190
7.3.3 流式编程 193 【实例7-1】gRPC流式请求 193
7.4 便捷的Go-kit RPC 196
7.4.1 Go-kit简介 196
7.4.2 实践案例:Go-kit过程调用实践 197
7.5 小结 202
第8章 分布式配置中心
8.1 如何管理分布式应用的配置 203
8.2 常见分布式配置中心开源组件 204
8.2.1 Spring Cloud Config 204
8.2.2 Apollo 205
8.2.3 Disconf 208
8.2.4 分布式配置中心的对比 210
8.3 应用Spring Cloud Config统一管理配置 210
8.3.1 搭建Spring Cloud Config Server 210
8.3.2 Viper介绍 213 【实例8-1】Viper实现读取本地配置信息 214
8.3.3 实战案例:动手实现Spring Cloud Config的Go语言客户端 216
8.4 实践案例:实现配置的热更新 219
8.4.1 如何实现热更新 219
8.4.2 Go语言客户端改进 220
8.4.3 结果验证 223
8.5 配置信息的加密解密 224
8.5.1 JCE环境安装 225
8.5.2 对称加密与解密 225
8.5.3 非对称加密与解密 226
8.6 小结 227
第9章 微服务网关
9.1 微服务网关介绍与功能特性 228
9.2 实践案例:自己动手实现一个网关 231
9.2.1 实现思路 231
9.2.2 编写反向代理方法 232
9.2.3 编写入口方法 233
9.2.4 运行 235
9.2.5 测试 235
9.3 API网关选型 235
9.3.1 标配组件:Nginx网关 236
9.3.2 Java前置网关服务最佳选型:Netflix Zuul 237
9.3.3 高可用服务网关:Mashape Kong 239
9.3.4 三种常用API网关组件的性能对比 240
9.4 Kong接入 240
9.4.1 为什么使用Kong 240
9.4.2 Kong安装实践 241 【实例9-1】Docker方式安装Kong 242
9.4.3 创建服务 244 9.4.4 创建路由 245
9.5 安装Kong插件 246
9.5.1 跨域身份验证:JWT认证插件 246
9.5.2 系统监控报警:Prometheus可视化监控插件 248
9.5.3 实时链路数据追踪:Zipkin插件 250
9.5.4 进阶应用:自定义Kong插件 252 【实例9-2】自定义鉴权插件token-auth 252
9.6 小结 257
第10章 微服务的容错处理与负载均衡
10.1 服务熔断 258
10.1.1 分布式系统中的服务雪崩 258
10.1.2 服务熔断保障系统可用性 260
10.1.3 断路器 261
10.2 负载均衡 262
10.2.1 负载均衡类型 262
10.2.2 负载均衡算法 262
10.3 实践案例:服务熔断和负载均衡使用 263
10.3.1 负载均衡器 263
10.3.2 服务编写 264
10.3.3 使用Go-kit Hystrix中间件 270 【实例10-1】使用Go-kit中Hystrix中间件修饰Endpoint 270
10.4 Hystrix详解 271
10.4.1 Hystrix基本使用 272
10.4.2 运行流程 273
10.4.3 常用参数配置 274
10.5 Hystrix监控面板 275
10.5.1 获取Hystirx命令调用信息 275
10.5.2 使用Hystrix Dashboard可视化面板 277
10.6 实践案例:在网关中添加Hystrix熔断和负载均衡 279
10.7 小结 282
第11章 统一认证与授权
11.1 微服务安全的挑战和现状 283
11.2 常见的认证与授权方案 283
11.2.1 当前行业授权标准OAuth2 283
11.2.2 数据共享的分布式Session 287
11.2.3 安全传输对象JWT 288
11.3 实践案例:基于OAuth2协议和JWT实现一套简单 的认证和授权系统 290
11.3.1 系统整体架构 290
11.3.2 授权服务器 291
11.3.3 资源服务器 311
11.4 小结 317
第12章 分布式链路追踪
12.1 诊断分布式系统的问题 318
12.1.1 为什么需要分布式链路追踪 318
12.1.2 什么是分布式链路追踪 319
12.1.3 分布式链路追踪规范:OpenTracing 320
12.1.4 分布式链路追踪的基础概念 321
12.2 几种流行的分布式链路追踪组件 323
12.2.1 简单易上手的Twitter Zipkin 323
12.2.2 云原生链路监控组件Uber Jaeger 324
12.2.3 探针性能低损耗的SkyWalking 326
12.2.4 链路统计详细的Pinpoint 327
12.2.5 4种分布式链路追踪组件的性能对比 328
12.3 实践案例:应用Zipkin追踪Go微服务 329
12.3.1 微服务中集成zipkin-go 330
12.3.2 Go-kit微服务框架集成Zipkin实现链路追踪 337
12.4 小结 346
第13章 综合实战:秒杀系统的设计与实现
13.1 秒杀系统简介 347
13.2 项目架构简介 350
13.2.1 项目简述 350
13.2.2 架构信息 350
13.2.3 流程简介 352
13.3 整合升级:各个微服务脚手架的组装 353
13.3.1 服务注册和发现 353
13.3.2 负载均衡策略 357 13.3.3 RPC客户端装饰器 360
13.3.4 限流 362 13.3.5 Go语言Redis使用简介 364
13.3.6 Zookeeper集成 365
13.3.7 Go-kit开发利器Truss 367
13.4 秒杀核心逻辑 368
13.4.1 秒杀业务系统 369
13.4.2 秒杀核心系统 380
13.4.3 秒杀管理系统 384
13.5 运行展示与性能压测 386
13.5.1 Consul截图 386
13.5.2 查看服务的配置文件 387
13.5.3 zipkin主页信息 388
13.5.4 压测实验 389
13.6 小结 392