文章目录
- Pre
- 原始分布式时代的核心内容
-
- [1. 背景与起源](#1. 背景与起源)
- [2. 分布式系统的初步探索](#2. 分布式系统的初步探索)
- [3. 分布式计算环境(DCE)](#3. 分布式计算环境(DCE))
- [4. 技术挑战与困境](#4. 技术挑战与困境)
- [5. 原始分布式时代的失败与教训](#5. 原始分布式时代的失败与教训)
- [6. 未来展望](#6. 未来展望)
- 单体架构的特点与应用
- SOA架构
-
- [1. SOA架构及其背景](#1. SOA架构及其背景)
-
- [1. 烟囱式架构(Information Silo Architecture)](#1. 烟囱式架构(Information Silo Architecture))
- [2. [微内核架构](https://www.oreilly.com/content/software-architecture-patterns/)(Microkernel Architecture)](#2. 微内核架构(Microkernel Architecture))
- [3. [事件驱动架构](https://www.oreilly.com/content/software-architecture-patterns/)(Event-Driven Architecture)](#3. 事件驱动架构(Event-Driven Architecture))
- [2. SOA的核心组件和技术特征](#2. SOA的核心组件和技术特征)
- [3. SOA的优势和局限性](#3. SOA的优势和局限性)
- [4. SOA在软件架构演进中的作用与影响](#4. SOA在软件架构演进中的作用与影响)
- 微服务时代
- 后微服务时代
-
- 微服务架构中的挑战
- [虚拟化技术的崛起与 Kubernetes 的胜利](#虚拟化技术的崛起与 Kubernetes 的胜利)
- 基础设施与服务网格的融合
- 展望未来:云原生与后微服务时代的前景
- [无服务时代 Serverless](#无服务时代 Serverless)
Pre
软件架构并不是一蹴而就的,而是一个持续演进的过程。在这个过程中,许多名词和术语逐渐形成并发展。我们可以从历史的角度来分析这些概念的起源,探讨它们的定义、替代关系以及成功与失败的原因。
原始分布式时代的核心内容
1. 背景与起源
- 20世纪70年代末至80年代初,计算机科学从大型机转向微型机。计算机逐渐从研究设备转变为企业和个人的生产和娱乐设备。
- 硬件限制 :微型计算机的硬件性能有限,单台计算机无法支持更大规模的信息系统。因此,各大高校、研究机构、软硬件厂商开始探索多台计算机协作支持软件系统运行的可能性。
2. 分布式系统的初步探索
- UNIX分布式设计哲学:强调保持接口与实现的简单性,比系统的任何其他属性都更重要。
- 该时期的分布式探索是计算机科学的早期尝试,很多中间成果对后续的软件架构演进产生了深远的影响:
- Network Computing Architecture (NCA):远程服务调用的雏形。
- Andrew File System (AFS):早期分布式文件系统。
- Kerberos协议:服务认证和访问控制的基础性协议,至今仍被广泛使用。
3. 分布式计算环境(DCE)
- 开放软件基金会 (OSF) 制定了分布式计算环境 (DCE) ,包含了一套完整的分布式服务组件规范与参考实现:
- DCE/RPC:源自NCA的远程服务调用规范。
- DCE/DFS:源自AFS的分布式文件系统规范。
- UUID:在DCE中发明,用于标识唯一对象。
4. 技术挑战与困境
- 透明化与简单化的挑战 :UNIX设计哲学强调透明化和简单化,但实际实现过程中,远程服务调用与本地方法调用的复杂性差异巨大。
- 网络问题:服务发现、负载均衡、网络分区、超时、服务出错等问题。
- 性能差异:远程调用的速度与本地调用存在数量级的差距,且远程方法无法依赖传统编译优化来提升速度。
- 设计妥协:为了提高运行效率,开发者不得不在编写分布式程序时考虑各种特殊技巧,导致透明化和简单化的目标未能实现。
5. 原始分布式时代的失败与教训
- DCE和CORBA等尝试最终未能成功,分布式架构的复杂性超过了其带来的收益。
- Kyle Brown的评价:分布式操作并不总是必要的,强行追求透明化只会带来不必要的复杂性。
- 后续演进:随着摩尔定律的推进,硬件性能的提升使得单体架构在较长时间内成为主流,但对分布式计算的探索始终未曾中断。
6. 未来展望
- 尽管早期的分布式愿景未能实现,但随着分布式架构的成熟和完善,特别是在2016年服务网格重新提出透明通信时,分布式系统的简单透明化愿景再次被拾起,并最终得以实现。
单体架构的特点与应用
单体架构(Monolithic Architecture)是指所有应用程序组件被组合成一个单一的可执行文件或应用程序。不同模块之间的调用都是进程内调用,这意味着它们共享同一个进程空间,避免了进程间通信带来的复杂性和性能损耗。单体架构通常以单层架构为主,应用程序的各个功能模块之间紧密耦合,通常由同一技术栈构建。
优势
- 简单性:单体架构的设计和开发相对简单,特别是在小型项目中。这种架构风格的学习曲线较低,且广泛应用于教育和初级开发者的学习中。
- 高效性:由于所有模块运行在同一进程内,单体架构避免了进程间通信(IPC)的开销,使其在性能上具有优势。
- 易于测试和部署:单体应用通常可以作为一个整体进行测试和部署,减少了版本管理和部署的复杂性。
缺陷
- 扩展性:随着系统规模的扩大,单体架构的模块化和扩展能力变得越来越有限。代码库膨胀、模块耦合度增加,导致维护和扩展难度增加。
- 隔离与自治能力不足:单体架构下,应用的所有部分共享同一进程空间,导致某个模块的问题可能影响整个系统。例如,内存泄漏或线程问题可能会导致整个应用程序崩溃。
- 难以技术异构:由于所有代码共享同一进程空间,通常要求使用相同的编程语言和框架,限制了技术栈的灵活性。
单体架构与微服务架构的关系
单体架构是软件架构发展中的早期形态,其广泛应用直到今天。然而,随着系统规模的扩大和对高可用性、可扩展性的要求增加,单体架构在大型系统中的不足逐渐显现。这促使开发者探索新的架构风格,例如微服务架构(Microservices Architecture)。
微服务架构通过将单体系统拆分为多个自治的、松耦合的服务,解决了单体架构中的许多问题,如可扩展性和技术异构性。同时,微服务架构允许每个服务独立开发、部署和维护,进一步提升了系统的灵活性和可靠性。
然而,微服务架构也带来了新的挑战,例如分布式系统的复杂性、服务间通信的开销等。因此,选择单体架构还是微服务架构,取决于项目的规模、团队的能力和系统的实际需求。
总结
单体架构仍然是许多小型应用和初创项目的首选,特别是在开发资源有限或系统复杂度较低的情况下。尽管单体架构在大型系统中面临挑战,但它依然是一种有效的架构风格,特别是在系统规模相对较小、技术栈统一的场景下。随着软件系统的演进,单体架构与微服务架构的选择应该根据具体需求进行权衡。
SOA架构
1. SOA架构及其背景
在大型单体系统进行拆分的过程中,开发者们尝试了多种架构模式以应对系统规模、复杂度和灵活性等挑战。以下是三种较为代表性的架构模式:
1. 烟囱式架构(Information Silo Architecture)
概念 :
烟囱式架构,也称为信息孤岛架构,是一种完全独立的设计模式,每个系统独立运行、独立维护,不与其他系统进行互操作或协作。这样的系统往往在不同部门或业务领域内单独开发和部署。
特点:
- 独立性:各系统之间没有交互,甚至没有任何共享数据或服务。
- 简单性:由于系统之间没有耦合,开发和部署较为简单,风险较低。
- 缺乏协同:这种独立性导致系统之间的数据和业务逻辑无法共享,容易形成信息孤岛。
局限性 :
烟囱式架构虽然简单易行,但在现代企业中几乎不存在完全不交互的系统。企业内部的不同部门或系统往往需要共享一些公共的数据,如人员、组织、权限等。烟囱式架构忽视了这种需求,导致了系统间的割裂,无法满足实际业务需求。
2. 微内核架构(Microkernel Architecture)
概念 :
微内核架构是一种插件式架构,它将核心的公共服务、数据和资源集中到一个内核系统中,具体的业务功能以插件模块的形式存在。这些插件可以独立开发、部署和更新,同时依赖于公共的内核系统。
特点:
- 可扩展性:通过插件的形式,可以灵活地添加新功能或特性。
- 模块化:业务功能被分解为多个独立的插件,降低了系统的复杂性。
- 隔离性:各个插件模块之间通常是独立的,减少了耦合度。
局限性 :
微内核架构的假设是各个插件之间互不认识,也不可预知系统将安装哪些模块。因此,插件可以访问内核中的公共资源,但不直接交互。这种假设在实际企业信息系统或互联网应用中并不总是成立,尤其是在需要子系统间频繁通信的场景中,微内核架构可能无法完全满足需求。
3. 事件驱动架构(Event-Driven Architecture)
概念 :
事件驱动架构通过在子系统之间建立一套事件队列管道,各个子系统可以发布、订阅和处理事件消息。子系统通过事件管道进行解耦,同时又能相互通信和协作。
特点:
- 解耦:系统高度解耦,每个子系统可以独立处理事件。
- 灵活性:子系统可以根据需要订阅自己感兴趣的事件,也可以发布新事件。
- 可扩展性:通过增加事件类型或子系统,系统可以灵活扩展。
局限性 :
事件驱动架构的实现复杂度较高,事件的处理顺序和依赖关系需要仔细设计。此外,由于事件管道的异步特性,系统的调试和问题排查也更加复杂。
这三种架构模式各有其适用场景和局限性。烟囱式架构适合在系统之间几乎没有交互需求的场景;微内核架构适合在功能模块化、需要频繁扩展和更新的场景;而事件驱动架构则适合在系统之间需要高效、松耦合的通信和协作的场景。
在实际应用中,开发者往往需要根据具体的业务需求和技术条件,选择合适的架构模式,甚至将多种架构模式结合起来使用,以实现最佳的系统设计。
SOA(Service-Oriented Architecture,面向服务的架构)是为了应对复杂分布式系统中的集成与互操作性挑战而提出的一种架构风格。SOA的核心思想是将系统功能划分为独立的服务,通过松散耦合的方式使这些服务能够独立开发、部署和维护。
2. SOA的核心组件和技术特征
SOA的实施依赖于以下几个关键技术组件和概念:
- SOAP(Simple Object Access Protocol):一种轻量级的协议,用于在网络上交换结构化信息,通常与WSDL(Web Services Description Language)和UDDI(Universal Description, Discovery, and Integration)共同使用。
- ESB(Enterprise Service Bus):企业服务总线,用于在不同服务之间传递消息,实现服务间的松散耦合。
- SCA(Service Component Architecture):服务组件架构,定义了服务的封装形式和运行容器。
- SDO(Service Data Object):服务数据对象,用于标准化服务之间的数据访问和表示。
3. SOA的优势和局限性
优势:
- 松散耦合:服务可以独立开发和部署,降低了系统的复杂性。
- 标准化:通过标准协议(如SOAP),实现跨平台、跨语言的服务互操作。
- 可重用性:服务可以被不同的应用程序复用,提升开发效率。
局限性:
- 复杂性:由于需要遵循严格的标准,SOA的实施往往涉及大量的配置和管理,增加了系统的复杂度。
- 性能开销:SOAP等协议的使用,带来了额外的性能开销,尤其是在高并发场景下。
- 过度抽象:SOA试图通过一套统一的标准解决所有问题,但这种"一刀切"的方法在实际应用中往往缺乏灵活性。
4. SOA在软件架构演进中的作用与影响
SOA标志着软件架构从单体式向分布式系统转变的重要一步。尽管SOA未能成为普遍采用的架构风格,但它提出的松散耦合、服务重用等理念在后来的微服务架构中得到了继承和发展。SOA的经验教训为现代分布式系统的设计提供了重要的借鉴,促使架构师们更加注重简化和灵活性,避免过度复杂化的设计。
微服务时代
微服务架构(Microservices)是一种强调灵活性、独立性和分散治理的软件开发方法。它将一个大型应用程序拆分为多个小型服务,这些服务可以独立开发、部署和扩展。微服务架构允许每个服务使用不同的技术栈,根据业务需求进行定制,避免了传统单体架构中可能存在的技术和组织上的瓶颈。
微服务的起源与演变
微服务的概念虽然可以追溯到2005年,但它在最初几年并未引起广泛关注。微服务的发展历程与SOA(面向服务架构)紧密相关,甚至可以说微服务是SOA的一种演变形式。然而,随着时间的推移,微服务逐渐脱离了SOA的影子,成为一种独立的架构风格。
2014年,Martin Fowler和James Lewis发表了《Microservices: A Definition of This New Architectural Term》,正式为现代微服务奠定了理论基础。这篇文章中,作者明确了微服务的九个核心特征,强调了围绕业务能力构建、分散治理和独立自治等关键原则。
微服务的核心特征
-
围绕业务能力构建:服务是围绕业务需求设计的,团队的组织架构也应与业务需求相匹配。
-
分散治理:每个服务的开发团队可以自由选择适合的技术栈和工具,减少外部干预。
-
服务化组件:组件通过服务的方式进行通信,确保各服务的独立性和自治性。
-
产品化思维:开发团队不仅关注功能实现,还要关注服务的整个生命周期,包括运维和用户反馈。
-
数据去中心化:数据按领域进行分散管理,避免中心化存储带来的依赖和一致性问题。
-
强终端弱管道:提倡轻量级的通信方式,减少对复杂中间件的依赖。
-
容错性设计:设计时考虑到服务可能会出错,提供自动化的故障检测和恢复机制。
-
演进式设计:接受服务会被淘汰的现实,设计时要允许服务的替换和更新。
-
基础设施自动化:依赖于CI/CD等自动化工具,以应对大规模服务的部署和运维挑战。
微服务的优势与挑战
微服务架构提供了极大的自由度,但也带来了新的挑战。架构师在设计微服务系统时,面临的决策和权衡比以往任何时候都要复杂。微服务的自由度允许开发者根据业务需求和团队技术熟练度灵活选择工具和技术,但同时也要求架构师具备更广泛的知识面和决策能力。
微服务在解决了单体架构中的一些瓶颈问题的同时,也重新引入了分布式系统中的一些经典问题,如服务发现、负载均衡、故障隔离和数据一致性等。这些问题在微服务架构下没有统一的解决方案,要求架构师根据实际情况做出权衡。
微服务时代的未来
微服务架构虽然提供了高度的自由,但这种自由也是一把双刃剑。未来的架构探索可能会寻求在不牺牲灵活性的前提下,减少分布式系统中固有的复杂性和管理负担。理想的架构应该能够同时满足业务驱动的灵活性和技术标准的统一性,为开发者提供更加简便和高效的工具和平台。
后微服务时代
在后微服务时代,软件和硬件之间的界限变得模糊,解决分布式架构中的各种问题不再局限于软件层面,硬件基础设施也参与其中。这种软硬件合力的模式可以称为"云原生"时代。云原生不仅是一种架构理念,更是对微服务架构的继承与升华。
微服务架构中的挑战
分布式系统的典型问题如服务发现、负载均衡、配置管理、安全性、监控、伸缩等,早在 SOA 时代甚至更早期的分布式系统中就已经存在。传统上,这些问题通常通过专用的硬件设施来解决,例如使用负载均衡器进行流量分发,使用 DNS 进行服务发现,或通过硬件防火墙提供安全保障。然而,随着软件架构的灵活性提升,单靠硬件设施已难以满足动态变化的需求。这催生了微服务架构下,基于软件的解决方案。
虚拟化技术的崛起与 Kubernetes 的胜利
随着虚拟化技术的发展,尤其是 Docker 容器技术的普及,软件层面的分布式问题开始得到解决。容器技术提供了一个轻量级的服务运行环境,使得应用可以快速部署和伸缩。而真正标志着后微服务时代到来的,是 Kubernetes 在 2017 年容器编排战争中的胜利。Kubernetes 提供了一套基础设施层面的解决方案,如服务发现、负载均衡、配置管理、自动伸缩等功能,逐步取代了传统微服务架构中 Spring Cloud 提供的应用层面的解决方案。
基础设施与服务网格的融合
然而,Kubernetes 并非万能,特别是在一些需要精细化处理的场景下,基础设施的粒度过于粗糙,难以完全替代应用层面的控制。例如,在微服务的熔断、监控、认证授权等方面,Kubernetes 的功能并不如 Spring Cloud 精细。为此,虚拟化基础设施引入了服务网格(Service Mesh)技术,通过边车代理(Sidecar Proxy)模式,在不修改应用代码的情况下,实现更精细的服务治理功能。
服务网格的核心思想是在每个服务实例旁边部署一个代理,负责接管服务的所有通信。这些代理不仅处理数据平面的通信,还与控制平面通信相互配合,实现动态的流量控制、监控、认证、负载均衡等功能。这种模式使得微服务架构中的许多问题可以从应用代码中剥离,交由基础设施层面的服务网格来处理,从而实现业务与技术的彻底分离。
展望未来:云原生与后微服务时代的前景
在未来,Kubernetes 很可能成为服务器端标准的运行环境,而服务网格则会成为微服务通信的主流模式。业务逻辑与技术细节将彻底分离,开发者只需专注于业务本身,而不必为分布式架构的复杂性所困扰。这将是一个更为成熟、稳定的架构时代,真正实现"上帝的归上帝,凯撒的归凯撒",即业务与技术的完全分离。
无服务时代 Serverless
无服务架构(Serverless)是近年来云计算领域中迅速崛起的一种架构风格。它的核心理念是将开发者从管理底层基础设施的繁杂任务中解放出来,让他们能够更加专注于业务逻辑的开发。
背景与起源
无服务架构的起源可以追溯到2012年,Iron.io 公司首次提出了"无服务"的概念。2014年,亚马逊推出了Lambda服务,这标志着无服务架构进入了商业化阶段,并逐渐被开发者所接受。此后,无服务架构成为了云计算发展的重要方向之一,不仅是工业界,学术界也在2019年UC Berkeley发表的论文中预言"无服务将会发展成为未来云计算的主要形式"。
概念与特点
无服务架构主要包括两大核心内容:
- 后端设施(Backend as a Service,BaaS):这是指数据库、消息队列、日志、存储等支持业务逻辑运行的技术组件,它们运行在云端,并由云服务商托管和管理。
- 函数(Function as a Service,FaaS):这是指开发者编写的业务逻辑代码,这些代码以函数的形式运行在云端,云服务商会自动管理这些函数的部署、扩展和执行。
无服务架构的主要优势包括:
- 降低开发和运维成本:开发者不需要关心底层基础设施的管理、扩展或维护,只需专注于业务逻辑的开发。
- 弹性扩展:无服务架构依托于云服务商的庞大资源池,可以在需求高峰时自动扩展,也能在需求低谷时减少资源占用。
- 按使用量付费:无服务架构通常按照函数的执行时间和内存消耗进行计费,这种模式使得开发者能够更加精细地控制成本。
适用场景与局限性
无服务架构在以下场景中表现尤为出色:
- 短链接、无状态、事件驱动的应用:如Web资讯类网站、小程序、公共API服务、移动应用服务端等,这些场景下无服务架构的优势能够得到充分发挥。
- 离线大规模计算:不需要实时交互的计算任务,也非常适合无服务架构。
然而,无服务架构也存在一些天然的局限性:
- 业务逻辑复杂、依赖服务端状态的应用:例如信息管理系统、网络游戏等,由于无服务架构的冷启动时间和短暂的运行生命周期,这些应用不太适合在无服务架构下实现。
- 响应速度要求高的应用:无服务架构中的冷启动时间会对响应速度产生负面影响,尤其是对启动性能较差的语言如Java,冷启动时间甚至可能接近秒级。
展望与总结
无服务架构尽管有着光明的前景,但在短期内可能仍然难以全面取代其他架构形式。然而,随着云计算的不断发展,无服务架构将成为未来软件开发中的重要一环,尤其是在与微服务架构等其他架构形式融合使用时。
无论是通过物理机、虚拟机、容器,还是无服务云函数,未来的微服务实现方案将更加多样化,这也意味着软件开发的未来将是多种架构风格并存、相互融合的形态。