当然,业务在企业信息化建设过程中,遇到各种头痛棘手的问题:
开发建设的系统代码结构混乱,功能调整复杂,改了A功能,又影响了B功能信息系统重复建设,系统反复重构,造成资金大量浪费建设的系统非常不稳定,用户量稍微大一点就出现系统慢,甚至宕机无法提供服务以上都是因为不了解软件系统架构,选择和不合适的架构风格而造成的各种问题,实际过程中因此而造成的问题远不止这些。这些问题在中小微企业中非常严重,哪怕是很多软件企业,也都是深受困扰。

作者撰写本文的主要目的并不是为了让读者能够深入掌握各种软件架构的专业技能(因为软件架构是一个复杂且系统化的专业事情),而是让读者能够对软件架构有个基本的概念,知道看似相同的软件背后,其实是有着不同的架构设计,不同的软件架构也是深刻影响这软件的正常运行,不同规模、性质的企业所需要的软件架构风格也不尽相同。
2.软件架构演进过程根据软件系统架构在不同时期、不同需求下,大概经历了如下图所示的几个典型的架构发展历程:
为了能够更容易理解不同架构风格,让我们以餐厅为例,来说明软件架构的演变过程,从单体架构到RPC、SOA、微服务以及服务网格架构。
单体架构(Monolithic Architecture)单体架构就像一个传统的餐厅,所有的功能和服务都集中在一个应用程序中。餐厅有一个大厨房,负责准备所有的菜品,并有一个前台来接待客人。所有的功能都在同一个应用中,例如点餐、烹饪、服务和结账等。这种架构简单直接,但随着餐厅规模的增长,会变得复杂和难以维护。
RPC架构(Remote Procedure Call)RPC架构就像一个连锁餐厅,每个分店都有自己的厨房和前台,但它们之间可以相互通信。每个分店可以通过电话或其他方式向总部的配送中心订购原材料,然后进行独立的运营。这种架构使得分店之间可以协作和共享资源,但仍然依赖于中心化的配送中心。
SOA架构(Service-Oriented Architecture)SOA架构就像一个餐饮集团,它由多个不同的餐厅品牌组成,每个品牌都有自己的特色菜品和服务。每个餐厅都是一个独立的服务,可以通过定义的接口来与其他餐厅进行通信。例如,一个餐厅可以提供订座服务,另一个餐厅可以提供外卖服务。这种架构提供了更好的模块化和可扩展性,但仍然需要中心化的管理和协调。
微服务架构(Microservices Architecture)微服务架构就像一个餐饮街区,每个餐厅都是一个独立的微服务,负责特定的功能。每个餐厅都有自己的厨房和服务员,可以独立开发、部署和扩展。它们通过网络进行通信,可以相互协作和共享资源。例如,一个餐厅可以负责点餐,另一个餐厅可以负责烹饪,它们可以通过API进行通信。这种架构提供了更高的灵活性和可伸缩性,但也增加了一些管理和协调的挑战。
服务网格架构(Service Mesh Architecture)服务网格架构就像一个餐饮街区里的导航系统,它提供了对所有餐厅的统一管理和控制。导航系统可以监控每个餐厅的运行情况,进行流量管理、负载均衡和故障恢复等操作。它还可以提供安全认证、日志记录和监控等功能。这种架构使得服务之间的通信更加简化和可靠,但也增加了一些复杂性和运维成本。
总的来说,软件架构的演变过程就像从一个传统的单体餐厅到连锁餐厅、餐饮集团、餐饮街区,最后到拥有导航系统的服务网格。每个阶段都有其优点和挑战,根据应用的需求和规模选择合适的架构是非常重要的。
3.不同软件架构简介3.1 单体架构(Monolithic Architecture)
单体架构(Monolithic Architecture)是一种相对老旧的软件架构风格,它将整个应用程序作为一个单一的、独立的单元进行开发、部署和运行。
在单体架构中,应用程序的所有功能和组件都集中在一个应用程序中。这个应用程序通常由一个单一的代码库组成,包含所有的业务逻辑、数据访问、用户界面等功能。所有的模块和组件共享同一个运行环境和资源。
单体架构的特点包括:
单一应用整个应用程序作为一个单一的、独立的单元进行开发和部署。
集中开发所有的功能和组件都在同一个代码库中开发,开发团队共同负责整个应用程序。
共享资源所有的模块和组件共享同一个运行环境和资源,包括数据库连接、内存和处理能力等。
简单部署整个应用程序作为一个整体进行部署,通常只需要部署一个应用服务器。
单一技术栈整个应用程序通常使用相同的技术栈和编程语言。
单体架构的优势包括:
简单性单体架构相对简单,易于理解和开发。
部署简单整个应用程序作为一个整体进行部署,部署过程相对简单。
性能优化由于所有的组件共享资源,可以进行更好的性能优化。
然而,单体架构也有一些限制和挑战:
可维护性随着应用程序规模的增长,单体架构变得更加复杂和难以维护。
扩展性由于所有的组件共享资源,扩展整个应用程序变得困难。
技术选型限制整个应用程序通常使用相同的技术栈,限制了团队在选择技术和工具方面的灵活性。
快速迭代由于整个应用程序作为一个整体进行开发和部署,快速迭代和部署变得困难。
单体架构适用于以下应用场景:
小型应用当应用规模相对较小,功能相对简单时,单体架构是一种简单有效的选择。它可以快速开发、测试和部署,适用于快速迭代和验证概念的初创公司或小型团队。
简单业务流程如果应用程序的业务流程相对简单,没有太多的复杂性和耦合性,单体架构可以提供简单的部署和管理方式。
资源有限的环境在资源有限的环境中,单体架构可以减少系统的复杂性和资源消耗。由于所有的功能都在一个单一的应用程序中,不需要额外的资源来管理和通信。
快速开发和交付单体架构的开发过程相对简单,开发团队可以快速迭代和交付功能。这对于需要快速推出产品的企业或项目非常有利。
需要注意的是,单体架构在应用规模不断增长、业务复杂性增加、团队规模扩大时可能会面临挑战。在这种情况下,考虑将应用程序迁移到微服务架构或其他分布式架构可能更加合适。
3.2 RPC架构(Remote Procedure Call)RPC(Remote Procedure Call,远程过程调用)严格意义来说并不算是一种架构方式,而是一种远程调用方式,用于实现分布式系统中的远程通信。它允许一个应用程序通过网络调用另一个应用程序中的函数或方法,就像本地调用一样。
在RPC架构中,应用程序之间通过网络进行通信,调用远程的函数或方法。这些函数或方法可以在不同的物理或虚拟机上运行,甚至可以在不同的操作系统或编程语言中编写。RPC框架负责处理底层的通信细节,将远程调用和响应封装为简单的API。
通过RPC,我们可以实现像本地调用一样的调用其他服务的功能,从而实现不同服务功能的复用。
RPC架构的特点包括:
远程调用应用程序可以通过网络调用另一个应用程序中的函数或方法。
透明性RPC框架隐藏了底层的通信细节,使得远程调用对开发人员来说是透明的。
参数传递RPC支持在远程调用中传递参数,包括基本类型、复杂对象和数据结构等。
序列化和反序列化参数和返回值在网络传输过程中需要进行序列化和反序列化。
远程异常处理RPC框架可以处理远程调用中的异常,并将其传递给调用方。
安全性RPC框架可以提供安全认证和授权机制,确保远程调用是安全的。
RPC架构的优势包括:
简化开发RPC架构使得远程调用对开发人员来说是透明的,使得分布式系统的开发更加简单和高效。
可扩展性由于应用程序可以在不同的物理或虚拟机上运行,RPC架构可以实现系统的水平扩展。
语言和平台无关性RPC框架可以支持不同的编程语言和平台,使得不同技术栈的应用程序可以进行互操作。
RPC架构适用于以下应用场景:
分布式系统当应用程序需要在多个节点之间进行通信和协作时,RPC架构可以提供方便的远程调用机制。例如,大规模的分布式计算、分布式数据库、分布式缓存等场景都可以使用RPC来实现节点间的通信。
微服务架构在微服务架构中,应用程序被拆分为一组小型、独立的服务,每个服务都有自己的数据库和业务逻辑。RPC架构可以用于服务之间的通信,例如一个服务通过RPC调用另一个服务的API来获取数据或执行操作。
高性能要求RPC架构通常使用二进制协议进行通信,可以提供更高的性能和效率。因此,当应用程序对性能有较高的要求时,RPC架构是一个合适的选择。
多语言环境RPC架构可以解决多语言环境下的通信问题。由于RPC协议通常是与语言无关的,可以支持不同编程语言之间的通信,使得团队可以使用各自擅长的编程语言来开发不同的服务。
需要注意的是,RPC架构也有一些挑战,例如网络通信的稳定性、服务发现和负载均衡等问题需要解决。因此,在选择RPC架构时,需要综合考虑应用程序的需求和特点,并选择合适的RPC框架和工具来支持开发和部署。
3.3 面向服务架构(Service-Oriented Architecture)
SOA(Service-Oriented Architecture,面向服务的架构)是一种软件架构风格,它将应用程序设计为一组可重用的服务,这些服务通过定义的接口进行通信和协作。
在SOA架构中,应用程序被拆分成一组自治的服务,每个服务负责特定的业务功能。这些服务可以独立开发、部署和管理,并通过网络进行通信。每个服务都有自己的职责和功能,可以使用不同的技术栈和数据库。
SOA架构的特点包括:
服务应用程序被拆分成一组服务,每个服务负责一个特定的业务功能。
接口每个服务通过定义的接口来与其他服务进行通信和协作。
松耦合服务之间是松耦合的,它们可以独立开发、部署和扩展。
可重用性服务是可重用的,它们可以在不同的应用程序中被调用和共享。
分布式服务可以在不同的物理或虚拟机上部署,并通过网络进行通信。
服务发现服务可以通过服务注册表或服务目录进行发现和访问。
SOA架构的优势包括:
模块化和可维护性通过将应用程序拆分成独立的服务,可以更好地组织和维护代码。
可重用性服务是可重用的,可以在不同的应用程序中共享和调用。
灵活性由于服务之间是松耦合的,可以更快地响应需求变化和创新。
技术多样性不同的服务可以使用不同的技术栈和数据库,团队可以根据需求选择最适合的工具和技术。
SOA(Service-Oriented Architecture)适用于以下应用场景:
复杂的业务流程当应用程序的业务流程相对复杂,涉及多个不同的业务功能和组件时,SOA可以提供一种灵活的方式来组织和管理这些功能和组件。通过将业务功能封装为可重用的服务,可以实现业务流程的解耦和灵活的组合。
分布式系统SOA可以用于构建分布式系统,其中各个服务可以在不同的节点上部署和运行。这种分布式架构使得系统更具弹性和可扩展性,可以根据需求动态地添加、更新或删除服务。
企业应用集成在企业环境中,存在大量的应用程序和系统,它们可能使用不同的技术栈和数据格式。SOA可以作为一种集成的解决方案,通过定义和实现标准化的服务接口,实现不同系统之间的数据交换和协作。
松耦合和可重用性SOA的设计原则之一是松耦合和可重用性。通过将业务功能封装为独立的服务,可以实现服务的复用,减少重复开发和维护成本。同时,由于服务之间的松耦合,可以更容易地对系统进行修改和扩展。
需要注意的是,SOA的实施需要考虑到组织的业务需求、技术能力和资源投入。在设计和实施SOA时,需要仔细规划和管理服务的生命周期、服务治理、服务发现和集成等方面的问题。
3.4 微服务架构(Microservices Architecture)
微服务架构是一种软件架构风格,它将一个大型的应用程序拆分成一组小型、自治的服务。每个服务都是独立部署、可独立扩展和管理的,通过轻量级的通信机制相互协作。
在微服务架构中,每个服务都专注于一个特定的业务功能,并且可以使用不同的技术栈和数据库。这使得团队可以根据需求选择最适合的技术和工具来开发和维护各个服务。
微服务架构的特点包括:
服务拆分应用程序被拆分成一组小型的服务,每个服务负责一个特定的业务功能。
独立部署每个服务都可以独立地进行部署,使得团队可以更快地进行开发、测试和发布。
独立扩展由于每个服务都是自治的,可以根据需要独立地进行扩展,提高系统的性能和可伸缩性。
松耦合通信服务之间通过轻量级的通信机制进行通信,例如使用HTTP/REST、消息队列或事件总线。
基础设施自治每个服务都有自己的数据库和存储,可以根据需要选择适合的技术栈。
弹性和容错性由于每个服务都是独立的,系统可以更好地处理故障和异常情况,提供更高的弹性和容错性。
微服务架构的优势包括:
灵活性每个服务可以独立开发、测试和部署,使得团队可以更快地响应需求变化和创新。
可扩展性由于每个服务都可以独立扩展,系统可以更好地处理高负载和流量峰值。
可维护性每个服务的代码库较小,更容易理解和维护。
技术多样性不同的服务可以使用不同的技术栈和数据库,团队可以根据需求选择最适合的工具和技术。
微服务架构适用于以下应用场景:
大型复杂应用当应用程序规模庞大、复杂度高时,微服务架构可以将应用程序拆分为一组小型、独立的服务,每个服务都有自己的数据库和业务逻辑。这种拆分可以使得应用程序更易于开发、测试、部署和维护。
高可扩展性要求微服务架构可以实现水平扩展,即通过增加服务实例来增加系统的处理能力。这对于需要应对高并发和大流量的应用程序非常有利。
独立部署和团队自治微服务架构允许每个服务独立部署和升级,不会影响其他服务的正常运行。这使得团队可以根据自己的节奏和需求来开发、测试和部署服务,实现团队的自治。
技术异构性微服务架构可以解决技术异构性的问题。不同的服务可以使用不同的技术栈和编程语言,根据需求选择最适合的技术。这使得团队可以根据自己的专长和需求来选择合适的技术,提高开发效率和灵活性。
快速迭代和创新微服务架构可以支持快速迭代和创新。由于每个服务都是独立的,可以快速开发、测试和部署新功能,实现快速迭代和验证概念的目标。
需要注意的是,微服务架构也存在一些挑战,例如服务间通信的复杂性、服务发现和治理、数据一致性等问题需要解决。在选择微服务架构时,需要综合考虑应用程序的需求和特点,并选择合适的技术和工具来支持开发和部署。
3.5 服务网格架构(Service Mesh Architecture)服务网格架构是一种用于构建和管理微服务的架构模式。它提供了一种在分布式系统中管理和控制服务间通信的方法,以确保服务之间的可靠性、安全性和可观测性。
在服务网格架构中,每个服务都被称为服务网格中的一个节点,它们通过一个专门的组件(称为服务网格)进行通信。服务网格负责处理服务之间的流量路由、服务发现、负载均衡、故障恢复、安全认证、日志记录和监控等任务。
服务网格架构的特点包括:
透明性服务网格提供了一种透明的方式来管理和控制服务间的通信,对服务本身是透明的。
可观测性服务网格可以收集和监控服务之间的通信和性能指标,提供实时的监控和日志记录。
弹性和故障恢复服务网格可以处理服务之间的故障,例如自动进行故障转移和重试等。
安全性服务网格可以提供安全认证和授权机制,确保服务之间的通信是安全的。
可扩展性服务网格可以处理大规模的服务部署,并提供负载均衡和流量管理等功能。
可插拔性服务网格是一个可插拔的组件,可以与不同的微服务框架和技术栈集成。
常见的服务网格实现包括Istio、Linkerd和Consul等。它们提供了一系列功能和工具,帮助开发人员和运维团队更好地管理和控制微服务架构。
服务网格架构的优势包括:
可观测性和监控服务网格提供了实时的监控和日志记录,帮助团队更好地理解和分析服务之间的通信和性能。
弹性和故障恢复服务网格可以处理服务之间的故障,提供故障转移、重试和自动恢复等功能。
安全性服务网格提供了安全认证和授权机制,确保服务之间的通信是安全的。
简化开发和运维服务网格提供了一种集中管理和控制服务间通信的方法,简化了开发和运维的复杂性。
服务网格架构适用于以下应用场景:
复杂的微服务架构当应用程序采用微服务架构,并且微服务的数量众多、相互之间有复杂的依赖关系时,服务网格架构可以提供一种统一的管理和控制方式。它可以处理服务之间的通信、负载均衡、服务发现、故障恢复和安全等方面的问题。
多语言和多平台环境服务网格架构可以解决多语言和多平台环境下的通信和协作问题。由于服务网格通常是与语言和平台无关的,可以支持不同编程语言和不同平台之间的通信,使得团队可以使用各自擅长的技术来开发和部署服务。
高可用性和弹性要求服务网格架构可以提供高可用性和弹性。通过在服务网格中引入负载均衡、故障恢复和自动扩展等机制,可以实现对服务的高可用性和弹性的支持,提供更好的用户体验。
安全性和监控需求服务网格架构可以提供安全性和监控的支持。通过在服务网格中引入认证、授权、加密和审计等机制,可以保护服务的安全性。同时,服务网格还可以提供对服务的监控、日志和指标的收集和分析,帮助团队了解服务的运行状况和性能。
快速迭代和部署服务网格架构可以支持快速迭代和部署。由于服务网格提供了统一的管理和控制平台,可以快速部署新的服务实例、更新服务版本,并提供灰度发布和回滚等功能,实现快速迭代和部署的目标。
需要注意的是,服务网格架构引入了额外的复杂性和运维成本,需要综合考虑应用程序的规模和需求,以及团队的技术能力和资源投入。在选择服务网格架构时,需要评估其对应用程序的价值和适用性,并选择合适的服务网格实现。
4.如何选择适合自己的软件架构虽然说软件架构已经从简单的单体架构逐步发展到复杂的SOA、微服务,以及近些年更为火热的服务网格架构,但这并不意味着最新的软件架构就是最好的:对于一个企业来说,跟自己实际业务场景最为匹配的软件架构才是最好的。这也是为什么虽然现在已经发展到服务网格架构,却仍然还会有大量的不同架构的软件存在的原因。
那么作为一个中小企业,到底应该如何选择自己的软件架构呢?考虑到软件架构是一个专业性且复杂的事情,不同企业的情况及业务都不尽相同,本文针对常见的几种实际场景,给出软件架构参考:
业务场景:我是小型创业公司,公司没有专门的技术团队,前期也没有太多的资金投入,但是我们需要开发一个创新型的应用,需要快速上线推向市场,通过市场反馈再决定是否继续投入。
架构建议:建议采用单体架构,通过更小的投入、更快地上线产品。
业务场景:我公司人不多,只有几十个人,需要开发一款公司内部使用的业务系统供公司内部使用,且该软件成本投入不多,2~3年内也不考虑整公司内部做大规模的数字化基础平台建设。
架构建议:建议采用单体架构,因为内部使用人不多,系统的访问压力也不到,单体架构足以支撑。
业务场景:我公司规模有200多人,过去几年在企业内部信息化建设也投入了很多系统,比如说ERP系统、OA系统、CRM系统、门店管理系统等,目前公司各个系统的数据相对独立,没有形成统一的规划。现在需要建设公司内部的信息化平台,将各个系统业务、数据打通,能够实现统一管控;同时后续建设的一些业务系统,也需要能够接入平台,并逐步形成公司内部的IT资产。
架构建议:建议使用SOA架构,通过SOA架构,一方面能够集成整合公司现有的各个业务系统,将其业务数据及功能打通;另一方面,可以将各个业务系统中公共可服用的服务抽离出来,通过系统服务总线(ESB)进行统一注册管理,形成公司内部服务沉淀,为后续业务系统提供服务调用。
业务场景:公司准备投入大量资金,组建自己的技术研发团队,开发一款面对C端用户的应用,应用业务模式非常成熟,且公司内部对业务流程、业务划分都非常清晰明确,准备通过该应用为海量的C端用户提供高可用的服务。
架构建议:建议使用微服务架构,将应用不同业务板块划分成不同的微服务,通过为服务架构能够为海量用户提供高可用的服务。
以上只是笔者针对常见的几种典型业务场景提出来的软件架构建议,而具体的业务场景各不相同,也都会影响软件架构的选择。如果大家有什么疑问或者更好的想法,欢迎一起讨论。