Spring Cloud与Docker微服务架构实战
  • 推荐7
  • 收藏35
  • 浏览10.3K

Spring Cloud与Docker微服务架构实战

周立 (作者) 

  • 书  号:978-7-121-31271-7
  • 出版日期:2017-05-01
  • 页  数:268
  • 开  本:16(185*235)
  • 出版状态:上市销售
  • 维护人:张春雨
作为一部帮助大家实现微服务架构落地的作品,《Spring Cloud与Docker微服务架构实战》覆盖了微服务理论、微服务开发框架(Spring Cloud)以及运行平台(Docker)三大主题。全书可分为三部分,第1章对微服务架构进行了系统的介绍;第2-11章使用Spring Cloud开发框架编写了一个“电影售票系统”;第12-14章则讲解了如何将微服务应用运行在Docker之上。全书Demo驱动学习,以连贯的场景、具体的代码示例来引导读者学习相关知识,最终使用特定的技术栈实现微服务架构的落地。
本书以实战为主要特色,旨在将微服务理论引入工作实践;作为国内屈指可数的Spring Cloud专著,本书内容较为稀缺;此外,作者为本书书提供了系统连贯的配套Demo。

周立,Spring Cloud中国社区联合发起人。拥有近7年的软件系统开发经验,多年系统架构经验。对Spring Cloud、微服务、持续集成、持续交付有一定见地。
热爱技术交流,曾代表公司参加全球微服务架构高峰论坛、QCon等技术沙龙。拥抱开源,在GitHub与Git@OSC上开源多个项目,并获得了开源中国的推荐,例如开源电子书《使用Spring Cloud与Docker实战微服务》等。
笔者博客:http://itmuch.com,定期分享Spring Cloud相关博客。读者可扫码关注Spring Cloud 中国社区公众号以及作者公众号。
随着业务的发展,笔者当时所在公司的项目越来越臃肿。随着代码的堆砌,项目变得越来越复杂、开发效率越来越低、越来越难以维护,小伙伴们苦不堪言,毫无幸福感可言。
我们迫切需要能够解放生产力、放飞小伙伴的“良药”,于是,微服务进入视野。然而,微服务究竟是什么,众说纷纭,没有人能说清楚什么是微服务。不仅如此,大家对微服务的态度也是旗帜鲜明,吹捧者、贬低者比比皆是,在笔者的 QQ群、微信群中硝烟四起。笔者参加了不少交流会,感觉许多分享常常停留在理论阶段。一场会下来,常常觉得似乎懂了,却苦于没有对应的技术栈去实现这些理论。
Docker、Jenkins等工具笔者均有涉猎,然而使用什么技术栈去实践微服务架构,很长时间成为笔者心中的疑问。
2015年中,笔者偶然在 GitHub上看到一个名为 SpringCloud的框架,它基于 SpringBoot,配置简单、设计优雅,并且大多组件经过了生产环境的考验。笔者花 1个月左右的时间详细研究了 Spring Cloud的相关组件后,体会更深。然而,技术选型必须要进行客观、多维度、全方位的分析,而不应由我个人的主观意见作为决定因素。文档丰富程度、社区活跃度、技术栈生态、开发效率、运行效率、成功案例等,都是我们选型的重要因素。经过调研,其他几点都很 OK,只缺成功案例——在当时,国内几乎没什么成功案例,甚至连中文的博客、相关资料都没有。
这让笔者陷入两难,在这一过程中,公司一边继续使用阿里巴巴开源的 Dubbo(Dubbo虽然在国内非常流行,但毕竟有段时间没有维护了,开源生态也不是很好),一边在笔者的组织下进行一些 Spring Cloud相关的技术分享。一方面是希望借此开拓小伙伴们的视野,另一方面也希望能将两者相互印证,看能否在现有平台上借鉴 Spring Cloud的设计或使用其部分组件。
2016年 8月,笔者有幸代表公司参加了全球微服务架构高峰论坛。会上, Josh Long对 Spring Cloud的讲解在现场引起了不小的轰动,也让笔者眼前一亮。会后笔者咨询 Josh, Spring Cloud能否用于生产、是否大规模使用、国内是否已有成功案例,对方一一给出了肯定的回答。这一回答消除了笔者最后的一点疑虑,并定下了从 Dubbo逐步迁移至 SpringCloud的规划与方案。会后,笔者心想,不妨将 SpringCloud相关知识总结成一个“系列博客”,一来是加深自己的理解,二来也算是丰富 SpringCloud的中文资料。于是,笔者创建了自己的博客 http://www.itmuch.com,并开始了系列博客的编写。写了两篇后,笔者将博客链接分享到微信群中,没成想,恰好被 JoshLong看到,并引用到 Spring官方博客中去了。这让笔者感到无比荣幸的同时,也让自己贡献开源社区的欲望空前强烈,
于是乎,一口气又写了两篇。
再后来,笔者成立了微服务 /Spring Cloud/Docker相关的 QQ群( 157525002),在 QQ群小伙伴的鼓励下,笔者决定写一本 Spring Cloud开源书 https://github.com/eacdy/spring-cloud-book,没想到竟然获得开源中国的推荐。再然后,笔者在许进的邀请下,联合创始了 Spring Cloud中国社区。最后,在群管理员冯靖的引荐下,认识了网红级的大牛张开涛,开涛帮忙引荐了电子工业出版社编辑张春雨老师。从此,笔者正式撰写实体书。
本以为,有了开源书的撰写经验,实体书应该是较为轻松的一件事。然而,样稿发出后,却被春雨鄙视……主要是语文是体育老师教的,病句满天飞,况且,理论不是我的专长……期间一度想要放弃,多亏春雨老师的鼓励,总算坚持写了下去……
仓促完稿之际,感慨万千,激动与感激交织,于是,本段不可免俗,进入老生常谈的“鸣谢”环节——感谢我的家人,写书是个费时费力的活儿,在近半年的时间,我的父母和妻子给予了我极大的支持;感谢电子工业出版社小伙伴们的辛苦工作,没有刘佳禾、孙奇俏、张春雨等可爱的朋友们,我的书不可能面世;衷心感谢丁露、冯靖、张英磊、王天青、吴峻申(n本书的作者)在百忙之中帮忙校对;衷心感谢 QQ群、微信群的朋友们,你们给了笔者最大的帮助和支持!注:排名不分先后。
特别鸣谢:感谢吴峻申给笔者提出很多中肯实用的建议和意见;感谢张英磊帮忙重绘、美化书中绝大部分架构图。
谨以此书献给想要学习微服务、SpringCloud、Docker又不知从何开始的读者朋友们。希望本书能切切实实地帮助您使用特定技术栈实现微服务架构的落地,也希望本书不会令您失望。本书很多理论性的内容并未展开,例如 Cloud Native、12-factor App、DDD等,但笔者都在文中以 TIPS、拓展阅读或 WARNING的形式进行了标记,这部分内容希望读者能够自行拓展阅读。
周立 千米网

目录

1 微服务架构概述. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
1.1 单体应用架构存在的问题1
1.2 如何解决单体应用架构存在的问题3
1.3 什么是微服务3
1.4 微服务架构的优点与挑战5
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 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
2.1 Spring Cloud 简介10
2.2 Spring Cloud 特点10
2.3 Spring Cloud 版本11
2.3.1 版本简介11
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 硬编码有哪些问题27
4 微服务注册与发现. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
4.1 服务发现简介29
4.2 Eureka 简介31
4.3 Eureka 原理31
4.4 编写Eureka Server 33
4.5 将微服务注册到Eureka Server 上35
4.6 Eureka Server 的高可用36
4.6.1 将应用注册到Eureka Server 集群上38
4.7 为Eureka Server 添加用户认证39
4.7.1 将微服务注册到需认证的Eureka Server 40
4.8 理解Eureka 的元数据41
4.8.1 改造用户微服务41
4.8.2 改造电影微服务41
4.9 Eureka Server 的REST 端点43
4.9.1 示例45
4.9.2 注销微服务实例49
4.10 Eureka 的自我保护模式51
4.11 多网卡环境下的IP 选择52
4.11.1 忽略指定名称的网卡52
4.11.2 使用正则表达式,指定使用的网络地址52
4.11.3 只使用站点本地地址53
4.11.4 手动指定IP 地址53
4.12 Eureka 的健康检查53
5 使用Ribbon 实现客户端侧负载均衡. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56
5.1 Ribbon 简介56
5.2 为服务消费者整合Ribbon 57
5.3 使用Java 代码自定义Ribbon 配置60
5.4 使用属性自定义Ribbon 配置63
5.5 脱离Eureka 使用Ribbon 64
6 使用Feign 实现声明式REST 调用. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66
6.1 Feign 简介67
6.2 为服务消费者整合Feign 67
6.3 自定义Feign 配置69
6.4 手动创建Feign 72
6.4.1 修改用户微服务72
6.4.2 修改电影微服务76
6.5 Feign 对继承的支持78
6.6 Feign 对压缩的支持79
6.7 Feign 的日志80
6.8 使用Feign 构造多参数请求82
6.8.1 GET 请求多参数的URL 82
6.8.2 POST 请求包含多个参数83
7 使用Hystrix 实现微服务的容错处理. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85
7.1 实现容错的手段85
7.1.1 雪崩效应85
7.1.2 如何容错86
7.2 使用Hystrix 实现容错88
7.2.1 Hystrix 简介88
7.2.2 通用方式整合Hystrix 89
7.2.3 Hystrix 断路器的状态监控与深入理解91
7.2.4 Hystrix 线程隔离策略与传播上下文93
7.2.5 Feign 使用Hystrix 96
7.3 Hystrix 的监控101
7.3.1 Feign 项目的Hystrix 监控102
7.4 使用Hystrix Dashboard 可视化监控数据103
7.5 使用Turbine 聚合监控数据105
7.5.1 Turbine 简介105
7.5.2 使用Turbine 监控多个微服务105
7.5.3 使用消息中间件收集数据108
8 使用Zuul 构建微服务网关. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113
8.1 为什么要使用微服务网关113
8.2 Zuul 简介115
8.3 编写Zuul 微服务网关115
8.4 Zuul 的路由端点118
8.5 Zuul 的路由配置详解119
8.6 Zuul 的安全与Header 122
8.6.1 敏感Header 的设置122
8.6.2 忽略Header 123
8.7 使用Zuul 上传文件124
8.7.1 编写文件上传微服务124
8.8 Zuul 的过滤器127
8.8.1 过滤器类型与请求生命周期127
8.8.2 编写Zuul 过滤器128
8.8.3 禁用Zuul 过滤器130
8.9 Zuul 的容错与回退130
8.9.1 为Zuul 添加回退131
8.10 Zuul 的高可用133
8.10.1 Zuul 客户端也注册到了Eureka Server 上133
8.10.2 Zuul 客户端未注册到Eureka Server 上133
8.11 使用Sidecar 整合非JVM 微服务134
8.11.1 编写Node.js 微服务135
8.11.2 编写Sidecar 136
8.11.3 Sidecar 的端点138
8.11.4 Sidecar 与Node.js 微服务分离部署139
8.11.5 Sidecar 原理分析139
9 使用Spring Cloud Config 统一管理微服务配置. . . . . . . . . . . . . . . . . . . . . . . 142
9.1 为什么要统一管理微服务配置142
9.2 Spring Cloud Config 简介143
9.3 编写Config Server 144
9.3.1 Config Server 的端点145
9.4 编写Config Client 147
9.5 Config Server 的Git 仓库配置详解149
9.6 Config Server 的健康状况指示器152
9.7 配置内容的加解密153
9.7.1 安装JCE 153
9.7.2 Config Server 的加解密端点153
9.7.3 对称加密153
9.7.4 存储加密的内容154
9.7.5 非对称加密155
9.8 使用/refresh 端点手动刷新配置155
9.9 使用Spring Cloud Bus 自动刷新配置157
9.9.1 Spring Cloud Bus 简介157
9.9.2 实现自动刷新158
9.9.3 局部刷新159
9.9.4 架构改进159
9.9.5 跟踪总线事件160
9.10 Spring Cloud Config 与Eureka 配合使用161
9.11 Spring Cloud Config 的用户认证162
9.11.1 Config Client 连接需用户认证的Config Server 163
9.12 Config Server 的高可用164
9.12.1 Git 仓库的高可用164
9.12.2 RabbitMQ 的高可用164
9.12.3 Config Server 自身的高可用165
10 使用Spring Cloud Sleuth 实现微服务跟踪. . . . . . . . . . . . . . . . . . . . . . . . . . . . 167
10.1 为什么要实现微服务跟踪167
10.2 Spring Cloud Sleuth 简介168
10.3 整合Spring Cloud Sleuth 170
10.4 Spring Cloud Sleuth 与ELK 配合使用172
10.5 Spring Cloud Sleuth 与Zipkin 配合使用176
10.5.1 Zipkin 简介176
10.5.2 编写Zipkin Server 176
10.5.3 微服务整合Zipkin 178
10.5.4 使用消息中间件收集数据181
10.5.5 存储跟踪数据183
11 Spring Cloud 常见问题与总结. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 186
11.1 Eureka 常见问题186
11.1.1 Eureka 注册服务慢186
11.1.2 已停止的微服务节点注销慢或不注销187
11.1.3 如何自定义微服务的Instance ID 188
11.1.4 Eureka 的UNKNOWN 问题总结与解决189
11.2 Hystrix/Feign 整合Hystrix 后首次请求失败190
11.2.1 原因分析191
11.2.2 解决方案191
11.3 Turbine 聚合的数据不完整191
11.3.1 解决方案192
11.4 Spring Cloud 各组件配置属性193
11.4.1 Spring Cloud 的配置193
11.4.2 原生配置193
11.5 Spring Cloud 定位问题思路总结194
12 Docker 入门. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 197
12.1 Docker 简介197
12.2 Docker 的架构197
12.3 安装Docker 199
12.3.1 系统要求199
12.3.2 移除非官方软件包199
12.3.3 设置Yum 源199
12.3.4 安装Dokcer 200
12.3.5 卸载Docker 201
12.4 配置镜像加速器201
12.5 Docker 常用命令202
12.5.1 Docker 镜像常用命令202
12.5.2 Docker 容器常用命令204
13 将微服务运行在Docker 上. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 209
13.1 使用Dockerfile 构建Docker 镜像209
13.1.1 Dockerfile 常用指令210
13.1.2 使用Dockerfile 构建镜像215
13.2 使用Docker Registry 管理Docker 镜像217
13.2.1 使用Docker Hub 管理镜像217
13.2.2 使用私有仓库管理镜像219
13.3 使用Maven 插件构建Docker 镜像220
13.3.1 快速入门221
13.3.2 插件读取Dockerfile 进行构建222
13.3.3 将插件绑定在某个phase 执行223
13.3.4 推送镜像224
13.4 常见问题与总结226
14 使用Docker Compose 编排微服务. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 227
14.1 Docker Compose 简介227
14.2 安装Docker Compose 227
14.2.1 安装Compose 228
14.2.2 安装Compose 命令补全工具228
14.3 Docker Compose 快速入门229
14.3.1 基本步骤229
14.3.2 入门示例229
14.3.3 工程、服务、容器230
14.4 docker-compose.yml 常用命令230
14.4.1 build 230
14.4.2 command 231
14.4.3 dns 231
14.4.4 dns_search 231
14.4.5 environment 231
14.4.6 env_file 232
14.4.7 expose 232
14.4.8 external_links 232
14.4.9 image 232
14.4.10 links 232
14.4.11 networks 233
14.4.12 network_mode 233
14.4.13 ports 233
14.4.14 volumes 233
14.4.15 volumes_from 234
14.5 docker-compose 常用命令234
14.5.1 build 234
14.5.2 help 235
14.5.3 kill 235
14.5.4 logs 235
14.5.5 port 235
14.5.6 ps 235
14.5.7 pull 235
14.5.8 rm 236
14.5.9 run 236
14.5.10 scale 236
14.5.11 start 236
14.5.12 stop 236
14.5.13 up 236
14.6 Docker Compose 网络设置237
14.6.1 基本概念237
14.6.2 更新容器237
14.6.3 links 238
14.6.4 指定自定义网络238
14.6.5 配置默认网络239
14.6.6 使用已存在的网络239
14.7 综合实战:使用Docker Comose 编排Spring Cloud 微服务240
14.7.1 编排Spring Cloud 微服务240
14.7.2 编排高可用的Eureka Server 243
14.7.3 编排高可用Spring Cloud 微服务集群及动态伸缩245
14.8 常见问题与总结247
后记. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 248

本书勘误

印次
  • 页码:P26  •  印次: 1

    文中代码示例@Value(“user.userServiceUrl”) 应该改为 @Value(“${user.userServiceUrl}”)

    zhuhai189 提交于 2017/8/5 11:06:06
    张春雨 确认于 2017/8/7 10:03:57
  • 页码:6  •  行数:倒数第13行  •  印次: 6

    “Java的RMI则协议”应该改成“Java的RMI协议则”

    a448984863 提交于 2017/11/28 16:15:22
    张春雨 确认于 2017/12/14 10:27:10
  • 页码:50  •  行数:1  •  印次: 1  •  修订印次: 5

    Eureka Serve —> Eureka Server

    zlren 提交于 2017/11/5 17:15:34
    张春雨 确认于 2017/11/13 14:28:43
  • 页码:202  •  行数:6  •  印次: 9

    标题拼写错误,docket写成了dokcer

    ruiG 提交于 2019/9/14 23:51:43
    张春雨 确认于 2020/3/23 9:54:02
  • 页码:205  •  行数:倒数第10行  •  印次: 5  •  修订印次: 5

    “而其他的仓库都不是镜像仓库”
    应为
    “而其他的仓库都不是官方镜像仓库”

    level 提交于 2017/11/8 10:34:08
    张春雨 确认于 2017/11/13 15:36:38

读者评论

  • springboot整合Actuator.只有1.4.3可以使用。最新版本如何使用?

    ear发表于 2019/6/10 23:50:41
    • 最新版本的用法详见博客:http://www.itmuch.com/spring-cloud/finchley-3/

      周立发表于 2019/6/15 22:53:03
  • 下载了本书代码后,发现缺少了如下章节 《10.5.5 存储跟踪数据183》 的项目源码。麻烦周老师提供下,谢谢
    microservice-**-consumer-movie-trace-zipkin-stream(在trace工程下面)

    发表于 2018/8/30 0:18:49
    • 您好,microservice-**-consumer-movie-trace-zipkin-stream 和 provider-user-trace-zipkin-stream玩法是一样的,详见:https://github.com/itmuch/spring-cloud-docker-microservice-book-code/tree/master/trace/microservice-**-provider-user-trace-zipkin-stream

      周立发表于 2019/6/15 22:56:03
  • 9.3中Config Server用任意一URL访问Git仓库都报:
    j**a.net.ConnectException: Connection refused: connect github.com这种拒绝连接错误;请问这怎么处理;
    注:公司使用网络代理;
    很着急,有劳各位大佬帮忙解决一下,1576997162是我QQ,方便联系!谢谢

    星瑞A发表于 2018/7/9 15:56:04
    • 网络不通吧。。

      周立发表于 2018/8/23 10:47:08
  • 我用m**en install本地的一个项目,安装成功,在另一个项目pom文件中添加了这个项目的依赖,在m**ren依赖也能看到jar包,但是import不了里面的类,急

    lixianlin2018发表于 2018/6/2 20:17:30
    • 在你的IDE上 update下依赖吧

      周立发表于 2018/8/23 10:46:58
  • 有学习交流群吗

    lixianlin2018发表于 2018/6/2 19:59:14
    • 您好,群号:731548893

      周立发表于 2018/8/23 10:45:14

相关图书

Knative最佳实践

Jacques Chester (作者) 赵吉壮 杨云锋 (译者)

本书主要围绕 Knative 进行展开,主要作者是 Knative 专家(社区作者)Jacques Chester ,先后从 Knative 构建、扩缩容、事件...

¥118.00

ATT&CK框架实践指南

过去,入侵检测能力的度量是个公认的行业难题,各个企业得安全负责人每年在入侵防护上都投入大量费用,但几乎没有人能回答CEO 的问题:“买了这么多产品,我们的入侵防...

¥148.00

云原生数据库:原理与实践

周恩昌 (作者)

本书详细剖析了作为核心基础软件系统的数据库在云计算时代的技术演进历程,从架构设计、实现机制和系统优化等多个角度阐述传统数据库技术是如何一步步发展到云原生形态的。...

¥99.00

SequoiaDB分布式数据库权威指南

黄达玮 (作者)

本书旨在介绍 SequoiaDB 巨杉数据库的基本概念、应用场景、企业级应用案例、数据库实例创建与管理方式、数据库集群管理的基本策略、以及性能调优和问题诊断。...

¥99.00

最强iOS和macOS安全宝典

Jonathan Levin (作者) 郑旻 (译者)

《最强iOS和macOS安全宝典》以苹果操作系统的安全为主题,主要面向苹果高级用户、系统管理员、安全研究人员和黑客。<br>本书主要分三个部分:第一部分重点介绍...

¥179.00

极限黑客攻防:CTF赛题揭秘

王新辉 天融信阿尔法实验室 张黎元 郭勇生 (作者)

CTF在网络安全领域特指网络安全技术人员之间进行技术竞技的一种比赛。CTF代替了以往黑客通过互相发起真实攻击进行技术比拼的方式,题目来自日常工作环境,并将其中的...

¥99.00