最近几年软件开发方法层出不穷,微服务作为一种主流的架构模式一直热度不减。为了帮助广大程序员们更好更快地理解微服务的概念,学习微服务在项目中的实践,本书全面阐述了微服务架构模式的特点、架构思路、设计理念、技术框架及具体的代码实战,以软件开发过程中遇到的各种疑难问题为切入点,逐步解析微服务架构是如何设计及解决这些问题的。书中使用主流技术框架进行演示,采用通俗易懂的图例和真实的项目事例来阐述遇到问题时的解决思路和做法,并附有具体的实践演示,读者可以跟随本书进行代码试验,理解并运用微服务技术架构的理解和运用,了解微服务的适应场景和优势。本书实用性强,是目前市面上关于微服务实践方面介绍得较为全面的书籍之一,适合想要了解和学习微服务的初、高级程序员和架构师等不同水平的读者阅读。
微服务是一种架构模式,但也不仅仅是一种架构模式,还涵盖了众多的软件开发方法和技术,又代表着敏捷的开发体系,提倡重构和持续演进,对于开发、测试、运维等有着不同的要求。
同时,它可能还需要更加复杂的设计方法,更加轻量的协议,甚至还会影响组织或团队的规模和结构,可能给团队带来技术栈的“爆炸”。在这个技术浮躁的年代,对于已经成为主流的微服务架构,我们应该如何面对?微服务到底是什么,一直众说纷纭,我们只知道各大企业纷纷追捧和实践微服务架构,有的项目可能使用了Spring Cloud就算是使用微服务了,然后说微服务就是Spring Cloud,有的系统可能越做越像SOA,然后说微服务就是SOA的一种,还有的把自己的应用拆分,然后觉得把应用拆分成小块就是微服务。并不是说以上说法都是错的,但行业里确实还没有一个标准的试金石来验证微服务的好与坏,微服务的“酸甜苦辣”可能只有用过了才知道。
其实,每个新概念的出现都填补了一些空白领域,每个新技术的产生都有它擅长解决的问题,每个语言的发明都有它专注处理的场景。软件开发的世界就是这样,我们会遇到各式各样的麻烦,会蹚过数不清的坑,会学习学不完的框架,甚至有的技术还没有搞清楚原理就已经被淘汰了,但我们仍然乐此不疲。很多年前笔者就听说过“微服务”的概念,但一直没有合适的机会和方法去系统地学习微服务,好在根据多年工作经验的积累,从不同的项目实践中慢慢总结了一些微服务的经验。不敢说全部都是绝对的权威理论,但大多都是从真实的实战场景出发,以解决问题为导向慢慢推演出的架构模式。本书旨在为广大读者介绍一个较为全面的微服务开发体系。受作者水平和成书时间所限,本书难免存有疏漏和不当之处,敬请指正。
本书内容及体系结构
微服务概述微服务并不是一个新的概念,但从提出至今一直热度不减,而且随着技术的不断创新,不同的技术团队会产生不同的理解,这也导致了好像大家都在做微服务,也都想做好微服务,但具体的软件设计或架构实践会有很多的不同,本章就深入探讨到底什么是微服务。
微服务架构设计微服务架构有两个难点:一是微服务架构本身核心组件的落地设计,即技术实现;二是微服务在物理上的层次结构和拆分设计。这两点是实现微服务架构设计成功的关键因素,本章将详细介绍微服务架构的核心架构。
Spring Cloud相关组件很多人都觉得使用了Spring Cloud就是用了微服务,虽然SpringCloud并不能代表微服务的全部,但是通过学习Spring Cloud,确实可以更加深入地了解微服务的理念和实践,如海量服务的容错问题、雪崩问题、配置和监控问题、日志追踪问题等,本章将介绍SpringCloud的相关微服务组件,学习使用Spring Cloud解决这些问题的方法。
契约测试微服务架构中最常见的就是远程调用,如服务和服务之间的远程调用,前端和后端的远程调用,BFF和服务的远程调用,等等。当系统体量越来越大时,如何保证服务间调用关系的正确性?哪个接口会影响到哪个调用者?这就需要一个自动的方法来帮助人们测试接口的可靠性,这就是契约测试。
API网关网关的英文是Gateway,翻译为门、方法、通道、途径。网关就是接口的通道或接口的大门,要想访问API,就必须通过API网关,那为什么要有API网关,这么做有什么作用呢?本章将详细介绍微服务架构中API网关的作用和具体用法。
BFF用于前端的后端随着前端技术的大爆发,面对逐渐复杂化的前端工程体系,越来越多的企业开始采用前后端分离的开发模式。随着微服务模式的流行,前后端的交互也变得越来越复杂,如大量接口的组合、复杂的配置、重复的代码等问题使前后端的开发者饱受折磨。于是,一个新的模式诞生了,BFF用于前端的后端。越来越多的项目开始采用BFF模式,本章将详细介绍BFF模式的具体实践用法。
领域驱动设计近几年来,随着微服务的流行,一个新的软件设计方法逐渐流行起来,这就是领域驱动设计。当我们有了众多的技术框架和架构模式时,具体去落地实施一个微服务项目的难处似乎并不仅仅体现在软件技术上,例如,我们该如何设计微服务的软件模型和划分服务职责?本章将介绍领域驱动设计这一新兴的科学设计方法。
Docker和K8s提到微服务,首先想到的是服务很小、职责很小,那如果是一个庞大复杂的系统,我们必然会建立很多的微服务,而且服务都是可以水平扩展的,在一些大型的互联网企业,一个服务的数量可能是成百上千的,那么部署和管理这些服务就成了一个难题。本章将介绍服务容器化部署的相关知识。
持续集成、部署与交付虽然第8章中提到了使用容器化技术的部署方式,但似乎和微服务定义中的自动化没什么关系,本章将介绍自动化部署和快速交付的相关概念与方法案例,同时思考微服务项目中需要自动化部署机制的原因。
任务管理在软件开发过程中,无论是项目还是产品都有着自己的独特性,不可能所有的项目都千篇一律,我们会遇到各种各样的场景,除了一些宏观的架构和设计,微服务架构在技术细节上也有很多需要注意的地方,如任务管理,当然这可能是一些分布式架构的特性,而不仅限于微服务架构,本章将介绍一些微服务架构下任务管理的实践。
事务管理事务管理一直都是软件开发中的难点,即使很多优秀的框架能够帮助我们处理一些简单的逻辑,如在单体式架构中使用AOP的事务管理框架来管理事务,但在微服务架构下,事务管理的需求与复杂度都比单体式架构更高。那么,在微服务中应该如何管理事务呢?本章将介绍事务管理的方式和方法。
传统架构的微服务转型之路虽然微服务的浪潮越来越热,但是软件工程这么多年来,还是产生了大量传统架构的系统,面对已经存在了多年的老项目,系统性能越来越差,想要扩展又显得捉襟见肘,想要做微服务架构转型也处处受限,很多项目团队甚至直接选择丢弃老的系统,重新开发新的系统。那么,当我们面对技术陈旧、业务庞杂、技术债众多的老旧系统时,该如何实现微服务的转型呢?本章将告诉大家从现有传统架构向微服务架构转型的思路和过程。
• 想要学习和了解微服务的人
• 已经了解微服务想要查漏补缺的人
• 初、中、高级程序员• 软件架构师
• 对软件架构有兴趣的各类人员
◎ 微服务的概念
◎ 微服务与SOA
◎ 单体式架构
◎ 微服务架构概述
◎ 微服务的挑战
笔者在职业早期曾被教导,做一件事最好能理论先行。虽然现实中理论和实际应用会有很大的差距,但是经验告诉我们,理论不仅可以帮助我们更系统地理解事物的本质,而且能科学地选择事情的发展方向。
微服务并不是一个新的概念,从其提出至今热度一直不减,而且随着技术的不断创新,不同的技术团队会产生不同的理解,这也导致了大家都在做微服务,也都想做好微服务,但具体的软件设计或架构实践有很多不同。
关于最早的微服务概念有很多版本,据说50年前就已经开始使用微服务的概念了,如UNIX的管道设计其实就是微服务设计的一种体现,还有后续提出的面向服务架构(
ServiceOrientedArchitecture,SOA)、企业服务总线(Enterprise Serice Bus,ESB)等概念,都是微服务的一种。
其实,微服务相对比较正式地被提出是在2011年威尼斯举办的一个软件架构师研讨会上,“微服务”被描述为一种提供微小服务的软件架构,在不到一年的时间里,各路大咖开始定义自己理解的微服务。后来,关于微服务的讨论和实践迅速扩散至整个行业,各大公司相继研发了自己的微服务技术框架,打造自己的微服务体系和生态。一个简单的微服务架构示意图如图1.1所示。
介绍到这里,大家对微服务的理解可能还是一知半解,那么不妨来看看微服务不是什么,也许可以帮助我们更好地理解微服务的概念。这里主要给大家比较面向服务架构(SOA)和单体式架构,这两种架构在微服务被提出之前流行了相当长的时间,而且单体式架构在一些中小型项目中仍然占据很重要的地位。
关于微服务讨论最多的就是SOA,有人说微服务就是SOA的衍生版,也有人说SOA包括微服务,当然,也有相当数量的人认为微服务和SOA完全不一样。那么,微服务与SOA到底有什么关系呢?
SOA(Service-Oriented Architecture,面向服务架构)是一种粗粒度的、松耦合的、面向服务的架构,在架构中使用一个标准的通信协议,通过网络提供应用程序的业务功能服务,且服务都是完全独立部署和维护的,并且可以组合使用。一个SOA的服务应该有以下几个特点。
(1)逻辑上代表某项具有指定结果的业务活动。
(2)服务是独立的。
(3)对消费者而言,服务是黑盒的(黑盒是指一个只知道输入输出关系而不知道内部结构的系统或设备)。
(4)一个服务可以包含其他基础服务,一个SOA服务可以组合其他服务使用。
例如,某商城的SOA示意图如图1.2所示。
从图1.2中可以看出,SOA的几个特点还是很明显的。首先,每个服务都代表着一个业务活动;其次,每个业务活动都是相对独立的,并且通过一个统一的数据总线进行交互;最后,一个服务可以包含多个基础服务。这样看来,SOA似乎和微服务不太一样,虽然概念看起来很相似,但为什么实际架构会有这么大的差别呢?下面将仔细梳理两者的概念,看看概念上是否真的相似。
无论是从架构图出发,还是从核心概念相比,经过仔细对比后发现,微服务与SOA的概念异同点如下。
(1)服务都是独立运行和部署的。
(2)对消费者而言,服务都是黑盒的。
(3)服务都是通过网络通信的。
(1)微服务间的通信是轻量级的,既可以是不统一标准的,也可以是跨语言的。
(2)微服务是围绕业务功能设计的,但往往不能代表一项完整的业务活动,在服务划分上比SOA的粒度更细、更微小。
(3)SOA可以包含其他基础服务,而微服务本身可以调用其他服务,但不会包含或组合其他服务。两者相比较,微服务更像是基础服务。
概念上的不同导致了两者的发展方向完全不同。SOA更强调两点:一是业务封装;二是统一标准。一个SOA的服务往往包容一套完整的基础业务服务,提供统一对外接口,关于该业务所有的功能都可以通过这个服务来提供。而微服务可能更强调拆分,每个服务都是细粒度的、独立的存储方式,可以轻量级的进行通信,也可以跨语言。战略设计的不同导致了微服务和SOA在实际运用中的架构方式渐行渐远。
在一套SOA下的所有服务会定义一个统一的服务标准,消费者也需要遵守相应的标准才能调用相应的服务,这也导致SOA的整体架构显得有些笨重,无论是在原有SOA的体系下开发一个新的服务,还是集成已有的SOA服务,都需要做很多额外的工作。例如,无论是服务提供方还是调用者,都要遵循这个标准去开发统一的接口和客户端,而这样做往往会限制服务双方的技术选型。
那么,这个标准到底是怎样的呢?这里就不介绍具体的SOA接口标准的某个技术实现了,毕竟本书的重点是微服务,感兴趣的读者可以自行学习SOA具体实践。
SOA的服务调用标准提出了3个核心概念,即服务提供者、服务消费者和服务注册,应用程序可以通过服务注册中心来管理服务提供者的服务信息,服务提供者可以主动向服务注册中心注册自己的服务信息,而服务消费者可以从服务注册中心订阅服务信息,服务注册中心通过消息等方式通知与服务消费者相关的服务提供者的注册信息,SOA服务调用设计图如图1.3所示。
笔者认为SOA的设计精华就在图1.3中,不管微服务是否属于SOA,它也采用了这一设计,可以说微服务和SOA在战术设计上是类似的,但由于战略设计的不同,微服务后来选择了更轻量级的技术实现。或许大家不是很明白,下面举例说明,服务注册与发现实例图如图1.4所示。
一个公司往往有自己的OA系统,而OA系统中有一个最常用的功能——通讯录,通讯录里存储着公司员工的通信方式,如邮件、电话、地址等。当员工的通信信息有变动时,员工会主动在通讯录中更新自己的信息;当新员工入职或老员工离职时,也会有专人新增和删除通讯录中的员工信息。
这时,如果部门秘书给部分人发送邮件,传达部门经理的一些工作任务安排,他(她)可以通过通讯录来查询这些人的邮箱信息,得到邮箱地址信息后,就可以发送邮件了。此时,这个部门秘书就相当于服务消费者,通讯录就好比服务注册中心,而每个员工就是各个服务的提供者。
当然,关于服务注册与发现在实际应用中的场景可能远比这个复杂,功能也更多,这里的例子可能不太恰当,但也能反映最基础的服务处理过程,希望能够帮助大家更快地理解这些概念。
了解了SOA的设计理念后,回到最初的问题,微服务与SOA到底是什么关系呢?微服务是SOA的衍生吗?可能是因为SOA的提出早于微服务近10年,并且运用了很多年,而且微服务的设计方式确实与SOA的一些设计相似,所以很多人都认为SOA的概念应该包含微服务,或者微服务本身就是一种SOA的变体。
但事实上大多数的时候被称为“SOA”的东西与本书中所描述的微服务有很大不同,最常见的例子就是ESB(Enterprise Service Bus,企业服务总线),这里对ESB不做介绍。总之,ESB是一个不太好的实现,完全的服务导向和过度的追求标准化带来了更多的复杂性和技术瓶颈,也许SOA设计之初和现在的微服务目标或倡导的概念类似,但其后来在战略上的偏执,导致了实施者过度关注于技术和标准,忽略了真正的业务价值,最终导致SOA慢慢被微服务所取代。战略思想上的不一致也导致那些致力于敏捷的微服务拥护者完全拒绝给微服务加上SOA的标签。
所以,笔者更倾向于把微服务当作一个独立的新概念,用微服务来定义这种新的架构风格,以区别于SOA的设计体系。
上面介绍的是与SOA相似的架构模式,下面介绍一个完全相反的架构模式,即单体式架构。该架构模式至今仍在软件架构的舞台上占据着相当大的位置。下面通过分析传统的单应用架构模式,帮助我们更清楚地了解微服务的设计意图。
◎ 微服务架构的难点
◎ 架构设计
◎ 微服务的核心组件
微服务架构有两个难点:一是微服务架构本身的核心组件的落地设计,即技术实现;二是微服务在物理上的层次结构和拆分设计,这也是微服务架构设计是否成功的关键因素。
◎ 统一配置中心
◎ 断路器
◎ 健康监控
◎ 分布式链路跟踪
第2章中介绍了微服务的核心技术及相关的技术实现,服务的远程调用和服务的注册发现是微服务的两大核心架构组件,当有了这两个功能,服务消费者就可以动态地发现和剔除服务提供者,并且可以设置适合的负载均衡策略,灵活地选择需要调用的服务器。这虽然已经可以满足微服务一些基础的日常功能要求,但也没有这么简单,还存在一些如海量服务的容错问题、雪崩问题、配置和监控问题、日志追踪问题等。本章将介绍SpringCloud的相关微服务组件,以及解决这些问题的方法。
◎ 契约测试概述
◎ 契约测试与TDD
◎ 契约测试与独立交付
◎ 契约测试的相关技术与用法实战
在微服务架构中最常见的事情就是远程调用,如服务和服务之间的远程调用,前端和后端之间的远程调用,BFF和服务之间的远程调用,等等。当一个服务的接口发生变化时,依赖它的消费者也需要进行相应的调试或修改,如果这个过程采用口口相传或文件通知的办法,就会很低效,而且容易遗漏。在大多数时候服务端并不能清楚地知道全部的消费者有哪些,哪个接口会影响哪个消费者。这时就需要一种自动的方法来帮助我们测试接口的可靠性,这就是契约测试。
◎ API网关的意义
◎ API网关的职责
◎ API网关的缺点
◎ 使用API网关认证身份
◎ API网关技术实战
网关的英文是Gateway,翻译为门、方法、通道、途径。API网关就是接口的通道或接口的大门。要想访问API,就必须通过API网关,为什么要有API网关,这样做有什么作用?带着这些问题,我们来学习本章的内容。
内容一共12章,实在是太多了我就不一一展示出来了
这份手册完整版已经给大家整理到网盘了,需要获取的小伙伴可以直接转发+关注后私信(资料)即可免费获取!