前言
伴随着互联网发展,个人计算机、手机和平板电脑等设备走进了我们的生活。现今我国互联网的普及率已经很高,但应用发展的空间还是很大,接下来就到了互联网的深耕阶段,这就导致对互联网系统的要求必然是大数据、高并发和快响应。在这个趋势下,单机系统已经很难满足互联网企业的这些要求,所以分布式系统是必然的发展方向。
所谓的分布式系统,就是一组计算机为了共同完成业务功能通过网络协作的多节点系统。分布式系统本身也有一系列需要解决的问题,包括多个计算机节点的路由选择、各个服务实例的管理、节点监控、节点之间的协作和数据一致性等,当然还有网络故障、丢包等问题。分布式系统的实施难度比单机系统大得多。
分布式系统比单机系统复杂得多,但经过多年的发展,业界已经有了丰富的分布式系统理论,也有了许多优秀的组件。在分布式系统理论里,最近流行的微服务架构理论成了佼佼者,微服务的概念也成了当前分布式系统实现方案中的主流,显然,微服务架构成了分布式系统的一种形式。优秀的分布式系统组件早期主要以国内阿里巴巴的Dubbo(现今已经被Apache归纳进入其孵化器)为主,后来从国外引入了Spring Boot和Spring Cloud,它们现在是微服务实现的主流方案。
为顺应技术的发展趋势,我对微服务进行了深入的学习和研究,并且于2018年创作出版了《深入浅出Spring Boot 2.x》。为了更进一步地讲解微服务,满足当前企业搭建微服务系统的需要,我竭尽所能编写了这本关于Spring Cloud的书。虽然Spring Cloud能够有效搭建微服务系统,但微服务系统只是分布式系统的一种形式,它并不能解决分布式系统的所有问题,例如,分布式缓存、会话、数据库及其事务等,都不能通过Spring Cloud来有效处理。但这些问题又是企业实施微服务系统时必须要面对的,甚至是一些企业的难点和痛点。因此,本书在详细介绍Spring Cloud的基础上,还会对常用的分布式技术进行讲解,以满足企业的需要。
应该说微服务系统只是在丰富的经验和实践中积累的组件,一切都还在快速发展和变化中,若读者关注Spring Boot和Spring Cloud的版本就会发现,其版本更替相当频繁。应该说分布式(微服务)系统没有绝对的权威,也没有绝对的形式,正如《孙子兵法》中所言:“兵无常势,水无常形,能因敌变化而取胜者,谓之神。”我们只能按照自己的业务需求来决定分布式(微服务)的实施方案。我编写本书的目的是,让读者通过学习前人的经验,吸取已有的教训,采用一些优秀的组件,就能快速便捷地搭建微服务系统,避免掉入陷阱中。
为什么选择Spring Cloud
国内流行的早期的微服务解决方案是阿里巴巴的Dubbo,但这是一个不完整的方案,当前Spring Cloud已成为业界流行的微服务搭建方案。因此,本书以讲解Spring Cloud为主。
Pivotal团队收集了各个企业成功的分布式组件,用Spring Boot的形式对其进行封装,最终得到了Spring Cloud,简化了开发者的工作。Spring Cloud当前主要是通过Netflix(网飞)公司的组件来实施微服务架构,但是因为Netflix的组件更新较慢(如Zuul 2.x版本经常不能如期发布,最后取消),并且只按自身企业需要进行更新(如Hystrix停止增加新功能),所以Spring Cloud有“去Netflix组件”的趋势。不过,“去Netflix组件”也需要一定的时间,所以当前还是以Netflix组件为主,这也是本书的核心内容之一。从另外一个角度来看,组件的目的是完成分布式的某些功能,虽类别不同但思想相近,也就是“换汤不换药”。因此,现在学了Netflix组件,即使将来不再使用,也可以吸收其思想和经验,通过这些来对比将来需要学习的新组件,也是大有裨益的。
为什么还要讲微服务之外的分布式系统的知识
在编写本书的时候,我考虑了很久,除了Spring Cloud微服务的内容外,还要不要加入其他分布式系统的内容,如分布式发号机、分布式数据库、分布式事务和缓存等。加入这些内容,本书似乎就没有鲜明的特点了,内容会显得有点杂;不加入这些内容,企业构建分布式系统的讲解就会不全面。
反复思考之后,我最终决定将一些常用的分布式知识也纳入本书进行讨论。换一个角度来考虑,微服务作为分布式系统的一种,其自身也是为了简化分布式系统的开发,满足企业生产实践的需要,同样,加入这些知识的讲解也是为了让企业能更好地搭建网站,和微服务架构的目的是一致的。
内容安排
本书基于一线企业的实际应用需求,介绍Spring Cloud微服务和常用的分布式系统。整体来说,全书分为4个部分。
●第一部分介绍分布式系统的概念、分法和优缺点,提出微服务的概念,对Spring Cloud、Spring Boot和REST风格进行简单的介绍。
●第二部分介绍Spring Cloud的各类组件,这是微服务的核心内容。介绍的组件包括服务注册和服务发现(Eureka)、服务调用(Ribbon和OpenFeign)、断路器(Hystrix和Resilience4j)、网关(Zuul和Gateway)、配置(Config)、全链路追踪(Sleuth)、微服务的监控(Admin)等。
●第三部分讲解分布式的其他知识,包括分布式发号机、分布式数据库、分布式缓存、分布式会话和权限等。
●第四部分通过Apache Thrift讲解远程过程调用(RPC),并且讲解在分布式中处理高并发的一些常用技巧,最后给出一个微服务实例。
排版约定
为了方便读者阅读,本书做了如下约定。
●import语句一般不出现在代码中,一般会以“/**** imports ****/
”进行代替,这样主要是为了缩减篇幅,读者可以使用IDE自动导入的功能进行导入。
●对于普通的POJO,我大部分都会以“/**** setters and getters ****/
”代替POJO的setter和getter方法。约定后的代码呈现类似下面这样:
package com.spring.cloud.chapter0.pojo /**** imports ****/ public class Role { private Long id; private String roleName; private String note; /**** setters and getters ****/ }
●读者可以用IDE生成这些属性的setter和getter方法,这样做主要是为了减小篇幅,突出重点,也便于读者的阅读。
●在默认情况下本书使用常用的MySQL数据库,如果使用其他数据库会事先说明。
●本书采用的Spring Boot版本为2.1.0,Spring Cloud的版本为Greenwich.RELEASE,如果需要使用别的版本会特别说明。
目标读者
阅读本书需要读者事先掌握Java EE基础、Spring Boot、数据库和Redis的相关知识。
阅读本书,读者除了可以学到通过Spring Cloud构建企业级微服务系统的方法,还可以学到一些常用的分布式方面的知识。因此,本书适合想要学习Spring Cloud微服务、分布式系统开发的各类Java开发人员阅读,包括初学者和开发工程师。本书对架构师也有一定的帮助。
致谢
本书的成功出版,要感谢人民邮电出版社的编辑们,没有他们的辛苦付出,就没有本书的顺利出版,尤其是杨海玲编辑,她在我的写作过程中给了我很多的建议和帮助,帮助我审阅了全稿,修正了不少错误。感谢他们付出的劳动。
感谢我的家人对我的支持和理解,当我在电脑桌前编写代码时,牺牲了很多本该好好陪伴他们的时光。
纠错、源码和课程
互联网技术博大精深,而且跨行业特别频繁,涉及特别多的技术门类,再有,技术更新较快(撰写本书时,我就遇到了这样的困难,例如Spring Cloud和Spring Boot的更新十分频繁),而且内容繁复。因个人能力有限,我只能尽力而为。但是,正如没有完美的程序一样,也没有完美的书,一切都需要完善的过程。尊敬的读者,如果您对本书有任何意见或建议,欢迎您发送邮件(ykzhen2013@163.com)与我联系,或者在我的博客上留言。
杨开振
2019年12月