赞
踩
技术架构也是我们常说的软件架构、系统架构,是将业务需求和应用功能转变为技术实现的过程。技术架构在软件开发过程中应用得比较普遍,受到广大技术人员的普遍关注,它是有关软件整体结构与组件的抽象描述,用于指导大型软件系统各个方面的设计。技术架构可以帮助我们梳理系统边界、识别系统需求、识别系统风险和问题优先级、确定技术方案和路线,让团队之间达成共识且相互约束,并指引团队适应业务和技术的变化。
在企业架构中,技术架构是支撑整个企业架构体系的技术部分,也是企业架构中IT架构的最后架构阶段。技术架构以业务架构中的业务需求、业务能力、业务流程为指导,是从应用架构和数据架构的具体形态导出的对企业数字化系统和IT基础设施进行整体部署的一组技术标准规范、原则和最佳实践,并包含相关的技术选择标准、产品选择方案、技术实施路线等,目标是优化整个企业的IT运行环境,实现IT对业务服务高效率地交付。
从广义上来讲,技术架构涉及技术研发的方方面面,包括业务、数据、应用对应的软硬件能力,比如IT基础设施、中间件、网络、通信等。同时,技术架构从技术上指导应用系统的开发、部署、测试、交付、运维等,提出公共性、支撑性的指导,推进资源共享和系统协同,发挥现有资源和基础设施的效用,提升业务系统的互操作性。技术架构解决的问题包括技术分层、技术框架选择、开发语言选择、非功能性需求实现等。
技术架构的主要价值有以下几点。
技术架构涉及技术架构规划、技术平台、基础设施,以及技术架构标准原则、最佳实践等。
图例:技术架构设计框架总览
技术架构模式基于经常出现的问题,给出通用、可复用的技术方案。技术架构常用模式既包括一些传统模式,如分层架构、事件驱动架构、SOA,也包括一些新兴模式,如微服务架构、上云架构、云原生架构等。企业需要结合自身业务和技术的实际特点,选择合适的技术架构模式。
所有业务逻辑全部在一套系统中,是大而全的体系,没有服务化,没有分层,单机集中式数据库,存储过程复杂。这种架构适用于业务发展早期,这时产品的完善性、系统扩展性、部署规模的要求都不高。很多企业在发展初期,在技术方面的投入并不大,主要以外采系统为主,包括CRM、MES、ERP、HR、PLM、SCM等系统,各个系统各自独立,各自有单独的数据库及权限管理。单体模式的缺点是造成“烟囱式”发展,信息化协同不便,业务需求响应有限。
分层架构是一种客户端/服务器端架构,将系统软件分成了多个层次,通过层次的抽象提供相对便捷的扩展和复用能力。每一层都是围绕一种功能的抽象,各负其责,有利于系统开发、测试、管理和维护。最常使用的分层架构是MVC三层架构,将模型、表现、控制进行分离,除此之外,后文介绍的很多架构模式本质上是分层架构的进一步演进。
事件驱动架构(EDA)是使用解耦、单一用途的事件处理组件来异步接收和处理事件的架构。一个事件驱动系统一般由事件消费者和事件产生者组成。事件驱动在分布式系统、异步处理系统、高并发削峰填谷等场景中广泛使用。事件驱动架构当然也增加了一定的复杂度,包括事务性、数据一致性、事件顺序、重复消费等方面。
微内核架构(Microkernel Architecture)是一种面向功能进行拆分的可扩展架构,有时也可以称作插件化架构,比如Eclipse类型的IDE、UNIX操作系统,都是参照微内核架构设计的。微内核主要分为核心系统和插件系统,核心系统拥有能使应用运行的最小功能逻辑,插件系统是独立存在的系统,包含特殊的处理逻辑、额外的功能和定制的代码,能拓展核心系统业务功能。微内核架构设计的难点是核心系统的通用性、插件系统的扩展性和灵活性。
RPC架构是远程过程调用架构。当时,很多企业采购了ESB和数据交换工具,将不同的流程打通,做到信息拉通、数据集成、协同管理。RPC框架主要包括网络通信、序列化或反序列化、传输协议和服务调用等组件。远程服务提供者以某种形式提供服务,调用相关信息,远程代理对象通过动态代理拦截机制生成远程服务的本地代理,让远程调用在使用上和本地调用一样。网络通信通过序列化或反序列化方式对网络传输数据进行有效的传输。服务调用可以分为同步调用、异步调用等方式。传输协议可以使用TCP和HTTP。Dubbo是RPC架构典型的分布式框架代表。
SOA通过服务化技术进行系统的拆分,进而把一个单一的大系统按逻辑拆分成不同的子系统,通过服务接口来通信,是面向服务的设计模式,最终需要总线集成服务。过程中引入中间件、消息、分布式数据库等技术组件,通过ESB与企业系统进行集成和交互。这种架构适用于业务发展中期,这时企业对产品的完善性和精细性有了一定的需求,团队也越来越大,扩展性主要依赖服务化的能力。
微服务架构本质上是SOA的演进,在被Martin Fowler等人推广后,由于其实用性,越来越受到大家的重视。微服务由一组小型自治服务组成,每个服务实现单个业务功能,每个服务是小型的、独立的、松耦合的,每个服务代码库都是独立的,每个服务负责持久化自己的数据或者外部状态,通过使用定义良好的API进行通信。微服务架构的好处很多,比如提高研发效率、支持更专注的团队、提高可扩展性、隔离业务和数据、有更小的代码基线;同时带来一些挑战,比如复杂度高、部署和运维困难、数据一致性问题、版本控制问题、组织文化考验等。
大数据架构是数据架构的一种,其主要进行大数据的技术处理和分析海量数据。该架构是大数据解决方案的蓝图,处理的工作包括批量处理大数据源、实时处理数据、预测分析及机器学习。大数据架构的优势是应对大规模数据处理,通过并行度提升性能,弹性伸缩,与现有方案(如物联网、BI等)互通;其挑战在于相关大数据技术、团队技能储备及数据安全等问题。
云计算已成为社会的公共的基础设施,企业上云也被人们广泛接受。在企业数字化转型过程中,首先应使用云作为企业的技术基础设施,并逐步应用云计算的红利,逐步将应用迁移到云上,这就诞生了上云架构。上云架构有很多优势,比如极致的弹性、降本增效、加速IT设施发展、提升系统稳定性、加强资源整合等;其挑战是对企业的技术团队能力要求高、整体架构与企业的对接和整合不容易等。
云原生是云计算的“下一站”,云原生的代表技术有容器、服务网格、微服务、不可变基础设施和声明式API。这些技术能够构建容错性好、易于管理和便于观察的松耦合系统。运行在其上的应用被称作云原生应用,云原生架构是依赖云产品和云原生技术构建的IT架构,生于云、长于云并最大化运用云的能力,让开发者聚焦于业务本身。云原生的设计理念是面向分布式(Distribution)、配置(Configuration)、韧性(Resistancy)、弹性(Elasticity)、交付(Delivery)、性能(Performance)、自动化(Automation)、诊断性(Diagnosability)及安全性(Security)等方面。
应用架构常用模式主要有以下几种。
集中式架构又称单体架构,传统企业根据各个业务部门的需求,开发了多个“烟囱式”系统,这种架构模式有很多弊端,在一些传统企业中还存在。
企业采用企业服务总线(ESB)来解决多系统之间复杂的接口交互模式,也就是传统的SOA模式。而随着互联网企业的发展,采用去中心化、去IOE的分布式服务架构,不需要ESB作为中心节点,而是进行直接发现和调用,以解决中心化服务扩展难、不适合互联网大流量要求快速响应的痛点。
The Open Group的面向服务架构 (SOA) 工作组提出了一个SOA架构的参考模型,主要包括:
图例:SOA参考应用架构
SOA参考应用架构,具体包括以下几个层面。
SOA并不是推倒重建企业的系统,而是在现有的系统之上进行包装服务,建立标准结构,方便互通和调用。SOA也使得架构设计的过程从面向对象、面向组件的设计方法过渡到面向服务的设计方法,其强调以服务为中心的设计理念,接口和实现分离、服务提供和服务使用分层的设计思想。
事件驱动架构(Event Driven Architecture,EDA)以SOA为基础,以事件为单位进行各种处理。事件驱动的核心是事件,事件是历史,是事实,是已经发生的事。
图例:事件驱动架构示意
事件由事件源生成,并通过事件管理器进行发布,各种事件的订阅方根据需要进行订阅消费,可以直接处理该事件,或者即时转给其他订阅方,同时事件作为一种业务数据的载体,可以进行存储,从而在以后进行处理。
图例:事件驱动概念示意
事件驱动系统通常是异步的,事件生产者向事件管理器发布事件,如果事件消费者不可用,事件管理器将保留这个事件,之后再次转给事件消费者。
事件生产者与事件消费者相对独立且解耦,事件生产者不需要知道哪个消费者会接收消息。事件消费者彼此之间也互相解耦,每个消费者都可以接收全部或者部分消息。因此,事件驱动架构的系统更适用于包含较多未知因素的环境或者异步的环境,通过构建分布式高可用架构,提供事件生产者和事件消费者相对灵活解耦的能力。事件驱动架构适用于多种场景,比如有多个子应用且处理相同事件,需要实时处理大量数据,有复杂的事件处理等。
图例: EDA领域事件
从领域设计角度,事件驱动架构也有广泛应用,比如基于事件风暴的分析方法。其中,事件源和订阅者都是具体的领域实体,事件管理器可以作为基础设施的一部分技术组件,这个过程会借助消息中间件来进行能力提供。
随着互联网技术的发展,SOA技术进一步进化为以微服务为主流的分布式服务架构。微服务是一种分布式架构模式,微服务架构凭借其简单清晰、灵活可扩展、独立部署等优势,逐渐成为分布式架构的主流。微服务将大型复杂软件应用拆分成多个微小的服务,服务之间是松耦合的,每个服务描述一个小业务,可以独立地进行升级、部署、扩展和重新启动等流程,并通过接口契约、标准协议等保持彼此互通。
微服务架构由SOA演化而来,是SOA的一种特殊实现方式,突出将服务划分为更细粒度的微服务,按照业务领域划分,强调服务编排、服务治理、自动化运维,并具备高可用、性能要求、分布式事务一致等特点。
关于微服务是什么,转述Martin Flower 大神的系统阐述:
图例:微服务架构示例
与集中式架构相比,微服务有降低系统复杂度、提高迭代效率、促进团队沟通、弹性扩展、容错能力、独立部署、可扩展性、跨语言编程等很多优点,这里挑选几个进行说明。
微服务架构有很多好处,不过也存在以下一些挑战。
分布式架构的出现是为了解决应用难以开发和维护的问题。
如今,架构朝着越来越轻量化、能力越来越下沉、应用越来越灵活的方向发展,到云原生时代达到了新的高度。
云原生将云应用中的非业务代码进行最大化的剥离,关注点分离,让云来负责原有的大量非功能特性需求,如可靠性、扩展性、可观测性、弹性、轻量、敏捷、自动化等。
同时,有很多企业也在尝试“双IT架构”,即以云原生架构来应对敏态业务的快速变化,以及传统的基于ESB方式的架构应对稳态内部系统的管理,二者相互结合并互补。
下面从不同维度给出技术架构的设计原则。
提到非功能性,技术架构可能涉及多个方面,如稳定性、可扩展性、一致性、可移植性、兼容性、可配置性、可降级性、可部署性、可发现性、故障透明性、容错性、可检验性、可安装性、完整性、可维护性、可管理性、模块性、可操作性、可恢复性、可靠性、重现性、弹性、可复用性、稳健性、安全性、可服务性、合规性、可持续性、可测试性、可追溯性等。当然这些特性可能并不会在一个系统中全部满足,需要结合企业实际需求进行针对性的开展。下面是ISO/IEC 25010标准定义的系统软件产品质量中所考虑的非功能性,包括以下八大类别。
微服务设计原则如下所示,有的前文已提到过。
在架构设计领域,架构制图是针对系统架构某一个方面的一种描述,将系统的技术方案、技术选型通过视图的方式进行展现。架构制图可以帮助团队内部和团队之间消除沟通歧义,提升协作效率。一图胜千言,无图无真相。图是直观而形象的,顺应了人类与生俱来的视觉识别本能,一张图所能传达的信息非常多。常见的技术架构制图有功能架构制图、系统分层架构制图、系统链路架构制图、部署架构制图、开发架构制图等。
国际上对架构描述设立了专门的标准(ISO/IEC/IEEE 42010:2011),架构制图是架构的载体,从制图本身角度,架构制图需要关注以下几个方面。
UML(Unified Modeling Language)是统一建模语言的简称,它是一种由一整套图表组成的标准化建模语言。UML用于帮助系统开发人员记录软件系统的产出。UML主要使用图形符号来表示软件项目的设计,帮助项目团队沟通和进行软件设计。
UML总共包含十几种不同类型的图,可以覆盖软件设计领域各种制图需求,主要分为如下两大类图。
图例: UML分类
下面简单介绍几种常用的UML制图。
对于通用的一些UML原则,《码出高效:Java开发手册》给出了比较详细的介绍,这里挑选并提炼其中几条。
1995年,Philippe Kruchten发表了题为“The 4+1 View Model of Architecture”的论文,引起了业界的关注。此论文提出了一种用来描述软件系统体系架构的模型,以架构为中心场景驱动和迭代开发等方式实现设计。“4+1”视图模型基于不同项目干系人,从4种基础视图和场景方面来描述软件需求。
图例:“4+1”视图模型
C4模型来自《程序员必读之软件架构》(Software Architecture for Developers)一书,C4模型是一种“抽象优先”的架构制图方法,它是受UML的启发而开发出来的,但相对而言,C4模型更加简单和轻量,只包含少量的一组抽象和图表,易于学习和使用,如图7-4所示。
图例:C4模型示意图
C4代表上下文(Context)、容器(Container)、组件(Component) 和 代码(Code) 分层的图表,可以用这些图表来描述不同缩放级别的软件架构,每种图表适用于不同的受众。
C4模型最关键的思想就是自上而下对系统的静态结构进行逐级拆分,依次描述各层次对象的职责、关系和外部依赖。此外,它还可以包含动态视图、部署视图等补充视图。举个例子,一个软件系统由多个容器(如数据库、应用)组成,一个容器由多个组件组成(如微服务和技术组件),一个组件由多个代码(如接口类、实现类、领域对象类)结构组成。
技术架构视图可分为多种类型,比如系统功能架构、开发架构、测试架构、部署架构、运维架构、安全架构、集成架构、数据交互架构等视图,下面简要介绍几种技术架构视图。
开发架构视图提供软件系统各模块的组织结构,涉及系统的各个层面,包含软件复用技术应用、设计和测试的标准化、代码组织管理等。开发架构主要面向技术开发人员,一方面强调软件开发生命周期的各阶段,另一方面重视对已有资产的封装、管理和重用,强调统一建模和设计的重要性。 
图例:开发架构视图
上图展示了一个例子,从分层角度,开发架构包括网关层、应用层、服务层、技术底座层、基础设施层等。
整个框架体现一个目标:以基础设施层为依托,以技术底座层为开发准则,以应用层和服务层为核心,通过网关层,全面为各层次提供高质量的服务。
CI/CD
、DevOps
、代码托管等能力,打通业务开发与基础设施,屏蔽基础设施中复杂的技术细节,并提供对接其他系统的能力部署架构视图主要面向运维人员,维持系统运行的各种服务,包括运维安全管理、网络设施管理、基础服务管理、配置管理、基础设施和环境管理,以及相关的规章制度和管理流程等。
部署架构有时也叫作物理架构,需要考虑一些因素,比如网络情况、流量调度、隔离的环境、运行时功能或数据迁移、状态性能监控、系统配置、数据和系统备份及还原等,还要考虑如何保障系统的稳定性,在出现运行故障时能够进行容错和快速恢复,包括安装、迁移、管理和支持活动,同时这些活动需要尽可能自动化。
图例:部署架构视图
上图展示了一个基于Spring Cloud
体系的部署架构,包括服务注册集群、服务配置中心、业务服务容器、服务监控和保护、流量控制和负载均衡、认证鉴权等集群组件的部署。
安全架构视图定义了企业向业务部门提供的安全范围和功能,贯穿整个企业架构的安全环节,是业务安全运行的基础架构。
图例:安全架构视图
安全架构包括身份和访问管理、开发安全管理、运维安全管理和集成架构安全等,以及合规等安全运营管理等。
安全架构对企业非常重要,涉及的面很广。比如,从系统数据安全角度,需要敏感数据保护、数据传输加密、数据存储加密等;从系统应用安全角度,涉及应用防火墙保护、应用配置安全、代码安全、漏洞扫描等;从系统账号安全角度,需要进行身份认证、访问授权、账号管理、操作审计等;从系统安全监控运营角度,需要进行威胁检测、配置检查、日志审计、备份恢复等。
从技术架构基础设施角度,越来越多的企业选择使用云计算,逐步将企业的应用搬到云上。这里我们来看看企业上云的好处和通用方法。
什么是上云?上云指的是企业以云计算的服务能力为基础,进行信息化系统及相关业务应用的建设并对外连接的过程。上云可以帮助企业解决技术统一、业务统一的问题;可以支持敏捷开发,加速业务快速创新;还可以帮助企业降本增效。云计算通过资源池和虚拟化技术,让应用和底层基础设施解耦,进而提高资源的利用率,并通过资源弹性使得云基础设施和传统IDC(互联网数据中心)对比具有明显优势。
企业上云一般可分为三种类型。
图例:企业上云的三种类型
可以看出,上云不仅是简单地使用一些计算、网络、存储等云资源,更重要的是从Rehost向Re-platform,进而向Re-architect升级。
在此过程中,虽然上云的成本和复杂性逐步增加,但是在其他方面(比如敏捷性、弹性、可用性、容错性等)的收益也在持续增加,因此企业上云需要综合考虑自身的业务和技术特点,选择适合自己的上云节奏。
在上云过程中,企业需要遵从以下原则。
企业应用上云需要紧密结合自身的业务和技术特点,可以采用以下通用的几个步骤。
云计算的“下一站”是云原生,企业上云的趋势也是云原生基础设施。
Gartner将云原生基础设施划分成四大类,主要分为IaaS
、CaaS(Container as a Service)
、Serverless Containers
(如ASI
)、FaaS
(如函数计算)。可以看出,从下往上,计算单元的粒度越来越细,越来越体现云原生的特质,体现在模块化程度、自动化运维程度、弹性效率、故障恢复能力等方面。
可以说,云原生基础设施是应用研发和运维的最佳实践的组合(如容器化、持续集成和交付、不可变基础设施等),使分布式系统更加可靠、易管理和易观测,提升研发运维的效率;同时使云原生的优势和云厂商的传统优势(如规模、稳定性和弹性)完美结合,并通过开放的社区标准与各大云提供商的商业化服务能力,极大地改变了用户的心智。可以预计,云原生基础设施将大大简化企业上云的过程,并结合新一代计算单元、Serverless Containers
、函数计算、分布式云环境等更加灵活地适配企业多种上云诉求。
技术架构由多种技术组成,过程中可能涉及非常多的具体技术
图例:技术架构核心技术
下面我们就技术架构中核心的流量调度、服务治理、监控体系、消息列队、微服务技术框架等进一步展开介绍。
流量调度是技术架构中的核心技术,包括负载均衡、API网关、配置中心,以及一些高级特性,如容灾。
负载均衡(Load Balance
)是将请求分摊到多个操作单元上执行。
来自客户端的请求通过负载均衡被分发到各个服务器,根据分发策略的不同产生不同的分发结果。
负载均衡解决方案已经是业界比较成熟的方案,通常分为硬件负载均衡和软件负载均衡。
以Nginx为例,它提供一个成熟的、可扩展的、高性能Web服务器和反向代理,Nginx便于部署、配置和二次开发,并可管理授权、权限控制、负载均衡、缓存及提供应用健康检查和监控。
负载均衡的网络消息转发一般集中在传输层和应用层。
在云服务广泛使用的今天,还有一种负载均衡的策略是把资源尽可能向消费者侧分布,这里的典型代表是内容分发网络(Content Delivery Network,CDN),这是一种用于内容分发的虚拟网络。依靠部署在各地的边缘服务器,CDN通过负载均衡、内容分发、调度,可以让用户就近获取所需内容,从而缓解网络拥塞,提高访问速度和命中率。
负载均衡算法有很多,大体上分为静态的和动态的两大类。
API网关一般作为后台服务的入口,企业需要特别关注,API网关主要具有以下作用。
在进行API网关设计时需要考虑如下能力。
API目前设计是将RESTful作为约定规范,RESTful主要基于HTTP定义API,有以下常见的HTTP请求方法。
其中,Post、Put和Patch很容易弄混。Post请求用于创建资源,Put请求用于创建资源或更新现有资源,Patch请求用于对现有资源的局部进行更新。Put请求必须是幂等的,如果客户端多次提交同一个Put请求,那么结果应始终相同,而Post和Patch请求没有这样的要求。
常用的API网关产品如下所示。
一般在系统的配置管理中,会有以下几个问题。
XML
、YML
、Property
文件,注册表,数据库等。配置中心的目的就是解决上述问题,统一集中管理系统和服务的配置。
图例:配置中心
配置的三要素:
在配置管理的过程中,为了优化配置中心的质量,可以考虑以下方案
配置中心的非功能性需求是配置的安全性、实时性、动态管理、版本管理、环境与应用解耦、高可用、灵活性、可靠性、可用性、审计功能。
配置中心一般包含以下组件。
常用的配置中心技术产品如下所示。
服务治理主要包括服务注册与发现、弹性伸缩、流量控制、灰度发布、任务调度等。
服务注册与发现指的是使用一个注册中心来记录分布式系统的全部服务信息,以便让其他服务能够快速找到这些已注册的服务。
服务注册与发现的本质是服务路由。服务路由可以分为直接路由和间接路由。
图例:服务注册与发现示意图
服务发现主要包括以下组件。
服务注册与发现需要考虑以下因素。
对于常见的服务注册与发现技术组件,业界已经有了很多成熟的方案。
弹性伸缩指的是在分布式集群中,通过服务探针、监控应用、服务状态,以及一些系统的指标,根据指定的规则自动调整服务实例的数量。
在传统的方式中,如果需要增加机器资源,需要找运维人员申请机器,然后部署好软件服务接入集群,整个过程依赖的是运维人员的自身经验,容易出错。比较理想的方式是通过一定的机制和工具,辅助我们自动进行弹性伸缩。
在弹性伸缩中,有两个核心,即扩容和缩容。
在扩容和缩容的过程中,需要结合很多服务的信息,充分结合应用的入口流量进行控制,让系统的入口流量和系统的负载达到一个平衡,一些扩容和缩容的指标参考如下。
在弹性伸缩的过程中,需要密切关注系统的稳定性,系统能够稳定地处理潜在的故障并从故障中恢复。在分布式系统中,瞬态和更永久性故障都是有可能的。为了保持弹性,必须快速、有效地检测故障并进行恢复,比如隔离、重试、限流降级、故障恢复等。
流量控制(Flow Control
)简称流控,根据流量、并发线程数、响应时间等指标,把随机到来的流量调整成合适的形状(流量塑形),从而提高系统的高可用防护能力。流控可能包括系统的不同层次,比如对网关入口、应用级别、服务依赖、系统资源等各个方面加以控制。
流控的根本目的是高可用,大型分布式系统对高可用有很高的要求,客户始终希望系统能提供7×24小时不间断服务。高可用(Availability
)的计算公式如下所示。
Availability = MTTF/(MTTF + MTTR)
影响系统可用性的指标主要有两个:
MTTF
(Mean Time to Failure
,不出故障的时间)MTTR
(Mean Time to Recovery
,出故障后的恢复时间)因此要提高系统的可用性,可以从两个方面入手:
业界通常用N个9来量化可用性,如“4个9(也就是99.99%)”的可用性,也就是,一年下来网站不可用时间约为53分钟(也就是不足1小时)。
可用性(通俗叫法) | 可用性比率 | 年度停机时间 |
---|---|---|
2个9 | 99% | 87.6小时 |
3个9 | 99.9% | 8.76小时 |
4个9 | 99.99% | 53.6分钟 |
5个9 | 99.999% | 5.36分钟 |
分布式系统是由不同组件构成的,包括复杂均衡、应用、缓存、消息、配置、数据库、存储、基础设施等;每个组件又有不同的技术,比如分布式应用可以使用SpringCloud
、Dubbo
或者HSF
;每种技术又有自己的特点,如性能、自动扩展、恢复、容灾。
总体来说,从流量控制角度,提高高可用的方法可以大致分为冗余、自愈、限流、降级等。
冗余。提升高可用最主要的方法是冗余,增加机器,分担压力,降低风险。同一服务部署在多台服务器上;同一数据存储在多台服务器上互相备份。当任何一台服务器宕机或出现不可预期的问题时,就将相应的服务切换到其他可用的服务器上。这样,即使单个机器出现问题,也不影响系统的整体可用性,从而保证业务数据不丢失。
自愈。自愈主要体现在系统出现问题时,系统快速恢复,不影响业务的可用性。自愈通用的方式是超时、重试、回滚、数据恢复等。
限流。限流类似于我们日常生活中的排队,比如在上下班高峰期的地铁站,上班族通过“蚊香”式排队等待地铁。限流的策略可分为限制访问的绝对数量和控制流速。限制总数可通过设置规则来实现,目前常见的限流算法有计数器限流算法、漏桶算法和令牌桶算法。在分布式系统中,限流可通过服务限流和资源隔离等方式实现。
降级。限流主要从应用服务提供者的角度进行保护,而降级主要从应用服务调用者的角度进行保护,因为调用者可能依赖后端很多服务,但有可能某一个服务经常异常、超时或出现数据错误,为了保护调用者,则对有异常的提供者进行降级。降级的具体实施既可以是代码自动判断,也可以是人工根据突发情况切换,一般可采用关闭非核心服务、降低一致性约束、简化功能等方式。具体地,降级可分为依赖降级和熔断降级。
在流量控制的过程中,需要把握一个总体原则,即“恢复业务优先原则”。线上业务故障,需要优先恢复业务,再分析问题。如果系统不能自动恢复,则应想尽一切办法进行限流、隔离或降级,比如下线有问题机器,对问题业务进行降级或资源隔离,在恢复业务后,再进行信息搜集(如日志、堆栈、抓包、截屏等),后续分析根因并优化系统。
为了更自动化地进行流量控制,可以构建统一的服务治理平台,一般包含以下几个部分。
流量控制常用的一些技术如下所示。
在分布式系统中,发布非常频繁,其中灰度发布是一种发布策略,其让我们的发布按照一定的策略和节奏进行。灰度发布技术适用于两个不同版本同时在线上并行的场景,既可用于业务试错,也可用于版本发布。
灰度发布需要解决两个方面的问题:
图例:灰度发布示意
灰度发布是一种部署策略,从不同版本发布节奏及流量状态方面,我们也常用一些其他的术语来表达,比如停机部署、滚动发布、蓝绿部署、A/B测试等,这些术语有所不同,这里不做详细说明,但本质都是对不同版本应用服务升级的部署策略。
任务调度是分布式系统不可缺少的一个环节,传统的方式是在Linux机器上配置定时任务或者直接在业务代码里面完成调度业务,现在多用成熟的中间件来代替。
任务调度需要支持灵活的任务处理能力,定时的调度器,比如Cron规则、固定延迟、时区、日历等;支持可视化的任务编排,解决任务有前后依赖的情况;支持多种语言(如Java、Python),同时支持静态分片,提供Java动态分片,支持失败自动重试,还可以在控制台手动原地重试,并且具备丰富的报警功能,比如任务失败报警、超时报警、服务缺失报警。
一些通用的任务调度中间件如下所示。
分布式系统是由多个机器共同协作的,同时网络无法保证时刻可用,因此需要建设一套能够监控的系统,从底层到业务各个层面进行监控,并基于监控及时修复故障。监控一般包括收集、处理和汇总,并且显示关于某个系统的实时量化数据,如请求的数量和类型、错误的数量和类型,以及处理用时、应用服务器的存活时间等。
从监控能力层次上,一般我们可以从以下方面对系统进行监控。
日志(Logging)、指标(Metrics)、追踪(Tracing)是监控体系的核心元素。
日志、指标、追踪的关系如图7-15所示。这三个概念并不是相互独立的,往往一个监控体系都会涉及一些。APM(应用性能管理)系统便是三者一体化的解决方案,充分理解三者的关系,可以更好地理解监控的本质,以及更好地定位开源和商业化监控工具。
监控系统的一些通用原则如下所示。
基础监控常用的技术工具如下。
企业系统每天会产生海量日志,日志信息增长迅速。为了解决信息存储容量、数据安全、日志搜索分析等问题,需要分布式日志监控系统来进行发掘、分析、判断并形成定性或定量描述。
日志系统一般需要包含以下组成部分。
一些常用的日志分析工具如下。
针对分布式系统复杂的调用链路,如何快速、准确地定位服务异常位置?如何跟踪处理结果?如何将技术与业务异常高效结合?这需要分布式调用链路的监控。
分布式调用链路把调用过程记录下来,关注各个调用的性能指标,比如吞吐量、响应时间及错误记录等。调用链路从整体维度到局部维度展示各项指标,将跨应用的所有调用链性能信息集中展现,方便度量整体和局部性能,找到故障产生的原因,缩短故障排查时间。
在链路追踪的历史中,关键事件是2010年Google Dapper论文的发表,之后各个厂商依据Dapper纷纷研发了自己的调用链监控工具,比如携程的CTrace,韩国公司Naver的PinPoint,Twitter的Zipkin,阿里巴巴的Eagleye,京东的Hydra。接着产生了调用链监控的标准规范Open Tracing,目的是通过兼容、统一的API来进行链路追踪,Uber的Jaeger、Apache SkyWalking也均符合Open Tracing规范。
调用链每个请求生成一个全局TraceID,通过TraceID可以连接起整个调用链。此外,SpanID用于记录调用复杂关系,整个调用过程中每个请求都要透传TraceID和SpanID。所有这些ID可用全局唯一的64位整数表示。每个服务将该次请求附带的TraceID和附带的SpanID作为Parent ID,并且记录自己生成的SpanID。要查看某次完整的调用只要根据TraceID查出所有调用记录即可。
图例: 调用链示意图
一个通用的链路处理,一般采用这样的架构和技术组件。整个过程是对调用链数据定义、生成、采集、计算、存储的过程。
图例: 通用的调用链组件架构
比如采用ELK和HBase,通过Agent生成调用链日志,通过Logstash采集日志到MQ;MQ负责提供数据给下游消费,Storm计算汇聚指标交给Elasticsearch,Logstash将MQ的数据明细给到HBase中,根据TraceID作为行键进行快速查询。  常用的链路最终方案如下所示。
APM
的全称是Application Performance Management
,指的是对应用程序的性能和可用性的监控管理。
APM是伴随着云技术、微服务架构发展起来的一个新兴监控领域。
在国内外,无论是开源的Apache SkyWalking、云厂商(如AWS、Azure等),还是独立的公司(Dynatrace、Appdynamics等),都有着非常优秀的APM产品,比如阿里云的ARMS。
目前,人们对APM的要求越来越高,比如分布式追踪、非侵入式的语言探针、轻量化、低延时分析,这些是对APM提出的进一步要求。
展示了APM的主要能力,一般包括以下几项。
分布式系统的性能指标,一般包括以下几个方面。
性能优化是一个系统工程,是无止境的,需要有明确的目的和思路,并结合实际的业务来进行,这里给出一些通用的参考。
从技术角度,性能问题可能发生在系统的网络、服务端(基础设施、操作系统、中间件、数据库)、客户端,可以采用如图7-19所示的方法。
JDBC
)。图例:性能优化分析方法
性能优化的一些通用工具如下。
Dashboard
——当前系统的实时数据面板。Monitor
——方法执行监控。Trace
——方法内部调用路径,并输出方法路径上的每个节点上耗时。Stack
——输出当前方法被调用的路径。tt
——方法执行数据的时空隧道,记录下指定方法每次调用的入参和返回信息,并能对这些不同的时间下调用进行观测。分布式消息队列系统是消除异步带来一系列复杂步骤的一大利器,通过消息队列既可以解耦系统,又可以削峰填谷等。在消息服务中,消息是由生产者创建的数据,并且会被分发出去,由消费者接收并进行进一步处理。
生产者和消费者之间通过消息代理(又称消息传递中间件)进行通信。
图例:消息服务示意图
消息队列使用的应用场景如下所示。
从技术角度,消息服务具备高性能、高可用、高可靠等特点。
一些常见的消息队列技术或产品如下。
微服务框架本身是一个体系的框架,包括负载均衡、配置管理、服务注册与发现、服务安全、分布式监控、流量调度与容错、弹性伸缩、任务调度等多方面,一个稳定的微服务框架可以简化开发管理和技术选型,一些常用的微服务框架如下。
下面从最佳实践角度,介绍技术架构中一般需要考虑的设计点。
一致性在分布式架构,特别在微服务架构中特别重要。我们先来看看一致性的通用理论,再看看一些常见的一致性方案。
强一致性的保障,比如传统单机数据库内的事务一致性,强一致性的模型有Paxos、Raft、Zab等。强一致性主要由四部分特性组成。
CAP指的是在一个分布式系统下,包含三个要素。
在分布式系统中,CAP不能完全兼容,P一般是客观存在的(如果没有分区,也就不是分布式系统),因此需要在AP和CP中进行取舍。
BASE理论主要是解决CAP理论中分布式系统的可用性和一致性不可兼得的问题。BASE理论包含以下三个要素。
BASE理论与ACID不同,满足CAP理论,通过牺牲强一致性来保证系统的可用性。由于牺牲了强一致性,系统在处理请求的过程中,数据可以存在短时的不一致。系统在处理业务时,记录每一步的临时状态。当出现异常时,根据状态判断是否继续处理请求或者退回原始状态,从而达到数据的最终一致。
弱一致性的模型有DNS和Gossip协议。
在分析了通用的一致性理论后,这里介绍几种提高一致性的方法。
图例:基于消息的最终一致性
这里解释一下幂等(Idempotence),幂等是一个数学与计算机学概念,常出现于抽象代数中,公式为f(x)=f(f(x))
。
一个幂等方法指的是在其入参相同时执行1次与执行N次的影响相同,返回结果相同,也就是说重复执行该方法不会影响系统状态,也不用担心重复执行会对系统造成改变。
幂等的方案可以通过发送方创建唯一ID,或者放入业务ID来实现;消费方增加一个过滤服务,每处理一个事件都会通过存储这个事件ID来实现,看是否已经消费过。
分布式系统指的是多个机器之间通过网络进行交互,实现一个共同目标。
分布式集群指的是一个特定领域的软件部署在多台服务器上,并作为一个整体提供一类服务,这里简称集群。
图例:分布式集群
在分布式系统中,需要我们关注以下几个方面的内容。
在分布式集群中,最基本的是双机架构和集群架构,而双机架构又分为主备架构、主从架构和主主架构。
在主备架构中,备机起到备份作用,不承担实际的业务读写。在故障发生后,需要人工把备机改为主机。
主从架构与主备架构类似,区别在于从机一般可以提供读操作。
可以看出,主备架构和主从架构在机器发生故障后,无法提供写操作,并且需要人工干预来恢复主机角色。这就需要“双机切换”,工程中需要考虑什么时候备/从机需要升级为主机(如RT过高、重启次数过多),如何切换(如自动、白屏、后台),如何通知Client主机的变化(如手动更改)等问题。其中,主机和备/从机的状态传递和判断尤为重要,一般来说,可以由第三方执行,有时也会由机器自己进行状态传递和判断。
主主架构又称双主架构,两台机器同时提供读和写操作。
集群架构主要是在双机架构的基础上,增加了备机、从机或其他主机的个数,大体可以分为一主一从、一主一备、一主多从、一主多备、多主等情况。在集群架构中,重点需要考虑以下几个方面。
图例:集群架构
如今,稳定性越来越受到各个企业的重视,稳定性在业界又称可靠性,网站可靠性工程的英文是SRE(Site Reliability Engineering)。一些互联网公司习惯用“安全生产”来进行稳定性保障。SRE最早由Google提出并应用,近几年逐步被国内外互联网公司广泛应用。我们先来看看Google的SRE,根据其Site Reliability Engineering一书提及的内容来看,SRE核心是通过监控、应急响应、复盘、压测、容量评估,综合指导系统的研发及最终产品交付的稳定性。
图例:SRE金字塔
稳定性保障过程与研发过程有所区别,强调快速定位问题,协调相关人投入排查,评估影响面,快速决策恢复手段。过程中需要重点关注基础设施容量规划、全链路压测、生产系统的监控告警和负载均衡、发布和变更管理、On-Call(轮值)与Firefighting(紧急故障救火),以及与业务团队和开发团队协作,共同完成疑难问题的紧急处理。
康维定律指出“设计系统的架构受制于产生这些设计组织的沟通结构”,在实践过程中,建议构建独立的SRE团队。
在一些重要节点(比如大促保障过程)中,需要关注以下方面。
容灾系统指的是在不同的地方建立两套或多套功能相同的系统,互相之间可以进行功能切换,以在发生意外时,整个应用系统可以切换到另一处,使得该系统可以继续正常工作。容灾技术是系统的高可用性技术的一部分,容灾系统更强调节点级别的恢复功能。
从对系统的保护程度角度,可以将容灾系统分为以下几种。
衡量容灾系统的两项技术指标如下。
RPO针对的是数据丢失,而RTO针对的是服务丢失,二者没有必然的关联性。RPO和RTO必须在进行风险分析和业务影响分析后根据不同的业务需求确定。
从容灾系统的物理分布角度,可以将容灾系统分为同城容灾、异地容灾,生产数据中心、同城灾备中心、异地灾备中心(三中心)等多种容灾处理方式,这需要结合成本性能、业务场景、技术演进等进行选择。
可扩展性(Scalability)是技术架构中需要考虑的典型非功能性需求,是用来描述系统应对负载增长能力的术语,设计良好的代码允许更多的功能在必要时可以被插入到适当的位置中。这样做的目的是应对未来可能需要进行的修改,但这造成代码被过度工程化地开发。
可扩展性可以采用不同的开发方式,比如动态加载的插件SPI方式、抽象接口的类层次结构、回调函数构造、可塑性强的代码结构、基于服务的API方式、基于组件的开发方式、基于配置的开发模式。 目前,低代码(Low-Code)开发也是一种趋势,它提供了一种可视化的高可扩展性的框架能力。
Low-Code为开发者提供了一个创建应用软件的开发环境,与传统代码集成开发环境不同的是,Low-Code开发平台提供的是更高维和易用的可视化集成开发环境。在大多数情况下,开发者并不需要使用传统的手写代码方式进行编程,而是可以通过图形化拖曳、参数配置等更高效的方式完成开发工作。
在Low-Code的指导思想下,这里推荐其中比较理想的提高可扩展性的方法。
无状态(Statelessness)指的是服务内部变量值的存储。有状态的服务伸缩起来非常复杂,因此可以通过将服务的状态外置到数据库、分布式缓存中,使服务变得无状态。有状态的应用会带来很多不便,比如在弹性扩展、配置变更、节点宕机重启、更换负载节点等过程中,可能导致数据不一致、不可维护等多方面问题。
无状态不代表状态消失,只是尽量减少或者把状态转移到分布式场景中。那么,我们通过什么方式来做到无状态?这里推荐几种方式。
为了测试系统的性能,我们往往需要进行压测,特别是以下场景。
压测过程涉及以下概念。
为了反映真实的业务承接能力,压测的过程中需要特别关注线上环境、用户规模、测试场景、数据量级、流量来源等,尽量做到压测和真实环境一致或等比例。
PTS压测流程,主要流程如下。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。