Spring Cloud与Docker微服务架构实战(第2版)

1,637 阅读22分钟

网站

更多书籍点击进入>> CiCi岛

下载

电子版仅供预览及学习交流使用,下载后请24小时内删除,支持正版,喜欢的请购买正版书籍

封页

封页

编辑推荐

适读人群 :关注微服务架构有及Spring Cloud及分布式系统的从业者。 √ Spring Cloud 快速崛起后已成为微服务领域无可争议的标准 √ 来自Spring Cloud社区发起人|布道者|微服务专家的真知灼见 √ 这一Java企业级微服务极限武器已在所有互联网公司实现部署 √ 高速发展中的Spring Cloud须要你快速跟上新版本了解新实践

内容简介

本书基于Spring Cloud Edgware RELEASE 与Docker 17.09,以指导技术团队实现微服务架构落地为宗旨,覆盖微服务理论、微服务开发框架(Spring Cloud)及运行平台(Docker)三大主题。全书分为3部分,第1部分对微服务架构进行系统介绍;第2部分使用Spring Cloud 开发框架编写一个“电影售票系统”;第3部分讲解如何将微服务应用运行在Docker 之上。全书采用精心设计的Demo 驱动,以连贯的场景、真实的代码示例来引导读者学习用强大的微服务技术实现架构设计。作为第2版,本书增补大量新版本框架独有的技术特性及其技巧、用例,以帮助读者避开升级中可能遇到的困难与陷阱。 本书适合Java 工程师、架构师及运维人员及技术爱好者阅读。

作者简介

周立,拥有近8年的软件系统开发经验,多年系统架构经验,对Spring Cloud、微服务、持续集成、持续交付有一定见地。 他热爱技术交流,曾代表公司参加全球微服务架构高峰论坛、QCon等技术沙龙;拥抱开源,在GitHub与Git@OSC上开源多个项目,例如开源电子书 《使用Spring Cloud与Docker实战微服务》 等,并获得了开源中国的推荐。 作者博客:itmuch.com,定期分享Spring Cloud相关文章。读者可扫码关注作者公众号。

目 录

1 微服务架构概述 1
1.1 单体应用架构存在的问题 1
1.2 如何解决单体应用架构存在的问题 3
1.3 什么是微服务. 3
1.4 微服务架构的优点与挑战 4
1.4.1 微服务架构的优点 5
1.4.2 微服务架构面临的挑战 5
1.5 微服务设计原则6
1.6 如何实现微服务架构 7
1.6.1 技术选型7
1.6.2 架构图及常用组件 8

2 微服务开发框架――Spring Cloud 9
2.1 Spring Cloud 简介 . 9
2.2 Spring Cloud 特点 . 10
2.3 Spring Cloud 版本 . 10
2.3.1 版本简介10
2.3.2 子项目一览 12
2.3.3 Spring Cloud/Spring Boot 版本兼容性 13

3 开始使用Spring Cloud 实战微服务.14
3.1 Spring Cloud 实战前提 14
3.1.1 技术储备14
3.1.2 工具及软件版本 15
3.2 服务提供者与服务消费者 16
3.3 编写服务提供者16
3.3.1 手动编写项目 . 17
3.3.2 使用Spring Initializr 快速创建Spring Boot 项目. 21
3.4 编写服务消费者23
3.5 为项目整合Spring Boot Actuator 25
3.6 硬编码有哪些问题 28

4 微服务注册与发现
4.1 服务发现简介. 30
4.2 Eureka 简介 . 32
4.3 Eureka 原理 . 32
4.4 编写Eureka Server 34
4.5 将微服务注册到Eureka Server 上 . 36
4.6 Eureka Server 的高可用 38
4.6.1 编写高可用Eureka Server . 38
4.6.2 将应用注册到Eureka Server 集群上 41
4.7 用户认证 . 41
4.7.1 为Eureka Server 添加用户认证 41
4.7.2 将微服务注册到需认证的Eureka Server 43
4.8 Eureka 的元数据43
4.8.1 改造用户微服务 43
4.8.2 改造电影微服务 44
4.9 Eureka Server 的REST 端点 46
4.9.1 示例 47
4.9.2 注销微服务实例 52
4.10 Eureka 的自我保护模式 53
4.11 多网卡环境下的IP 选择 54
4.12 Eureka 的健康检查 56
4.13 排除Jersey 依赖. 57

5 使用Ribbon 实现客户端侧负载均衡 59
5.1 Ribbon 简介 59
5.2 为服务消费者整合Ribbon 60
5.3 Ribbon 配置自定义 63
5.3.1 使用Java 代码自定义Ribbon 配置63
5.3.2 使用属性自定义Ribbon 配置 67
5.4 脱离Eureka 使用Ribbon . 68
5.5 饥饿加载 . 70

6 使用Feign 实现声明式REST 调用 72
6.1 Feign 简介 73
6.2 为服务消费者整合Feign . 73
6.3 自定义Feign 配置 . 75
6.3.1 使用Java 代码自定义Feign 配置75
6.3.2 使用属性自定义Feign 配置 79
6.4 手动创建Feign80
6.4.1 修改用户微服务 80
6.4.2 修改电影微服务 84
6.5 Feign 对继承的支持 86
6.6 Feign 对压缩的支持 87
6.7 Feign 的日志 87
6.7.1 编码方式设置日志级别 88
6.7.2 使用属性配置日志级别 89
6.8 使用Feign 构造多参数请求 90
6.8.1 GET 请求多参数的URL 90
6.8.2 POST 请求包含多个参数 .91
6.9 使用Feign 上传文件 92

7 使用Hystrix 实现微服务的容错处理 94
7.1 实现容错的手段 94
7.1.1 雪崩效应95
7.1.2 如何容错95
7.2 使用Hystrix 实现容错 . 97
7.2.1 Hystrix 简介 97

7.2.2 通用方式整合Hystrix. 98

7.2.3 Hystrix 断路器的状态监控与深入理解 102
7.2.4 Hystrix 线程隔离策略与传播上下文 103
7.2.5 Feign 使用Hystrix . 106
7.3 Hystrix 的监控112
7.4 使用Hystrix Dashboard 可视化监控数据. 113
7.5 使用Turbine 聚合监控数据 116
7.5.1 Turbine 简介 116
7.5.2 使用Turbine 监控多个微服务. 117
7.5.3 使用消息中间件收集数据. 119

8 使用Zuul 构建微服务网关 124
8.1 为什么要使用微服务网关 124
8.2 Zuul 简介 . 126
8.3 编写Zuul 微服务网关 . 126
8.4 管理端点 . 129
8.4.1 routes 端点 129
8.4.2 filters 端点 131
8.5 路由配置详解. 132
8.6 Zuul 的安全与Header . 136
8.6.1 敏感Header 的设置 136
8.6.2 忽略Header 136
8.7 使用Zuul 上传文件 137
8.8 Zuul 的过滤器140
8.8.1 过滤器类型与请求生命周期 . 140
8.8.2 内置过滤器详解 141
8.8.3 编写Zuul 过滤器 . 144
8.8.4 禁用Zuul 过滤器 . 146
8.9 Zuul 的容错与回退 146
8.10 饥饿加载 . 149
8.11 Query String 编码 . 150
8.12 Hystrix 隔离策略与线程池 150
8.12.1 隔离策略150
8.12.2 线程池配置 151
8.13 Zuul 的高可用152
8.13.1 Zuul 客户端也注册到了Eureka Server 上 152
8.13.2 Zuul 客户端未注册到Eureka Server 上. 152
8.14 使用Sidecar 整合非JVM 微服务 154
8.14.1 编写Node.js 微服务 154
8.14.2 编写Sidecar 155
8.14.3 Sidecar 的端点 . 157
8.14.4 Sidecar 与Node.js 微服务分离部署. 158
8.14.5 Sidecar 原理分析 . 158
8.15 使用Zuul 聚合微服务 . 160

9 使用Spring Cloud Config 统一管理微服务配置. 166
9.1 为什么要统一管理微服务配置 166
9.2 Spring Cloud Config 简介 . 167
9.3 编写Config Server . 168
9.4 编写Config Client . 171
9.5 Config Server 的Git 仓库配置详解 173
9.5.1 占位符支持 173
9.5.2 模式匹配174
9.5.3 搜索目录174
9.5.4 启动时加载配置文件. 175
9.6 Config Server 的健康状况指示器 176
9.7 配置内容的加解密 177
9.7.1 安装JCE 177
9.7.2 Config Server 的加解密端点 177
9.7.3 对称加密177
9.7.4 存储加密的内容 178
9.7.5 非对称加密 179
9.8 使用/refresh 端点手动刷新配置 180
9.9 使用Spring Cloud Bus 自动刷新配置 . 181
9.9.1 Spring Cloud Bus 简介. 181
9.9.2 实现自动刷新 . 182
9.9.3 局部刷新183
9.9.4 架构改进184
9.9.5 跟踪总线事件 . 184
9.10 Spring Cloud Config 与Eureka 配合使用. 186
9.11 Spring Cloud Config 的用户认证 187
9.12 Config Server 的高可用 188
9.12.1 Git 仓库的高可用 . 188
9.12.2 RabbitMQ 的高可用 189
9.12.3 Config Server 自身的高可用 189

10 使用Spring Cloud Sleuth 实现微服务跟踪 191

10.1 为什么要实现微服务跟踪 191
10.2 Spring Cloud Sleuth 简介 192
10.3 整合Spring Cloud Sleuth 194
10.4 Spring Cloud Sleuth 与ELK 配合使用 . 196
10.5 Spring Cloud Sleuth 与Zipkin 配合使用 200
10.5.1 Zipkin 简介 200
10.5.2 编写Zipkin Server 200
10.5.3 微服务整合Zipkin 202
10.5.4 Zipkin 与Eureka 配合使用 205
10.5.5 使用消息中间件收集数据 . 206
10.5.6 使用Elasticsearch 存储跟踪数据. 209
10.5.7 依赖关系图 211

11 Spring Cloud 常见问题与总结 213
11.1 Eureka 常见问题213
11.1.1 Eureka 注册服务慢 213
11.1.2 已停止的微服务节点注销慢或不注销 . 214
11.1.3 如何自定义微服务的Instance ID 215
11.1.4 Eureka 的UNKNOWN 问题总结与解决 217
11.2 整合Hystrix 后首次请求失败. 218
11.2.1 原因分析218
11.2.2 解决方案218
11.3 Turbine 聚合的数据不完整 219
11.4 Spring Cloud 各组件超时 . 220
11.4.1 RestTemplate 的超时 221
11.4.2 Ribbon 的超时 . 221
11.4.3 Feign 的超时 221
11.4.4 Hystrix 的超时 222
11.4.5 Zuul 的超时 222
11.5 Spring Cloud 各组件重试 . 223
11.5.1 重试步骤224
11.5.2 基于HTTP 响应码重试 224
11.5.3 关闭重试224
11.5.4 注意点224
11.6 Spring Cloud 各组件调优 . 225
11.6.1 Tomcat 参数 225
11.6.2 Hystrix 参数 225
11.6.3 Feign 参数 226
11.6.4 Zuul 参数 . 226
11.7 Spring Cloud 各组件配置属性. 228
11.7.1 Spring Boot 的配置 228
11.7.2 Spring Cloud 的配置 228
11.7.3 原生配置229
11.8 Spring Cloud 定位问题思路总结 229

12 Docker 入门232
12.1 Docker 简介 232
12.2 版本与迭代计划232
12.2.1 版本区别233
12.2.2 迭代计划233
12.3 Docker 的架构234
12.4 安装Docker 236
12.4.1 CentOS 7 安装Docker 236
12.4.2 Ubuntu 安装Docker 239
12.4.3 Windows 安装Docker. 244
12.4.4 Mac OS 安装Docker 245
12.5 配置镜像加速器245
12.6 Docker 常用命令246
12.6.1 Docker 镜像常用命令. 246
12.6.2 Docker 容器常用命令. 252

13 将微服务运行在Docker上 260
13.1 使用Dockerfile 构建Docker 镜像 . 260
13.1.1 Dockerfile 常用指令 261
13.1.2 使用Dockerfile 构建镜像 . 266
13.2 使用Docker Registry 管理Docker 镜像 268
13.2.1 使用Docker Hub 管理镜像 268
13.2.2 使用私有仓库管理镜像 270
13.3 使用Maven 插件构建Docker 镜像 271
13.3.1 快速入门272
13.3.2 插件读取Dockerfile 进行构建 273
13.3.3 将插件绑定在某个phase 执行 274
13.3.4 推送镜像 275
13.4 常见问题与总结277

14 使用Docker Compose 编排微服务 278
14.1 Docker Compose 简介 . 278
14.2 安装Docker Compose . 279
14.2.1 安装Compose . 279
14.2.2 安装Compose 命令补全工具 . 279
14.3 Docker Compose 快速入门 280
14.3.1 基本步骤 280
14.3.2 入门示例 280
14.3.3 工程、服务、容器 281
14.4 docker-compose.yml 常用命令281
14.5 docker-compose 常用命令 285
14.6 Docker Compose 网络设置 286
14.6.1 基本概念 286
14.6.2 更新容器 287
14.6.3 links 287
14.6.4 指定自定义网络 288
14.6.5 配置默认网络 . 289
14.6.6 使用已存在的网络 289
14.7 综合实战:使用Docker Comose 编排Spring Cloud 微服务 289
14.7.1 编排Spring Cloud 微服务 . 289
14.7.2 编排高可用的Eureka Server 293
14.7.3 编排高可用Spring Cloud 微服务集群及动态伸缩 295
14.8 常见问题与总结 297

后记 298
附录A:本书配套代码 299
附录B:Spring Cloud YES――快速开发脚手架 300
附录C:使用Docker 快速安装本书中的组件 301


前 言

序1
===
16年国庆假期之后,我所在的公司因为业务需要,想搭建一个API网关来综合治理已有业务调用服务(我司之前采用的是当当的Dubbo扩展框架Dubbox)。前期,我和同事们在技术选型环节,讨论了诸多目前比较红火的技术框架和工具。最后达成一致,采用微服务,来重构和调整原先这些Dubbox服务,并决定使用Spring Cloud(以下简称sc)来实现API网关,争取在17年能顺利平滑地从Dubbox过度到sc。而具体的API网关demo研发工作就落实到我这里。
在开始研发工作之前,我参阅了包括官网在内很多sc研发资料,也去全球最大的同性技术交友网站GitHub上找了很多代码来仔细研读。但感觉老外的这些Guide(指南)总是讲的不是很通透。也许是有些概念他们觉得太基础了,就直接略过不表。因此我也感到很迷茫,老是问自己,到底应该如何去实现这个API网关,完成公司指派给我的研发任务呢?
幸好,某一天我看到《Spring Cloud与Docker实战微服务》这本开源书。根据书中例子,我几乎没有费什么大工夫就搭建了一个API网关的demo。甚至其中某些讲解点,看了之后能让我一下子恍然大悟,回头再看那些老外的Guide,我终于明白了其中的“奥秘”。我真的非常感激这位开源书作者,他深入浅出地将sc所涉及的各种知识点和工具的使用做了完整和详细的叙述。从此,我也记住了此书作者的网名itmuch。
几天后,我将demo做了细化和扩展,并在oschina的码云网站上开源分享了出去(具体网址见<http://git.oschina.net/darkranger/spring-cloud-books>)。而无巧不巧,itmuch居然在我项目下的评论区留言了。经过加QQ,加微信一系列同性技术交友过程(你们懂的)取得了联系,也终于知道了这位itmuch的真名,那就是此书作者周立同学。在闲聊过程中,他透露了自己正在以那本《Spring Cloud与Docker实战微服务》开源书为基础,继续扩展和具体深入sc这套微服务开发体系所包含的所有技术点,准备出版成册,让更多的朋友和企业能学习和借鉴sc这套东西开发符合自己业务场景的微服务框架。并邀请我为新书做校对和修正工作。正巧,我也越来越喜欢钻研sc,也希望对自己碰到的一些问题向他指教,所以就答应了下来。这其中的过程真的一言难叙,总算最后我也不辱使命地完成了这本书的校对工作。
我可以很负责的说,本书是周立同学本人在工作和学习sc后总结出的精华,书中每段代码,每个字都是他自己写的,绝无任何抄袭之举。完全可以说是一个努力勤奋、能独立思考、认真做事的同学的良心之作。这样的“业界良心”在如今这个充满浮躁的社会中已不多见。希望有更多的读者能珍惜此书,感谢周立同学给我们的帮助。除此之外,我也希望读者能在阅读完此书后,可以自己写点代码,亲身去实践一把,感受sc的精妙之处。
最后,在草促完成本文之前,值此新春佳节之际,我也祝大家新年快乐,家庭安康,财源滚滚,爱情事业双丰收。
2017年1月25日
农历丙申年腊月二十八
吴峻申 青客机器人有限公司架构师

序2
===
2013年,我在EMC听了一个关于Docker与测试的分享,才第一次近距离认识Docker。在2014年底时,在项目上开始接触Docker。2015年上半年,我读了两本书:The Phoenix ProjectMigrating to Cloud-Native Application Architectures。这两本书让我对DevOps、微服务和云原生架构有了初步的认识。
2015年9月,我以首席架构师的身份加入麻袋理财,当时第一件事情就是就借助DaoCloud在公司内部推行基于Docker的基础落地的方案。花了三个月,一个简易的方案就已经可以正常运作。但是在这个过程中,却发现和应用的契合度不是太高,需要对应用的架构做改造。
2016年年初,当时正好有一个项目要做2.0,之前是一个典型的单体应用(使用Spring MVC),这次准备做微服务改造,以满足业务对技术快速迭代、横向扩展的要求。我当时对Spring Boot和Spring Cloud已经有所耳闻,但是还停留于Demo的地步。正好借着这个机会,准备推广Spring Boot。之后有个全新的项目,我们完全按照微服务架构,使用Spring Boot和Cloud进行开发,并采用CI/CD自动化流程和容器化部署。
2016年10月份时,一次偶然的计划,Spring Cloud中国社区的许进找到了我,让我把团队在实践过程中的经验总结在社区做了分享,从而认识了本书的作者周立。当时周立正好在写一本书,他希望我能够帮他进行review,我就欣然答应了。
看到了书的标题《Spring Cloud与Docker微服务实战》,这不就是我一直在做的工作吗?于是我连夜把这本书读了一遍,感觉相见恨晚,如果一年前有这本书,那我就可以少走很多弯路了。
本书用一个例子贯穿始终,讲解了Spring Cloud的经典组件、微服务架构,以及与Docker的集成。书中提供了详细的代码,可以让读者在了解基础概念的同时,可以马上脚踏实地的撸起袖子写代码。
王天青 DaoCloud 首席架构师
2017年3月

序 3
====
最近几年,微服务的概念非常火爆,由于它确实能解决传统单体应用所带来的种种问题(比如代码可维护性低、部署不灵活、不够稳定、不易扩展,等等),所以大家对“如何成功实施微服务架构”越来越感兴趣。在Java技术栈中,SpringCloud独树一帜,提供了一整套微服务解决方案,它基于SpringBoot而构建,延续了Spring体系一贯的“简单可依赖”,但是由于微服务本身涉及到的技术或概念比较广,所以在正式“入坑”之前,最好能有一本实战性强的书籍作为参考。但是很遗憾,SpringCloud太新了,国内几乎没有一本完整讲解其用法的新书。
今年年初,我偶然得知周立兄在编写SpringCloud相关的书籍,感到非常惊喜,在和他交流的过程中,我能感觉到他对技术的把控力以及对知识分享的热情! 阅读这本书的过程是非常愉悦的,不仅仅是因为它结构之清晰,文风之流畅,更重要的是实战型极强,相信大家能在本书的指导下,顺利地基于SpringCloud&Docker打造出自己的微服务应用。
杜云飞 上海小虫数据技术合伙人,风控大数据负责人

序4
===
在Spring尚未出现的“蛮荒”时代,Java程序员们还在迷茫地创造着各种“语法糖”来试图提高生产效率。然而无论怎么努力,Java语言仍被许多人冠以“裹脚布”的名号——毕竟你一不小心就会把它写的又臭又长。
随着Spring体系的出现与逐步完善,似乎有一种经历着Java工业革命的感觉。的确,任何事物都各有利弊,但我仍然想说,Spring团队给Java程序员们带来了春天(就像它的名字一样),它神奇地把“裹脚布”变成了“丝绸”,因为它最大的特质可以用两个字来形容——优雅。相信你如果使用过Spring Framework、Spring MVC、Spring Data、Spring Boot或Spring Cloud等一系列框架,并研读过它们的源代码,就一定能够体会到“优雅”二字的含义。
尽管Spring家族拥有如此多而美好的大块“语法糖”,但它们过去在国内的传播似乎都不怎么顺利。我经常说,国内对新技术的广泛应用一般比国外要晚三到五年,无论后端、前端还是架构理念。这是许多因素导致的,比如信息闭塞、语言不通、甚至固步自封。我相信随着国内互联网人才越来越多,新技术应用的延时一定会越来越短。或许很多人为了旧系统的稳定而不愿升级,这可以理解,但我希望人们可以拥抱新的事物,而不是排斥。现如今微服务架构理念兴起,人们急需一个快捷、稳定、一站式的分布式微服务解决方案,Spring Cloud正是为此而诞生。可国内熟知Spring Cloud的人目前仍寥寥无几,大部分人从未听说过,想要学习的人不知从何开始,对官方的英文文档也一知半解。人们需要一本能把他们领进Spring Cloud这扇门的“红宝书”,这便是本书的目的,也是本书作者周立的初衷——希望能够为减少国内新技术的延时而出一份力。
我与周立在2016年相识,在短暂的交流后我们都产生了相见恨晚的感觉。遇见志同道合的人并不容易,我们的技术理念很相似。他有着对技术的热忱、灵活的头脑、以及开源分享技术的无私精神,正是这股精神促使他做了许多分享技术的事情,并且编写了这本书(相信我,写书并不赚钱)。我十分欣赏周立身上的这些特质,因此当他跟我提到想出书并找我帮忙时,我毫不犹豫地答应了他。我相信他未来一定能够成为某一技术领域的专家,这是他的目标,他也具备这样的潜质。
本书的切入点非常好,它并不纠结于冗长的源码解读或原理解释,而是更多地注重实战,这在如今互联网爆炸式发展的时代相当重要。现在人们更倾向于使用敏捷开发尽快做出产品来进行试错,并在后续版本中快速迭代。因此本书的实战经验在软件工程层面上会给予阅读者很大提升,它可以让你更快地搭建分布式微服务架构,然后把精力留在编写业务逻辑上,提高你的生产力,并最终做出更好的产品——这也是Spring团队一直希望达到的效果。
现在,让我们随本书进入Spring Cloud的世界,一起感受它的优雅吧!

张英磊 云账房CTO
2017年3月29日

本篇文章由一文多发平台ArtiPub自动发布