书海网短评:
首著重磅升级,领域重量级图书率先与技术新版接轨,读者可直接选用第2版。 √SpringCloud的崛起将取代Dubbo在微服务领域大行其道 √作者标签:SpringCloud社区
首著重磅升级,领域重量级图书率先与技术新版接轨,读者可直接选用第2版。
√SpringCloud的崛起将取代Dubbo在微服务领域大行其道
√作者标签:SpringCloud社区发起人|布道者|微服务专家
√SpringCloud可谓实现Java企业级微服务应用之极限武器
√SpringCloud是SpringBoot之上更完整、全能的解决方案
《Spring Cloud与Docker微服务架构实战》已全面升级,提醒读者直接选用第2版。
作为一部帮助大家实现微服务架构落地的作品,《SpringCloud与Docker微服务架构实战》覆盖了微服务理论、微服务开发框架(SpringCloud)以及运行平台(Docker)三大主题。《Spring Cloud与Docker微服务架构实战》可分为三部分,第1章对微服务架构进行了系统的介绍;第2-11章使用SpringCloud开发框架编写了一个“电影售票系统”;第12-14章则讲解了如何将微服务应用运行在Docker之上。《Spring Cloud与Docker微服务架构实战》Demo驱动学习,以连贯的场景、具体的代码示例来引导读者学习相关知识,最终使用特定的技术栈实现微服务架构的落地。
周立,SpringCloud中国社区联合发起人。拥有近7年的软件系统开发经验,多年系统架构经验。对SpringCloud、微服务、持续集成、持续交付有一定见地。
热爱技术交流,曾代表公司参加全球微服务架构高峰论坛、QCon等技术沙龙。拥抱开源,在GitHub与Git@OSC上开源多个项目,并获得了开源中国的推荐,例如开源电子书《使用SpringCloud与Docker实战微服务》等。
笔者博客:http://itmuch.com,定期分享SpringCloud相关博客。读者可扫码关注SpringCloud中国社区公众号以及作者公众号。
《Spring Cloud与Docker微服务架构实战》初稿完成后,我第一时间拿到了稿件,从零开始学习了SpringCloud,SpringCloud提供了构建分布式系统所需的“全家桶”。如果你想从零开始搭建一套分布式系统,《SpringCloud与Docker微服务架构实战》可以作为你的领路者,带你进入SpringCloud的世界。
——张开涛《亿级流量网站架构核心技术》作者
《SpringCloud与Docker微服务架构实战》从微服务设计原则和理念出发,详细说明了如何通过SpringCloud及Docker建立高效可用的微服务解决方案,并对SpringCloud的架构及组件、容器镜像的制作与编排进行逐一讲解,具备较强的实战指导意义。《Spring Cloud与Docker微服务架构实战》能够帮助技术人员快速了解和应用微服务,通过技术的变革与提升帮助业务适应市场的快速变化,从而提升技术的价值。
——廖俊杰,广发银行IDC团队负责
《SpringCloud与Docker微服务架构实战》这《Spring Cloud与Docker微服务架构实战》中,作者由浅入深地对SpringCloud的主要常用组件进行了例剖析和精彩讲解,让读者能快速上手,快速搭建基于SpringCloud的微服务应用。
——许进(xujin.org)SpringCloud中国社区创始人,中间件高级研发工程师
我认识的周立是一个对技术非常执着的“技者”,对SpringCloud技术栈钻研得非常深入。这《Spring Cloud与Docker微服务架构实战》写得也非常实用,通过不同的角度来介绍SpringCloud,加入了很多实战的例子,值得一读。
——千米网首席架构师,曹祖鹏
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微服务开发框架——SpringCloud10
2.1SpringCloud简介10
2.2SpringCloud特点10
2.3SpringCloud版本11
2.3.1版本简介11
2.3.2子项目一览12
2.3.3SpringCloud/SpringBoot版本兼容性13
3开始使用SpringCloud实战微服务14
3.1SpringCloud实战前提14
3.1.1技术储备14
3.1.2工具及软件版本15
3.2服务提供者与服务消费者16
3.3编写服务提供者16
3.3.1手动编写项目17
3.3.2使用SpringInitializr快速创建SpringBoot项目21
3.4编写服务消费者23
3.5为项目整合SpringBootActuator25
3.6硬编码有哪些问题27
4微服务注册与发现.29
4.1服务发现简介29
4.2Eureka简介31
4.3Eureka原理31
4.4编写EurekaServer33
4.5将微服务注册到EurekaServer上35
4.6EurekaServer的高可用36
4.6.1将应用注册到EurekaServer集群上38
4.7为EurekaServer添加用户认证39
4.7.1将微服务注册到需认证的EurekaServer40
4.8理解Eureka的元数据41
4.8.1改造用户微服务41
4.8.2改造电影微服务41
4.9EurekaServer的REST端点43
4.9.1示例45
4.9.2注销微服务实例49
4.10Eureka的自我保护模式51
4.11多网卡环境下的IP选择52
4.11.1忽略指定名称的网卡52
4.11.2使用正则表达式,指定使用的网络地址52
4.11.3只使用站点本地地址53
4.11.4手动指定IP地址53
4.12Eureka的健康检查53
5使用Ribbon实现客户端侧负载均衡56
5.1Ribbon简介56
5.2为服务消费者整合Ribbon57
5.3使用Java代码自定义Ribbon配置60
5.4使用属性自定义Ribbon配置63
5.5脱离Eureka使用Ribbon64
6使用Feign实现声明式REST调用.66
6.1Feign简介67
6.2为服务消费者整合Feign67
6.3自定义Feign配置69
6.4手动创建Feign72
6.4.1修改用户微服务72
6.4.2修改电影微服务76
6.5Feign对继承的支持78
6.6Feign对压缩的支持79
6.7Feign的日志80
6.8使用Feign构造多参数请求82
6.8.1GET请求多参数的URL82
6.8.2POST请求包含多个参数83
7使用Hystrix实现微服务的容错处理.85
7.1实现容错的手段85
7.1.1雪崩效应85
7.1.2如何容错86
7.2使用Hystrix实现容错88
7.2.1Hystrix简介88
7.2.2通用方式整合Hystrix89
7.2.3Hystrix断路器的状态监控与深入理解91
7.2.4Hystrix线程隔离策略与传播上下文93
7.2.5Feign使用Hystrix96
7.3Hystrix的监控101
7.3.1Feign项目的Hystrix监控102
7.4使用HystrixDashboard可视化监控数据103
7.5使用Turbine聚合监控数据105
7.5.1Turbine简介105
7.5.2使用Turbine监控多个微服务105
7.5.3使用消息中间件收集数据108
8使用Zuul构建微服务网关..113
8.1为什么要使用微服务网关113
8.2Zuul简介115
8.3编写Zuul微服务网关115
8.4Zuul的路由端点118
8.5Zuul的路由配置详解119
8.6Zuul的安全与Header122
8.6.1敏感Header的设置122
8.6.2忽略Header123
8.7使用Zuul上传文件124
8.7.1编写文件上传微服务124
8.8Zuul的过滤器127
8.8.1过滤器类型与请求生命周期127
8.8.2编写Zuul过滤器128
8.8.3禁用Zuul过滤器130
8.9Zuul的容错与回退130
8.9.1为Zuul添加回退131
8.10Zuul的高可用133
8.10.1Zuul客户端也注册到了EurekaServer上133
8.10.2Zuul客户端未注册到EurekaServer上133
8.11使用Sidecar整合非JVM微服务134
8.11.1编写Node.js微服务135
8.11.2编写Sidecar136
8.11.3Sidecar的端点138
8.11.4Sidecar与Node.js微服务分离部署139
8.11.5Sidecar原理分析139
9使用SpringCloudConfig统一管理微服务配置142
9.1为什么要统一管理微服务配置142
9.2SpringCloudConfig简介143
9.3编写ConfigServer144
9.3.1ConfigServer的端点145
9.4编写ConfigClient147
9.5ConfigServer的Git仓库配置详解149
9.6ConfigServer的健康状况指示器152
9.7配置内容的加解密153
9.7.1安装JCE153
9.7.2ConfigServer的加解密端点153
9.7.3对称加密153
9.7.4存储加密的内容154
9.7.5非对称加密155
9.8使用/refresh端点手动刷新配置155
9.9使用SpringCloudBus自动刷新配置157
9.9.1SpringCloudBus简介157
9.9.2实现自动刷新158
9.9.3局部刷新159
9.9.4架构改进159
9.9.5跟踪总线事件160
9.10SpringCloudConfig与Eureka配合使用161
9.11SpringCloudConfig的用户认证162
9.11.1ConfigClient连接需用户认证的ConfigServer163
9.12ConfigServer的高可用164
9.12.1Git仓库的高可用164
9.12.2RabbitMQ的高可用164
9.12.3ConfigServer自身的高可用165
10使用SpringCloudSleuth实现微服务跟踪.167
10.1为什么要实现微服务跟踪167
10.2SpringCloudSleuth简介168
10.3整合SpringCloudSleuth170
10.4SpringCloudSleuth与ELK配合使用172
10.5SpringCloudSleuth与Zipkin配合使用176
10.5.1Zipkin简介176
10.5.2编写ZipkinServer176
10.5.3微服务整合Zipkin178
10.5.4使用消息中间件收集数据181
10.5.5存储跟踪数据183
11SpringCloud常见问题与总结..186
11.1Eureka常见问题186
11.1.1Eureka注册服务慢186
11.1.2已停止的微服务节点注销慢或不注销187
11.1.3如何自定义微服务的InstanceID188
11.1.4Eureka的UNKNOWN问题总结与解决189
11.2Hystrix/Feign整合Hystrix后首次请求失败190
11.2.1原因分析191
11.2.2解决方案191
11.3Turbine聚合的数据不完整191
11.3.1解决方案192
11.4SpringCloud各组件配置属性193
11.4.1SpringCloud的配置193
11.4.2原生配置193
11.5SpringCloud定位问题思路总结194
12Docker入门.197
12.1Docker简介197
12.2Docker的架构197
12.3安装Docker199
12.3.1系统要求199
12.3.2移除非官方软件包199
12.3.3设置Yum源199
12.3.4安装Dokcer200
12.3.5卸载Docker201
12.4配置镜像加速器201
12.5Docker常用命令202
12.5.1Docker镜像常用命令202
12.5.2Docker容器常用命令204
13将微服务运行在Docker上209
13.1使用Dockerfile构建Docker镜像209
13.1.1Dockerfile常用指令210
13.1.2使用Dockerfile构建镜像215
13.2使用DockerRegistry管理Docker镜像217
13.2.1使用DockerHub管理镜像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使用DockerCompose编排微服务.227
14.1DockerCompose简介227.
14.2安装DockerCompose227
14.2.1安装Compose228
14.2.2安装Compose命令补全工具228
14.3DockerCompose快速入门229
14.3.1基本步骤229
14.3.2入门示例229
14.3.3工程、服务、容器230
14.4docker-compose.yml常用命令230
14.4.1build230
14.4.2command231
14.4.3dns231
14.4.4dns_search231
14.4.5environment231
14.4.6env_file232
14.4.7expose232
14.4.8external_links232
14.4.9image232
14.4.10links232
14.4.11networks233
14.4.12network_mode233
14.4.13ports233
14.4.14volumes233
14.4.15volumes_from234
14.5docker-compose常用命令234
14.5.1build234
14.5.2help235
14.5.3kill235
14.5.4logs235
14.5.5port235
14.5.6ps235
14.5.7pull235
14.5.8rm236
14.5.9run236
14.5.10scale236
14.5.11start236
14.5.12stop236
14.5.13up236
14.6DockerCompose网络设置237
14.6.1基本概念237
14.6.2更新容器237
14.6.3links238
14.6.4指定自定义网络238
14.6.5配置默认网络239
14.6.6使用已存在的网络239
14.7综合实战:使用DockerComose编排SpringCloud微服务240
14.7.1编排SpringCloud微服务240
14.7.2编排高可用的EurekaServer243
14.7.3编排高可用SpringCloud微服务集群及动态伸缩245
14.8常见问题与总结247
后记.248
序1
16年国庆假期之后,我所在的公司因为业务需要,想搭建一个API网关来综合治理已有业务调用服务(我司之前采用的是当当的Dubbo扩展框架Dubbox)。前期,我和同事们在技术选型环节,讨论了诸多目前比较红火的技术框架和工具。最后达成一致,采用微服务,来重构和调整原先这些Dubbox服务,并决定使用SpringCloud(以下简称sc)来实现API网关,争取在17年能顺利平滑地从Dubbox过度到sc。而具体的API网关demo研发工作就落实到我这里。
在开始研发工作之前,我参阅了包括官网在内很多sc研发资料,也去全球最大的同性技术交友网站GitHub上找了很多代码来仔细研读。但感觉老外的这些Guide(指南)总是讲的不是很通透。也许是有些概念他们觉得太基础了,就直接略过不表。因此我也感到很迷茫,老是问自己,到底应该如何去实现这个API网关,完成公司指派给我的研发任务呢?
幸好,某一天我看到《SpringCloud与Docker实战微服务》这本开源书。根据书中例子,我几乎没有费什么大工夫就搭建了一个API网关的demo。甚至其中某些讲解点,看了之后能让我一下子恍然大悟,回头再看那些老外的Guide,我终于明白了其中的“奥义”。我真的非常感激这位开源书作者,他深入浅出地将sc所涉及的各种知识点和工具的使用做了完整和详细的叙述。从此,我也记住了此书作者的网名itmuch。
几天后,我将demo做了细化和扩展,并在oschina的码云网站上开源分享了出去(具体网址见http://git.oschina.net/darkranger/spring-cloud-books)。而无巧不巧,itmuch居然在我项目下的评论区留言了。经过加QQ,加微信一系列同性技术交友过程(你们懂的)取得了联系,也终于知道了这位itmuch的真名,那就是此书作者周立同学。在闲聊过程中,他透露了自己正在以那本《SpringCloud与Docker实战微服务》开源书为基础,继续扩展和具体深入sc这套微服务开发体系所包含的所有技术点,准备出版成册,让更多的朋友和企业能学习和借鉴sc这套东西开发符合自己业务场景的微服务框架。并邀请我为新书做校对和修正工作。正巧,我也越来越喜欢钻研sc,也希望对自己碰到的一些问题向他指教,所以就答应了下来。这其中的过程真的一言难叙,总算最后我也不辱使命地完成了这《Spring Cloud与Docker微服务架构实战》的校对工作。
我可以很负责的说,《Spring Cloud与Docker微服务架构实战》是周立同学本人在工作和学习sc后总结出的精华,书中每段代码,每个字都是他自己写的,绝无任何抄袭之举。完全可以说是一个努力勤奋、能独立思考、认真做事的同学的良心之作。这样的“业界良心”在如今这个充满浮躁的社会中已不多见。希望有更多的读者能珍惜此书,感谢周立同学给我们的帮助。除此之外,我也希望读者能在阅读完此书后,可以自己写点代码,亲身去实践一把,感受sc的精妙之处。
最后,在草促完成本文之前,值此新春佳节之际,我也祝大家新年快乐,家庭安康,财源滚滚,爱情事业双丰收。
2017年1月25日
农历丙申年腊月二十八
吴峻申青客机器人有限公司架构师
序2
2013年,我在EMC听了一个关于Docker与测试的分享,才第一次近距离认识Docker。在2014年底时,在项目上开始接触Docker。2015年上半年,我读了两《Spring Cloud与Docker微服务架构实战》:ThePhoenixProject和MigratingtoCloud-NativeApplicationArchitectures。这两《Spring Cloud与Docker微服务架构实战》让我对DevOps、微服务和云原生架构有了初步的认识。
2015年9月,我以首席架构师的身份加入麻袋理财,当时第一件事情就是就借助Dao-Cloud在公司内部推行基于Docker的基础落地的方案。花了三个月,一个简易的方案就已经可以正常运作。但是在这个过程中,却发现和应用的契合度不是太高,需要对应用的架构做改造。
2016年年初当时正好有一个项目要做2.0,之前是一个典型的单体应用(使用SpringMVC),这次准备做微服务改造,以满足业务对技术快速迭代、横向扩展的要求。我当时对SpringBoot和SpringCloud已经有所耳闻,但是还停留于Demo的地步。正好借着这个机会,准备推广SpringBoot。之后有个全新的项目,我们完全按照微服务架构,使用SpringBoot和Cloud进行开发,并采用CI/CD自动化流程和容器化部署。
2016年10月份时,一次偶然的计划,SpringCloud中国社区的许进找到了我,让我把团队在实践过程中的经验总结在社区做了分享,从而认识了《Spring Cloud与Docker微服务架构实战》的作者周立。当时周立正好在写一《Spring Cloud与Docker微服务架构实战》,他希望我能够帮他进行review,我就欣然答应了。
看到了书的标题《SpringCloud与Docker微服务实战》,这不就是我一直在做的工作吗?于是我连夜把这《Spring Cloud与Docker微服务架构实战》读了一遍,感觉相见恨晚,如果一年前有这《Spring Cloud与Docker微服务架构实战》,那我就可以少走很多弯路了。
《Spring Cloud与Docker微服务架构实战》用一个例子贯穿始终,讲解了SpringCloud的经典组件、微服务架构,以及与Docker的集成。书中提供了详细的代码,可以让读者在了解基础概念的同时,可以马上脚踏实地的撸起袖子写代码。
王天青DaoCloud首席架构师
2017年3月
序3
最近几年,微服务的概念非常火爆,由于它确实能解决传统单体应用所带来的种种问题
(比如代码可维护性低、部署不灵活、不够稳定、不易扩展,等等),所以大家对“如何成功实施微服务架构”越来越感兴趣。在Java技术栈中,SpringCloud独树一帜,提供了一整套微服务解决方案,它基于SpringBoot而构建,延续了Spring体系一贯的“简单可依赖”,但是由于微服务本身涉及到的技术或概念比较广,所以在正式“入坑”之前,最好能有一本实战性强的书籍作为参考。但是很遗憾,SpringCloud太新了,国内几乎没有一本完整讲解其用法的新书。在今年年初,我偶然得知周立兄在编写SpringCloud相关的书籍,感到非常惊喜,在和他交流的过程中,我能感觉到他对技术的把控力以及对知识分享的热情!阅读这《Spring Cloud与Docker微服务架构实战》的过程是非常愉悦的,不仅仅是因为它结构之清晰,文风之流畅,更重要的是实战型极强,相信大家能在《Spring Cloud与Docker微服务架构实战》的指导下,顺利地基于SpringCloud&Docker打造出自己的微服务应用。
杜云飞上海小虫数据
序4
随着微服务在国内的推广普及,许多企业纷纷将微服务作为IT架构的转型方向,并进行大量探索和尝试,但在具体落地实践微服务的过程中还缺乏实际的设计思路和实现方案。《Spring Cloud与Docker微服务架构实战》从微服务设计原则和理念出发,详细说明了如何通过SpringCloud及Docker建立高效可用的微服务解决方案,并对SpringCloud的架构及组件、容器镜像的制作与编排进行逐一讲解,具备较强的实战指导意义。《Spring Cloud与Docker微服务架构实战》能够帮助技术人员快速了解和应用微服务,通过技术的变革与提升帮助业务适应市场的快速变化,从而提升技术的价值。
廖俊杰,广发银行IDC团队负责人
序5
随着微服务架构提出和广泛流行,SpringCloud提供了一套完整的微服务解决方案。目前国内已经有众多公司生产大规模地SpringCloud解决IT架构、提高生产力。相信在1-3年内,SpringCloud无疑是Java企业级微服务应用之中的霸主。在《SpringCloud与Docker微服务架构实战》一书中,作者由浅入深的对SpringCloud的主要常用组件进行案例剖析和精彩讲解,让读者能快速上手,快速搭建基于SpringCloud的微服务应用。
许进(xujin.org)SpringCloud中国社区创始人,中间件高级研发工程师
序6
周立在写完《Spring Cloud与Docker微服务架构实战》初稿后,我第一时间拿到了初稿,从零学习了SpringCloud,SpringCloud提供了构建分布式系统所需的“全家桶”。如果你想从零搭建一套分布式系统,《Spring Cloud与Docker微服务架构实战》可以作为你的领路者,带你进入springcloud的世界。
张开涛
序7
在Spring尚未出现的“蛮荒”时代,Java程序员们还在迷茫地创造着各种“语法糖”来试图提高生产效率。然而无论怎么努力,Java语言仍被许多人冠以“裹脚布”的名号——毕竟你一不小心就会把它写的又臭又长。
随着Spring体系的出现与逐步完善,似乎有一种经历着Java工业革命的感觉。的确,任何事物都各有利弊,但我仍然想说,Spring团队给Java程序员们带来了春天(就像它的名字一样),它神奇地把“裹脚布”变成了“丝绸”,因为它最大的特质可以用两个字来形容——优雅。相信使用过SpringFramework、SpringMVC、SpringData、SpringBoot或SpringCloud等一系列框架,并研读过它们源代码的人,都能够体会到“优雅”二字的含义。
尽管Spring家族拥有如此多而美好的大块“语法糖”,但它们过去在国内的传播似乎都不怎么顺利。我经常说,国内对新技术的广泛应用一般比国外要晚三到五年,无论后端、前端还是架构理念。这是许多因素导致的,比如信息闭塞、语言不通、甚至固步自封。我相信随着国内互联网人才越来越多,新技术应用的延时一定会越来越短。或许很多人为了旧系统的稳定而不愿升级,这可以理解,但我希望人们可以拥抱新的事物,而不是排斥。现如今微服务架构理念兴起,人们急需一个快捷、稳定、一站式的分布式微服务解决方案,SpringCloud正是为此而诞生。可国内熟知SpringCloud的人目前仍寥寥无几,大部分人从未听说过,想要学习的人不知从何开始,对官方的英文文档也一知半解。人们需要一本能把他们领进SpringCloud这扇门的“红宝书”,这便是《Spring Cloud与Docker微服务架构实战》的目的,也是《Spring Cloud与Docker微服务架构实战》作者周立的初衷——希望能够为减少国内新技术的延时而出一份力。
我与周立在2016年相识,在短暂的交流后我们都产生了相见恨晚的感觉。遇见志同道合的人并不容易,我们的技术理念很相似。他有着对技术的热忱、灵活的头脑、以及开源分享技术的无私精神,正是这股精神促使他做了许多分享技术的事情,并且编写了这《Spring Cloud与Docker微服务架构实战》(相信我,写书并不赚钱)。我十分欣赏周立身上的这些特质,因此当他跟我提到想出书并找我帮忙时,我毫不犹豫地答应了他。我相信他未来能够成为某一技术领域的专家,这是他的目标,他也具备这样的潜质。
《Spring Cloud与Docker微服务架构实战》的切入点也非常好,它并不纠结于冗长的源码解读或原理解释,而是更多地注重实战,这在如今互联网爆炸式发展的时代相当重要。现在人们更倾向于使用敏捷开发尽快做出产品来进行试错,并在后续版本中快速迭代。因此《Spring Cloud与Docker微服务架构实战》的实战经验在软件工程层面上会给予阅读者很大提升,它可以让你更快地搭建分布式微服务架构,然后把精力留在编写业务逻辑上,提高你的生产力,并最终做出更好的产品——这也是Spring团队一直希望达到的效果。
现在,让我们随《Spring Cloud与Docker微服务架构实战》进入SpringCloud的世界,一起感受它的优雅吧!
张英磊
2017年3月29日









