《高可用可伸缩微服务架构》试读第一章1.6:架构的不同风格

1.6 架构的不同风格

典型的企业级应用系统或者互联网应用系统一般都是通过Web提供一组业务服务能力。这类系统包括提供给用户操作的、运行于浏览器中、具有UI的业务逻辑展示和输入部分,运行于服务器端、用后端编程语言构建的业务逻辑处理部分,以及用于存储业务数据的关系数据库或其他类型的存储软件。

根据软件系统在运行期的表现风格和部署结构,我们可以粗略地将其划分为两大类:

1) 整个系统的所有功能单元,整体部署到同一个进程(所有代码可以打包成1个或多个文件),我们可以称之为“单体架构”(Monolithic Architecture);

2) 整个系统的功能单元分散到不同的进程,然后由多个进程共同提供不同的业务能力,我们称之为“分布式架构”(Distributed Architecture);

任何一个体系(产品、平台、商业模式等)如果想要发展壮大,途径只有两个模式:

a) 容器模式:从外部提供越来越多的资源和能力,注入到体系的内部,不断的从内扩充自己。单体架构的系统类似这种模式。

b) 生态模式:以自己的核心能力为内核,持续的在外部吸引合作者,形成一个可以不断成长的生态体系。分布式架构越来越像这种模式。

再结合软件系统在整个生命周期的特点,我们可以进一步区分不同的架构风格。

对于单体架构,我们根据设计期和开发实现期的不同模式和划分结构,可以分为:

  • 简单单体模式:代码层面没有拆分,所有的业务逻辑都在一个项目(project)里打包成一个二进制的编译后文件,通过这个文件进行部署,并提供业务能力;

  • MVC模式:系统内每个模块的功能组件按照不同的职责划分为模型(Model)、视图(View)、控制器(Controller)等角色,并以此来组织研发实现工作;

  • 前后端分离模式:将前后端代码耦合的设计改为前端逻辑和后端逻辑独立编写实现的处理模式;

  • 组件模式:系统的每一个模块拆分为一个子项目(subproject),每个模块独立编译打包成一个组件,然后所有需要的组件一起再部署到同一个容器里;

  • 类库模式:A系统需要复用B系统的某些功能,这时可以直接把B系统的某些组件作为依赖库,打包到A系统来使用。

对于分布式架构,我们根据设计期的架构思想和运行期的不同结构,可以分为:

  • 面向服务架构(Service Oriented Architecture,SOA):以业务服务的角度和服务总线的方式(一般是WebService与ESB)考虑系统架构和企业IT治理;

  • 分布式服务架构(Distributed Service Architecture,DSA):基于去中心化的分布式服务框架与技术,考虑系统架构和服务治理;

  • 微服务架构(MicroServices Architecture,MSA):微服务架构可以看做是面向服务架构和分布式服务架构的拓展,使用更细粒度的服务(所以叫微服务)和一组设计准则来考虑大规模的复杂系统架构设计。

此外,传统的企业集成领域的EAI架构模式,本身还是各个系统独立部署,但是各系统之间的部分业务使用特定的技术打通了,因此我们可以看做是单体和分布式之间的过渡状态。

也有人把如上的各个架构风格总结为4个大的架构发展阶段,如图1-6所示:

1)单体架构阶段

2)垂直架构阶段

3)SOA架构阶段

4)微服务架构阶段

微服务架构发展阶段

图1-6

1.6.1 单体架构:简单单体模式

简单单体模式是最简单的架构风格,所有的代码全都在一个项目中。这样研发团队的任何一个人都可以随时修改任意的一段代码,或者增加一些新的代码。开发人员也可以只在自己的电脑上就可以随时开发、调试、测试整个系统的功能。也不需要额外的一些依赖条件和准备步骤,我们就可以直接编译打包整个系统代码,创建一个可以发布的二进制版本。这种方式对于一个新团队的创立初期,需要迅速开始从0到1,抓住时机实现产品最短时间推向市场,可以省去各种额外的设计,直接上手干活,争取了时间,因而是非常有意义的。

但是这种简单粗暴的方式对于一个系统的长期稳定发展确实有很多坏处的。但是正如一个新出生的小动物野蛮生长,如果没有正确的教导和规则的约束,最后成为一个忠实的导盲犬还是一条携带病毒的狂犬,就不得而知了。

首先,简单单体模式的系统存在代码严重耦合的问题。所有的代码都在一起,就算是按照package来切分了不同的模块,各不同模块的代码还是可以直接相互引用,这就导致了系统内的对象间依赖关系混乱,修改一处代码,可能会影响一大片的功能无法正常使用。为了保障每次上线时的可靠性,我们必须花费很多的精力做大量的回归测试,对于经常需要修改维护的系统,这种代价是可怕的。

第二,简单单体模式的系统变更对部署影响大,并且这个问题是所有的单体架构系统都存在的问题。系统作为一个单体部署,每次发布的部署单元就是一个新版本的整个系统,系统内的任何业务逻辑调整都会导致整个系统的重新打包,部署、停机、再重启,进而导致了系统的停机发布时间较长。每次发布上线都是生产系统的重大变更,这种部署模式大大提升了系统风险,降低了系统的可用性。

第三,简单单体模式的系统影响开发效率。如果一个使用Java的简单单体项目代码超过100万行,那么在一台笔记本电脑上修改了代码后执行自动编译,可能需要等待十分钟以上,并且内存可能不够编译过程使用,这是非常难以忍受的。

第四,简单单体模式打包后的部署结构可能过于庞大,导致业务系统启动很慢,进而也会影响系统的可用性。这一条也是所有单体架构的系统都有的问题。

第五,扩展性受限,也是所有单体架构的一个问题。如果任何一个业务存在性能问题,那么都需要考虑多部署几个完整的实例的集群,或者再加上负载均衡设备,才能保证整个系统的性能可以支撑用户的使用。

所以,简单单体模式比较适用于规模较小的系统,特别是需要快速推出原型实现,以质量换速度的场景。

1.6.2 分布式架构:面向服务架构(SOA)

随着IT技术逐渐成为各行各业的基础性支撑技术之一,并且很多大型公司内部的IT系统规模越来越大,传统架构思想的不足越来越明显。针对如何更好的利用企业内部的各个IT系统能力,解决数据孤岛问题,整合业务功能,先是出现了企业应用集成(Enterprise Application Integration,EAI)解决方案,即通过对现有各系统的数据接口改造,实现系统互通(特别是异构系统),这样不同系统的数据就可以被整合到一起了。在大量的EAI项目实施的基础上,架构设计关注的不仅仅是单个的项目,而是企业的整个IT系统集合。架构师们以超越单体架构的分布式思想和业务服务能力的角度来看待问题,这样面向服务架构即SOA就发展起来了。

2006年IBM、Oracle、SAP、普元公司等一起建立了OSOA联盟,共同制定 SCA/SDO标准。2007年4月,国际标准组织OASIS宣布成立OASIS Open Composite Services Architecture (Open CSA) 委员会,自此,OSOA的职能移转至Open CSA组织。

SOA的概念最初由Gartner公司提出,2000 年以后,业界普遍认识到SOA思想的重要性。从2005年开始,SOA推广和普及工作开始加速,几乎所有关心软件行业发展的人士都开始把目光投向SOA,各大厂商也通过建立厂商间的协作组织共同努力制定中立的SOA标准:SCA/SDO规范。同时产生了一个Apache基金会顶级项目Tuscany作为SCA/SDO的参考实现。SCA和SDO构成了SOA编程模型的基础。经过10多年的广泛探索研究和实际应用,SOA本身的理论、相关技术、工具等也已经发展到成熟、稳定的阶段,在信息化系统建设时普遍采用了SOA架构思想。

1.6.2.1 服务与SOA

面向服务架构(SOA)是一种建设企业IT生态系统的架构指导思想。SOA的关注点是服务。服务最基本的业务功能单元,由平台中立性的接口契约来定义。通过将业务系统服务化,可以将不同模块解耦,各种异构系统间可以轻松实现服务调用、消息交换和资源共享。

1) 从宏观的视角来看,不同于以往的孤立业务系统,SOA强调整个企业IT生态环境是一个大的整体。整个IT生态中的所有业务服务构成了企业的核心IT资源。各系统的业务拆解为不同粒度和层次的模块和服务,服务可以组装到更大的粒度,不同来源的服务可以编排到同一个处理流程,实现非常复杂的集成场景和更加丰富的业务功能。

2) 从研发的视角来看,系统的复用可以从以前代码级的粒度,扩展到业务服务的粒度;能够快速应对业务需求和集成需求的变更。

3) 从管理的角度来看,SOA从更高的层次对整个企业IT生态进行统一的设计与管理,对消息处理与服务调用进行监控,优化资源配置,降低系统复杂度和综合成本,为业务流程梳理和优化提供技术支撑。

在SOA体系下,应用软件被划分为具有不同功能的服务单元,并通过标准的软件接口把这些服务联系起来,以SOA架构实现的企业应用可以更灵活快速地响应企业业务变化,实现新旧软件资产的整合和复用,降低软件整体拥有成本。

1.6.2.2 SOA战略

SOA的实施对整个IT生态环境都有重要的影响,作为一种重大的IT变革和技术决策,必然要自上而下的进行。必须获得管理层的支持,由技术决策层面直接推动,并和技术部门、相关业务部门一起,根据目前各个IT业务系统的现状,统一规划SOA战略和分阶段目标,制定可行方案与计划步骤,逐步推进实施。

1.6.2.3 SOA落地方式

SOA的落地方式与水平,跟企业IT特点、服务能力和发展阶段直接相关。目前常见的落地方式主要有分布式服务化和集中式管理两种。

1) 分布式服务化
互联网类型的企业,业务与技术发展快,数据基数与增量都大,并发访问量高,系统间依赖关系复杂、调用频繁,分布式服务化与服务治理迫在眉睫。通过统一的服务化技术手段,进一步实现服务的注册与寻址、服务调用关系查找、服务调用与消息处理监控、服务质量与服务降级等等。现有的一些分布式服务化技术有dubbo(基于java)、finagle(基于scala)和ICE(跨平台)等。

2) 集中式管理化
传统企业的IT内部遗留系统包袱较重,资源整合很大一部分是需要打通新旧技术体系的任督二脉,所以更偏重于以esb作为基础支撑技术,以整合集成为核心,将各个新旧系统的业务能力逐渐的在ESB容器上聚合和集成起来。比较流行的商业ESB有IBM的WMB和oracle的osb,开源esb有mule、servicemix、jbossesb、wso2esb和openesb。

商业的esb,一般来说除了功能丰富以外,配套设置都比较齐全,对于比较简单的场景来说可以做到开箱即用,维护性也比较强,但是一般来说过于复杂非常难用、内部基本是黑盒、而且很贵。
开源的esb,由于开发成本和通用性开放性的考虑,往往在esb server上做的比较强大、扩展性比较好,但是配套设置做的很差(这也是绝大多数开源项目共有的问题,不仅是开源esb的问题)。对企业来说可管理性非常重要,选择开源esb的话,这一块需要结合企业的实际情况,一步步的积累,下大功夫来自己做好。

一方面,集中式管理的SOA,其优势在于管理和集成企业内部各处散落的业务服务能力,同时一个明显的不足在于其中心化的架构方法,并不同解决各个系统自己内部的问题。另一方面,随着自动化测试技术、轻量级容器技术等相关技术的发展,分布式服务技术越来越像微服务架构方向发展。

EIP(Enterprise Integration Patterns,企业集成模式)是集成领域的圣经,也是各种MOM和ESB的理论基础。我们在MQ和ESB中常见的各种概念和术语,基本都是来自于EIP,比如消息代理、消息通道、消息端点、消息路由、消息转换、消息增强、信息分支、消息聚合、消息分解、消息重排等等,并在《企业集成模式:设计、构建及部署消息传递解决方案》一书中详细的描述了它们的内容与特点。

EIP的直接实现一般叫EIP框架,开源的知名EIP框架有两个:camel和spring integration。EIP可以作为ESB的基础骨架,在这个基础上填充其他必要的部分,定制出来一个ESB容器。

EIP的介绍可以看这里:http://www.enterpriseintegrationpatterns.com/

1.6.2.4 SOA的两大基石:RPC与MQ

SOA关注于系统的服务化,不同系统服务间的相互通信就成为了一个重要的话题。并且随着RPC和MQ技术的发展,这两种技术逐渐成为SOA的两大基石,也是分布式技术体系里的重要基础设施。

1) RPC(Remote Procedure Call,远程过程调用)
两个不同系统间的数据通信,往往可以通过socket+自定义数据报文来实现。但是这种方式比较繁琐,需要针对每个通信场景定义自己的数据格式和报文标准,甚至交互的行为、异常和错误的处理等等。有没有一种通用的技术手段呢?答案就是RPC技术。
RPC是一种通用性的系统通信手段,使得我们可以像调用本地方法一样调用远程系统提供的方法。
一个场景的RPC机制如图1-7:

RPC机制

图1-7

RPC的调用关系里,我们把提供具体的调用方法的系统叫服务提供者(Provider),调用服务的系统称为服务消费者(Consumer)。把对象转换为以便于网络传输的二进制或文本数据的过程,叫做序列化(Serialization);二进制或文本数据再还原为对象的过程,叫做反序列化(Deserialization)。
我们可以看到,典型的RPC处理机制包括两部分:

  • 通信协议,可以是基于tcp的,也可以是基于http的。
  • 数据格式,一般是一套序列化+反序列化机制。

常见的RPC技术有Cobra、RMI、.NET Remoting、WebService、JSON-RPC、XML-RPC、Hessian、Thrift、Protocol Buffer、gRPC等等。按照序列化机制的特点,我们可以把RPC技术分为文本的(WebService、JSON-RPC、XML-RPC等)和二进制的(RMI、Hessian、Thrift、Protocol Buffer等)。按照常见的通信协议来看,我们又可以分为基于HTTP的(WebService、Hessian等)和基于TCP的(RMI、.NET Remoting等)。按照是否可以用于多个不同平台,又可以分为平台特定的(RMI是Java平台特定的、.NET Remoting是.NET平台特定的)和平台无关的(比如WebService、JSON-RPC、Hessian等可以用于Java.Net\PHP\Python等就是平台无关的)。
在Java里,我们一般可以基于JDK自带的动态代理机制+Java的对象序列化方式实现一个简单的RPC,但是由于动态代理和Java对象序列化都比较低效,导致这种方式性能较低。目前更常见的是基于AOP和代码生成技术实现stub和skeleton,然后用一个紧凑的二进制序列化方式,实现一个高效的RPC框架。

按照调用方式来看,RPC有四种模式:

  • RR(Request-Response)模式,又叫请求响应模式,指每个调用都要有具体的返回结果信息。
  • Oneway模式,又叫单向调用模式,调用即返回,没有响应的信息。

  • Future模式,又叫异步模式,返回拿到一个Future对象,然后执行完获取到返回结果信息。

  • Callback模式,又叫回调模式,处理完请求以后,将处理结果信息作为参数传递给回调函数进行处理。

这四种调用模式中,前两种最常见,后两种一般是RR和Oneway方式的包装,所以从本质上看,RPC一般对于客户端的来说是一种同步的远程服务调用技术。与其相对应的,一般来说MQ恰恰是一种异步的调用技术。

2) MQ(Message Queue,消息队列)
异步的远程调用,如果能同时存在很多个请求,该如何处理呢?进一步地,由于不能立即拿到处理结果,假若需要考虑失败策略,重试次数等,应该怎么设计呢?
如果有N个不同系统相互之间都有RPC调用,这时候整个系统环境就是一个很大的网状结构,依赖关系有N*(N-1)/2个。任何一个系统出问题,都会影响剩下N-1个系统,怎么降低这种耦合呢?如图1-8所示:

系统依赖关系

图1-8

基于这些问题,我们发展出来了消息队列(MQ)技术,所有的处理请求先作为一个消息发送到MQ(一般我们叫做broker),接着处理消息的系统从MQ拿到消息并进行处理。这样就实现了各个系统间的解耦,同时可以把失败策略、重试等作为一个机制,对各个应用透明,直接在MQ与各调用方的应用接口层面实现即可,如图1-9所示:

基于MQ的系统依赖关系
图1-9
一般来说,我们把发送消息的系统称为消息生产者(message producer),接受处理消息的系统称为消息消费者(message consumer)。
根据消息处理的特点,我们又可以总结两种消息模式:

  • 点对点模式(Point to Point,PTP),一个生产者发送的每一个消息,都只能有一个消费者能消费,看起来消息就像从一个点传递到了另外一个点。
  • 发布订阅模式(Publish-Subscribe,PubSub),一个生产者发送的每一个消息,都会发送到所有订阅了此队列的消费者,这样对这个消息感兴趣的系统都可以拿到这个消息。

通过这两种消息模式的灵活应用以及功能扩展,我们可以实现各种具体的消息应用场景,比如高并发下的订单异步处理,海量日志数据的分析处理等等。如果要总结一下消息队列在各类架构设计中能起到的作用,一般有如下几点:

  • 为系统增加了通用性的异步业务处理能力,这个前面讨论过了。
  • 降低系统间的耦合性,无论是开发期的引用关系依赖,还是运行期的调用关系依赖,都明显简化或降低了。通信的双方只需要定义好消息的数据格式(消息头有什么字段,消息体是什么格式的数据),就可以各自开发和测试,最后再各自上线即可集成到一起。
  • 提升了系统间通信可靠性,无论是从通信本身的可靠性上(请求响应机制、重试),还是业务意义上(处理顺序、事务、失败策略),都相比RPC等方式有所增强。
  • 提升了系统的业务缓冲能力,一般又叫削峰填谷,指的是经过MQ做为中间的缓冲,如果业务量突然增大时可以先把处理请求缓冲到队列中,再根据业务消费处理能力逐个消息处理,保障了系统不会因为突然爆发的大量请求而过载瘫痪,影响系统的连续服务能力。
  • 增强了系统的扩展能力,通过消息队列处理的业务,消费端的处理能力如果不够,一般可以随时多加几个消费者来处理,从而可以直接扩展系统的业务处理能力,而不需要额外的代价。

1.6.3 分布式架构:微服务架构(MSA)

随着目前互联网的飞速发展,我们发现大型项目的设计开发和维护过程中,存在如下几个重点的困难点:

  • 扩容困难

我们之前开发项目用的是虚拟机,每次上线项目需要加机器总会遇到资源不足的情况,还要走非常复杂工单审批流程,还要与运维人员不断PK,才能申请下来资源,整个流程冗长,机器资源申请困难。

  • 部署困难
    每次上线采用专门的人进行布署,上线之前需要与上线人员沟通上线的环境,防止上线出错。

  • 发布回滚困难
    每次上线发现问题后,需要重新从SVN/GIT主干上面进行代码编译,但是有时候会因为各种问题回滚失败,而且重新编译很耗时导致回滚缓慢。

  • 适配新技术困难
    如果打算在不同的模块采用不同的语言开发,或者想在架构中做技术升级都很困难或者不支持。

  • 快速开发困难
    复杂项目中采用单体应用或者简单的分拆成2-3个系统,里面集成了太多功能模块,无法快速进行功能开发并且很容易牵一发动全身。

  • 测试困难
    测试人员没有自动化测试框架,或者Mock系统,导致只能采用简单的人工测试流程,而且还经常发生功能覆盖不全面等问题。

  • 学习困难
    业务变化日新月薪,功能和项目结构都太复杂,整个项目中的逻辑关系相互关联影响,采用的技术五花八门,技术本身的更新换代也很快,导致技术人员学习曲线非常陡峭。

我们把遇到以上这些问题的项目也叫做单体项目。

1.6.3.1 什么是微服务

The microservice architectural style is an approach to developing a single application as a suite of small services, each running in its own process and communicating with lightweight mechanisms, often an HTTP resource API. These services are built around business capabilities and independently deployable by fully automated deployment machinery. There is a bare minimum of centralized management of these services , which may be written in different programming languages and use different data storage technologies.

引用自http://martinfowler.com/articles/microservices.html 通过Martin Flowler的这段微服务描述,可以抽象出以下几个关键点:

  • 由一些独立的服务共同组成应用系统

  • 每个服务单独布署、独立跑在自己的进程中

  • 每个服务都是独立的业务

  • 分布式管理

通过几个关键点可以看出微服务重在独立布署和独立业务,而所谓的微服务,并不是越小越好,而是通过团队规模和业务复杂度由粗到细的划分过程,所遵循的原则是松耦合和高内聚,如图1-10所示:

微服务架构
图1-10

  • 松耦合
    修改一个服务不需要同时修改另一个,每个微服务都可以单独修改和布署
  • 高内聚
    把相关的事务放在一起,把不相关的排除出去,聚集在一起的事务只能干同一件事

1.6.3.2 微服务和SOA的区别

1、微服务只是一种为经过良好架构设计的SOA解决方案,是面向服务的交付方案。

2、微服务更趋向于以自治的方式产生价值。

3、微服务与敏捷开发的思想高度结合在一起,服务的定义更加清晰,同时减少了企业ESB开发的复杂性。

4、微服务是SOA思想的一种提炼!

5、SOA是重ESB,微服务是轻网关。

1.6.3.3 大规模使用微服务

使用微服务也就面临着由单体项目向微服务项目过渡,而采用了微服务架构后也就意味着服务之间的调用链路会比以前延长了很多,在调用链路上发生故障的几率也就随之增大,同时调用链路越长,性能越会受影响。微服务架构中是存在很多陷阱的,并不是简单的拿来使用就可以,所以企业要大规模使用微服务不仅仅是从思想和业务上面进行合理划分,还需要诸多技术组件以及高效的运维来协同合作,如图1-11所示。

微服务架构

图1-11

  • 防止雪崩

当一个服务无法承受大请求压力的时候,是否会影响所依赖的其他服务?这时候可以考虑限流等措施。

  • 功能降级

当某个服务出现故障时,是否有容错手段能够让业务继续跑下去,而不影响整体应用。

  • 冥等

当用户多次下同一订单时,得到的结果永远同一个。

  • 缓存

当请求量较大时,为避免对数据库造成较大压力,可以适当将一些变化较小,读取量较大的数据放入缓存。

  • 超时

超时时间对于调用服务来说非常重要,超时时间设置太长可能会把整体系统拖慢,而设置短了又会造成调用服务未完成而返回,我们在实际工作中需要根据业务场景进行分析,选择一个恰当的超时设定值。

  • 熔断

使用熔断器(断路器),当请求下游的服务时发生了一定数量的失败后,熔断器打开,接下来的请求快速返回失败。过一段时间后再来查看下游服务是否已恢复正常,重置熔断器。

  • 服务隔离

当所调用的服务发生故障的时候,上游服务能够隔离故障确保业务能够继续运行下去

  • 可伸缩

当并发量较大,原有服务集群无法满足现有业务场景时,可以采用扩容策略,而当并发量较小时,服务集群可以采用缩容策略,以节省资源。

其他信息


《高可用可伸缩微服务架构:基于Dubbo、Spring Cloud和ServiceMesh》推荐书评

《高可用可伸缩微服务架构:基于Dubbo、Spring Cloud和ServiceMesh》一书目前深受技术圈内各位专家的一致好评,推荐书评汇总如下:

  1. “微服务”早已成为广大“码农”们的聊天必备佳品,可每每深入到“微服务架构在具体实践中是怎样实施的?微服务架构在实施过程中存在怎样的困难和挑战?服务以什么原则拆分?拆分成什么样的颗粒度才算微?如何选型?”等等一类的话题时,大家往往会三缄其口或者乏善可陈。作者将自身多年的一线项目实践经验以文字形式将微服务的原理到项目实践应用深入浅出的完整呈现出来,同时通过案例对微服务架构实施过程中存在问题及解决方法进行了总结,对于想快速学习、应用微服务架构的读者来说是不可多得之作。
    —曾波(波姐,鹏博士电信传媒集团OTT业务技术负责人)
  2. 微服务这两年的热度持续不减,支持这种理念的中间件、开发框架等产品也不断迭代演进,我们可以运用的武器越来越多,但是这也使得技术人员在学习与选择上增加了不少的难度。本书基于实战,从架构的本质,微服务设计的原则到各环节重要技术点的分析等环节做了详细的思路讲解。其中也涵盖了目前最流行的一些框架与产品,紧跟时代的步伐,所以我推荐想要深入了解微服务架构全貌的读者阅读此书。
    —翟永超(公众号“程序猿DD”、《Spring Cloud微服务实战》作者)
  3. 很高兴看到《高可用可伸缩微服务架构》一书问世,作者老师们是社区挚友,多年以来致力于技术架构研究与落地,本书集合了技术大咖精华,结合业界最佳实践,展示微服务架构精华,是技术架构师们不可或缺的工具书。
    —王友强(中生代技术社区发起人)
  4. 微服务架构时下不断升温,如何针对自己当前业务场景进行微服务架构改造变得迫在眉睫,若同时还要兼顾高可用性、可伸缩性,这就要求架构师们具备庞大的技术体系,且不说容器化、DevOps、微服务监控和网关,光是核心的服务治理学习曲线就异常陡峭,这本书无疑如久旱甘霖,值得大家细细品读。
    —兰小伟(《Solr权威指南》作者)
  5. 本书深入浅出地讲解了微服务架构的理论与设计方法,并聚焦高可用和可伸缩这两大特性,详细分析了实现这两大特性需要关注的方向,包括高可用、高并发、分布式事务等。并介绍和分析了微服务实践中使用的一系列基础组件,包括远程过程调用、网关、服务编排等。本书还通过具体的业务场景——支付场景来介绍如何在具体业务中实践高可用、可伸缩的微服务架构。非常值得阅读。
    —韦韬晟(Apache Dubbo Committer,某互联网金融公司架构师)
  6. 本书系统解答了IT企业在服务演进主线过程中,在微服务化技术升级和服务迁移过程中的一些核心节点的关键痛点问题。最终让服务演进成基于领域建模,高可用,可伸缩的微服务架构,从而在技术层面解决当前一些大型企业和一些独角兽企业遇到的服务化进程推进之痛,强烈建议大家阅读学习。
    —徐凌云(新华网在线教育平台技术负责人,京东云网关研发负责人)
  7. 微服务架构对于金融行业从“稳态”到“敏态”的数字化转型意义非凡,极大提升业务系统的可用性、扩展性和应变能力。作者基于一线实战项目,深入浅出介绍微服务架构的各种技术细节。此刻此书,恰逢甘霖,给大家提供了一个学习微服务的捷径。-
    —胡晓磊(华为金融行业解决方案专家)
  8. 经历了系统从单体架构到ESB企业总线架构,再到全面的微服务化架构的整个改造过程,深知微服务看似美好,但在企业中落地实施其实是一件很困难的事情,这本书不仅从理论高度上阐述了微服务架构,也有丰富的可操作的实践案例,涉及到服务划分,框架选型,服务治理,尤其是当前流行的服务网格,恰如我们在微服务架构改造过程的真实写照,相信大家也会从本书中获得微服务最佳实践的灵感和方向。
    —王明华(北京多来点信息技术有限公司 CTO)
  9. 本书围绕微服务架构高可用方面进行深度剖析,从实战角度对微服务相关技术进行讲解,教会我们如何轻松搭建可伸缩的微服务架构,以及所需要的基础知识和技能,对一线架构师的工作有着非常大的指导意义。作者程超对微服务架构理解透彻,功力深厚,强烈向各位技术同行们推荐这本书!
    —黄勇(《架构探险》作者)
  10. 本书从微服务和领域驱动开发的角度阐述高可用和可伸缩架构,知识点覆盖全面。书籍作者由多名一线互联网资深人员联合出品,体现了现代技术书籍的合作共赢的模式。各位作者取长补短,将最好的内容呈现至读者面前。在架构类的书层出不穷的当今,本书特点鲜明,是我眼中的优秀书籍,推荐读者品读。
    —张亮(京东数科数据研发负责人,Apache ShardingSphere发起人 & PPMC,《未来架构——从服务化到云原生》作者 )
  11. 微服务(MicroServices)定义较早见于Martin Fowler的著作和博客中,但在此之前,有几家公司早已开始了微服务的实践探索,并建立了具备相当规模和影响力的产品,例如,阿里巴巴开源的Dubbo。而秦金卫正是在这一阶段任职于阿里巴巴,从事微服务相关的研发工作。最近几年,微服务领域的基础软件层出不穷,由开源社区或一些大公司主导的方案都逐渐成熟,然而,这却也给微服务方案的选型带来一些不便。本书结合常见的微服务产品,在服务研发、性能优化、监控、管理甚至遗留系统改造方面都做了全面的介绍,非常值得一读。
    —宓学强(前陌陌技术主管,淘宝微服务框架负责人)
  12. 微服务架构对大型分布式后端的改造和优化非常有帮助,但是它并不容易实现,搞不好就会事倍功半。本书理论与实践相结合,介绍了时下流行的dubbo、spring cloud、容器化等技术以及实践经验,对于想了解微服务技术的你是一个不错的选择。
    —付磊(《Redis开发与运维》作者 )
  13. 想知道怎样建立起微服务架构的完整思维吗?我觉得你应该看看这本书。它勾勒出微服务架构的编程思想和原理,介绍了微服务架构实例,让我们对微服务架构的认识变得立体、系统起来。并且深入浅出、通俗易懂,既具有精炼的微服务架构之道,又包含精彩具象的实践代码。不论是初学编程的菜鸟,还是经验丰富的大牛,都值得一读。
    —周智勇(融贯电商高级研发总监)
  14. 本书阶梯指引读者深入微服务框架,满满的都是干货,从架构发展历程引入微服务架构,通过与最近炙热的领域驱动设计(DDD)结合碰撞出”感情火花”把架构设计将的通俗易懂,加上各个框架实现原理的深入解读让读者无论是框架还是微服务架构都有了更深刻的理解,再结合实际项目的实战部分让微服务架构更加清晰的呈现在脑海里。是一本通俗易懂的微服务架构工具书,非常值得拥有。
    —杨进京(美团金融技术专家)
  15. 本书覆盖了微服务的方方面面——微服务理论、拆分依据、开发框架、稳定性保障、分布式事务、监控、微服务编排、重构乃至性能优化,甚至目前火热的”service mesh”均有覆盖。很难想象一本书竟然能介绍这么庞大的技术体系,而且还能无缝地承接。阅读本书,能让您对微服务的完整生态有一个相对完整的认识,对于想快速了解并应用微服务构建系统的读者来说是一部不可多得之作。
    —周立(《Spring Cloud与Docker微服务架构实战》作者)
  16. 本书从微服务架构概念开始,指出微服务的业务领域模型设计。重点讲了微服务设计的重点和痛点:性能优化、监控、一致性、可用性等。有理论依据、设计心得,又有工程实施方案;有应用框架源码分析,又有自动化运维工具介绍。各位作者都是在金融和电商等行业一线出来的的资深人员,内容深入浅出,是讲述微服务的一本不可多得的好书。
    —王欣(Apache Dubbo PPMC)
  17. 时至今日无论是大型互联网公司还是创业型公司,大家越来越多地选择微服务架构。众所周知实现微服务架构是非常困难的,这本书从理论到实践阐述了如何搭建高可用可伸缩的微服务系统。这本书不单单介绍常用的 Apache Dubbo、Spring Cloud 等框架的使用,更为重要的是告诉读者使用微服务架构所遇到的常见问题以及解决方案,是一本诚意十足和干货满满的书。
    —沈哲(《RxJava 2.x 实战》作者,爱回收创新业务部技术专家)
  18. 几位熟悉的朋友捣鼓的这本书我觉得担得起两个字“干货”,既有dubbo、spring cloud还有最近讨论比较多的Service Mesh,关注案例的朋友重点看一下支付平台、遗留系统改造等章节。赠人玫瑰、手有余香,感谢诸位为微服务原创图书再添佳作。如果说遗憾的话,就是读完意犹未尽,期待续篇。
    —于君泽(《深入分布式缓存》联合作者)

《高可用可伸缩微服务架构:基于Dubbo、Spring Cloud和ServiceMesh》书籍介绍

《高可用可伸缩微服务架构:基于Dubbo、Spring Cloud和ServiceMesh》

高可用可伸缩微服务架构

作者心声

经过长达近1年半的准备,本书终于要和大家见面了。本书的各位作者,都是具有多年大型互联网架构设计的资深架构师。我们把微服务架构领域的各类知识,以及自己平常的经验和积累做了完整的梳理总结,凝结为这样一本技术书,作为2019年的一份礼物呈现给大家,同时也欢迎大家共同探讨和交流。

本书通过 Dubbo、Spring Cloud、Service Mesh 等技术构建微服务体系,并深入浅出的介绍了微服务架构发展历程、领域驱动设计、稳定性保证的常用手段、分布式事务的一致性方案,以及通过大量的案例探讨微服务落地方案,例如双活体系建设,分布式监控,微服务编排,百亿流量微服务网关的设计与实现,基于支付场景下的微服务改造等,展示了实现微服务架构的完整蓝图,并让读者了解到如何借助于微服务来增强和重构现有的遗留系统。不管你是还没听过或者刚接触过微服务的新手,还是正在尝试借助微服务解放生产力的开发人员或者运维人员,或者是立志于构建高可用可伸缩的微服务体系的架构师,阅读本书,对读者必有裨益。

本书前言

微服务这个概念最早是在2011年5月威尼斯的一个软件架构会议上讨论并提出的,用于描述一些作为通用架构风格的设计原则。2012年3月在波兰克拉科夫举行的33rd Degree Conference大会上,Thoughtworks首席咨询师James Lewis做了题为《Microservices - Java, the Unix Way》的演讲( http://2012.33degree.org/talk/show/67 ),这次演讲里James讨论了微服务的一些原则和特征,例如单一服务职责、康威定律、自动扩展、DDD等等。

微服务架构则是由Fred George在2012年的一次技术大会上所提出( http://oredev.org/oredev2012/2012/sessions/micro-service-architecture.html ),在大会的演讲中他讲解了如何分拆服务以及如何利用MQ来进行服务间的解耦,这就是最早的微服务架构雏形。而后由Martin Fowler发扬光大并且在2014年发表了一篇著名的微服务文章( https://martinfowler.com/articles/microservices.html ),这篇文章深入全面的讲解了什么是微服务架构。随后,微服务架构逐渐成为一种非常流行的架构模式,一大批的技术框架和文章涌现出来,越来越多的公司借鉴和使用微服务架构相关的技术。

然而微服务并不是万能药,我们在实施的过程中不能简单的使用某些个微服务框架或者组件一蹴而就,而是需要将业务、技术和运维有机结合起来,配合同步实施,并且在此过程中还需要趟过很多的坑才能够取得成功。

本书的每一个章节都是相关领域的专家经过多年的技术积累提炼而成,秉承以理论为基础,以大量企业实战案例为核心,深入全面的介绍了微服务架构的实施方法以及在实施过程中所遇到的问题和解决方案,是一本内容详实、“可落地”的理论实践相结合的技术书籍。

内容简介

本书共分为十四章:

第一章:微服务概述

从软件架构的发展历程讲起,分别对单体架构、SOA架构和微服务架构的演进过程做了深入浅出的讲解,同时也深入介绍了微服务架构的特点,本章以宏观的视角为读者打开微服务的大门。

第二章:微服务领域驱动设计

本章介绍了领域驱动设计是什么,常见的领域架构有哪些,如何将领域驱动应用到微服务中,以及如何使用领域驱动进行合理的服务划分等,帮助读者在正式学习微服务前修炼内功。

第三章:Dubbo原理与实现

目前Dubbo已经被阿里巴巴技术团队重新维护并且得到了大力的发展和推广,使用Dubbo依然可以很好的进行微服务建设,本章较为深入的讲解了Dubbo的使用和技巧,以及通过源码的深入分析能够让读者对Dubbo的原理实现有一个全面的认识。

第四章:Spring Cloud实战案例

Spring Boot/Cloud是目前较为流行的微服务框架,本章以大量的实战案例为读者讲解如何才能应用好Spring Cloud框架,以及如何避免在使用过程中遇到的坑。

第五章:微服务稳定性保证常用手段

当业务发展越来越快,规模也越来越大的情况下,我们所面临的就是如何在服务越来越多的情况下保证微服务架构的稳定性,本章带领读者逐步揭开保障稳定性的常用技巧和手段。

第六章:微服务下事务的一致性保证

本章介绍了从本地事务到分布式事务的演变,深入分析了微服务在强一致性场景和最终一致性场景下的解决方案,探讨了二阶段提交协议、三阶段提交协议、TCC 模式、补偿模式、可靠事件模式等。同时,对开源项目的分布式事务进行解读,包括 RocketMQ 和 ServiceComb。

第七章:微服务亿级网关设计

本章从百亿流量交易系统微服务网关(API Gateway)的现状和面临问题出发,阐述微服务架构与 API 网关的关系,理顺流量网关与业务网关的脉络,带来最全面的 API 网关知识与经验。

第八章:微服务编排

本章以Netflix Conductor框架为核心,从框架的使用和原理深入介绍了什么是微服务编排,为微服务执行复杂的业务逻辑提供了一种新的思路。

第九章:微服务统计与数据抽取方案

在微服务架构下,服务必将越来越多,在这各情况下如何进行数据统计和分析将变得非常困难,本章将深入讲解如何从不同服务的数据库中抽取数据到统一的大数据平台中,帮忙使用者更方便的进行数据的统计。

第十章:微服务双活体系建设

在企业发展规模越来越大的情况下,用户对系统的稳定性要求也越来越高,那么单机房布署势必成为发展的瓶颈,本章将带领读者从零开始以实际案例出发进行同城双活的建设。

第十一章:基于支付场景下的微服务改造和性能优化

本章从实际的案例出发,在具体的支付业务场景下,从一个新项目开始逐步讲解如何利用领域驱动划分服务,如何利用微服务框架进行服务治理,以及项目完成后怎样提升微服务架构的性能。

第十二章:遗留系统的微服务改造

本章介绍了遗留系统的微服务架构改造,梳理了代码分层结构的转变,提出一个新的代码分层思路来应对微服务的流行与普及,并深入思考了遗留系统的债券,深入探讨单体系统拆分服务的方法论。同时,对遗留系统的微服务架构改造的解决方案给出 9 个切实可行的核心实践思路。

第十三章:Service Mesh的入门与案例

随着微服务的持续发展,下一代微服务架构已然出现,本章将深入介绍Service Mesh发展历程,以及结合具体案例带领读者使用Istio进行具体实践。

第十四章:微服务监控实战

本章重点介绍APM的原理,从零开始开发APM监控系统,还深入介绍Prometheus的安装和原理,以及如何使用Prometheus进行监控和预警。

作者简介

  • 程超

    网名小程故事多,现某公司高级架构师,12年Java研发经验,8年技术管理和架构经验,熟悉支付和电商领域,擅长微服务生态建设和运维监控,对Dubbo、Spring Cloud和gRPC等微服务框架有深入研究,并应用于项目,帮助过多家公司进行过微服务建设和改造。合著作品《深入分布式缓存》,阿里云MVP、云栖社区外部专家、Codingfly社区特聘技术专家、CSDN博主专家。

  • 梁桂钊

    现任某互联网公司高级开发工程师,参与过内容分发、K12 教育、淘系电商等项目。目前,专注于新零售电商服务的业务摸索和电商服务创新实践。对于 Java 核心技术、微服务、分布式、高并发有一线实战经验,并对新兴技术方向和各种开源框架有浓厚热衷。公众号「服务端思维」的作者。

  • 秦金卫(KimmKing)

    现某公司高级技术总监/Apache Dubbo PPMC,前阿里架构师/某商业银行北京研发中心负责人,阿里云MVP、TGO鲲鹏会会员。关注于互联网,电商,金融,支付,区块链等领域,熟悉海量并发低延迟交易系统的设计实现,10多年研发管理和架构经验,对于中间件、SOA、微服务,以及各种开源技术非常热衷,活跃于Dubbo/Fastjson/ActiveMQ等多个开源社区。个人博客:http://kimmking.github.io

  • 方志斌

    现任某物联网公司高级研发工程师。目前,专注于大型物联网平台架构的设计与开发工作。对于微服务、分布式、集群有一定的研究和实战经验。对Java领域的开源框架有浓厚的兴趣,喜欢框架源码深入分析、总结。SpringForAll社区核心成员,组织多次社区技术专题、问答等活动。

  • 张逸

    架构编码实践者,微服务架构设计者,领域驱动设计布道师,大数据平台架构师。著译作包括《软件设计精要与模式》、《恰如其分的软件架构》、《人件》等。他的个人微信公众号为「逸言」,个人博客:http://zhangyi.xyz。

  • 杜琪

    网名阿杜,现任蚂蚁金服高级研发工程师,2015年6月毕业于南开大学计算机系统结构硕士。毕业后开始接触分布式业务系统开发,曾在有赞负责用户中心基础服务,对分布式业务系统的稳定性、可靠性有丰富的经验积累。个人喜欢研究底层技术,喜欢研究疑难技术问题,例如:JVM内存问题排查、GC调优等等。有对外输出分享的习惯,是公众号javaadu的维护者。

  • 殷琦

    网名涤生,现任美团点评技术专家,2015年3月毕业于东华大学软件工程硕士。2015年3月加入美团点评基础架构部,开始接触微服务架构,之后一直从事服务框架的研发工作,对微服务架构发展演与进认识非常深刻。个人比较喜欢研究并分享新技术,时刻关注并实践微服务架构最前沿的技术,如 Service Mesh、Serverless 等。

  • 肖冠宇

    曾就职于小米、人民网等互联网公司,具有丰富的大数据一线实战经验,专注大数据处理技术及机器学习算法研究。著有《企业大数据处理:Spark、Druid、Flume与Kafka应用实践》、《Python3快速入门与实战》

其他信息