Java从单体架构到微服务架构
一,单体架构
单体架构是一种传统的架构,也被称为单体应用架构,在单体架构中一个 应用程序通常会被作为一个单一整体的单元进行运行,它通常由用户交互层,业务逻辑层和数据管理层组成,并且公用同一个数据库
在这种架构中,整个应用程序的代码和功能都集中的在一个单一的代码库和部署单元中。这意味着所有的功能模块和业务逻辑都在同一个应用程序中运行,通常通过函数或类的调用来实现不同模块之间的交互。
这种架构的优缺点是:
优点:
- 相对简单:单体架构相对简单,易于开发、测试和部署,特别适用于小型应用程序或初期阶段的项目。
- 性能较好:由于所有的功能都在同一个进程内运行,单体应用通常具有较好的性能和响应能力。
- 易于维护:所有的代码和功能都在同一个代码库中,使得代码的维护和修改相对容易。
缺点:
- 扩展限制:单体应用的功能和代码都集中在一个单一的代码库中,扩展和升级可能会变得困难,特别是对于大型复杂应用。
- 紧耦合:由于在同一个单元模块中进行运行,不同功能模块之间的耦合度较高,一个模块的变化可能会影响其他模块的功能和稳定性。
- 可靠性问题:由于单一点的存在,当应用程序出现故障时,整个应用程序可能会失效。
二,垂直架构
正如现在的网上购物产品每个产品都有一个自己的垂直领域,在我们的程序设计中整个程序的设计流程也可以被认为是一个垂直的设计流程,程序在设计中被划分为多个模块通常有以下的几个模块组成:
-
表示层:该层负责处理用户界面、用户输入和输出。它通常涉及用户界面设计、交互逻辑和呈现数据给用户的任务。常见的实现方式包括网页前端、客户端应用程序或移动应用程序。
-
应用层:应用层是整个软件的核心,它包含业务逻辑的实现。该层负责处理业务规则、数据验证、处理用户请求等任务。应用层通常封装了业务逻辑,与表示层和数据访问层进行交互。
-
数据访问层:数据访问层负责与数据存储进行交互,如数据库或外部服务。它包含与数据相关的操作,如数据读取、写入和更新。数据访问层的主要责任是提供数据的持久性和可访问性。
-
基础设施层:基础设施层包含支持应用程序运行的基础设施,如网络通信、安全性、日志记录和配置管理。它提供了支持应用程序的各种工具和服务。
垂直架构具有一下优缺点:
优点:
-
模块化:垂直架构将应用程序划分为不同的层次或模块,每个模块专注于特定的功能。这种模块化设计使得应用程序的不同部分可以独立开发、测试、维护,并且可以更容易地重用和替换。
-
可维护性:由于不同功能模块的清晰划分,垂直架构使得对特定模块的修改、修复和优化变得更加容易。开发人员可以更快地定位问题所在,而不会涉及整个应用程序的代码库。
-
易于测试:垂直架构的模块化特性也有助于进行单元测试、集成测试和端到端测试。不同层次的功能分离,使得编写和执行测试用例更加简单直观,并且可以更有效地保证代码的质量和稳定性。
-
可扩展性:垂直架构使得根据需求和负载的增加可以独立地扩展不同的模块,而无需对整个应用程序进行全面的扩展。这种模块化的架构模式支持更好的可扩展性和性能优化。
缺点:
-
紧耦合:垂直架构中的不同模块之间通常存在较高的依赖性。这意味着一个模块的变化可能会对其他模块产生波及和影响,增加了系统的复杂性和维护成本。
-
扩展限制:由于各模块之间的紧密耦合,垂直架构在进行全面扩展时可能会遇到困难。例如,在高负载情况下,需要增加某个模块的处理能力,这可能会导致整个应用程序的性能瓶颈。
-
灵活性差:垂直架构通常比较静态和刚性,不太适应快速变化和迭代开发。如果需求发生较大变更,可能需要对多个层次进行修改,增加了开发和部署的复杂性。
三,分布式架构
在将分布式架构时我们引进集群的概念,通俗的讲解一下集群和分布式
集群:集群好比许多的“人”做同一件事,当然这里的人指的是机器;
分布式:分布式好比许多的“人”做不同的事,但这些事合并起来是一件大事。
分布式架构它将应用程序的不同模块或服务分布在多个计算节点上,这些节点可以是物理机、虚拟机、容器或云服务。这种架构允许系统的不同部分独立运行,并通过网络进行通信和协作。
在分布式架构中,各个节点之间可以通过消息传递、远程调用或共享数据库等方式进行通信。每个节点承担特定的功能,实现特定的任务,并根据需求进行水平扩展。像一个厨房由切菜的,炒菜的等等组成。
以下是分布式架构的一些核心组件和原则:
-
模块:应用程序被划分为多个独立的服务或模块,每个模块专注于特定的任务或功能。这种模块化设计有助于提高可维护性和可扩展性。
-
通信机制:节点之间的通信是分布式架构的关键所在。常见的通信机制包括消息传递、远程过程调用(RPC)等。这些机制用于实现节点之间的数据交换和协作。
-
数据管理:在分布式架构中,需要考虑数据的共享和一致性。常见的做法是使用分布式数据库或缓存,或采用数据复制或分片技术以实现数据的可用性和一致性。
-
负载均衡:为了提高性能和可扩展性,分布式架构可以使用负载均衡器来将请求分发到不同的节点上。负载均衡器根据节点的负载情况,动态地分配请求,以实现资源的优化利用。
-
容错和容灾:分布式架构通过节点之间的冗余和故障恢复机制来提高系统的容错性和容灾能力。当一个节点发生故障时,其他节点可以接替其工作,保证系统的可用性。
优点:
- 可伸缩性:系统可以根据需求动态地增加或减少节点数量,以适应流量或计算需求的变化。
- 高可用性:当某些节点发生故障时,其他节点仍然可以继续提供服务,确保系统的连续性。
- 性能优化:通过分布计算和负载均衡,系统可以提供更好的性能和响应速度。
- 弹性和灵活性:系统可以根据需求进行动态调整和部署,以满足不断变化的业务需求。
- 低延迟:通过将计算节点分布在就近的位置,可以减少网络延迟。
缺点:
- 网络通信:节点之间的通信和协调可能会引入网络延迟和带宽压力。
- 数据一致性:由于数据分布在多个节点上,需要解决数据一致性和并发冲突的问题。
- 安全性:分布式环境需要考虑数据的保护和安全性,包括身份验证、数据加密和访问控制等。
在这张图中分布式框架通过RPC的通信方式进行通信服务提供者向服务消费者提供分配端口号但要是服务提供者中的个别端口号发生移除或者变更就体现了分布式框架的一定缺陷这时候就引进我们接下来要讲解的SOA框架
四,SOA框架
SOA框架相较于分布式框架的提升是将所有的数据“搭放在”一条总线上变相的实现了数据的同步问题
我们常见的Spring Framework框架也是SOA框架的一种,它是一组软件工具、技术和原则,用于支持和实现SOA的设计理念和开发实践。SOA框架提供了一种结构化的方法来构建、集成和管理面向服务的应用程序。
解决了分布式服务方信息变更的消费方信息都要变更的问题
优点:
-
松散耦合:SOA框架通过将应用程序拆分为一系列相对独立的服务组件,实现了松散耦合。这样,单个服务的变化不会影响到其他服务,提高了系统的可维护性和可扩展性。
-
可重用性:基于SOA的设计原则,服务可以被设计为可重用组件。这意味着当需要类似的功能时,可以重用已有的服务,避免重复开发,提高开发效率和代码质量。
-
可组合性:通过将不同的服务组合在一起,可以构建出更复杂的应用系统。这种组合性允许快速搭建定制化的解决方案,满足特定的业务需求。
-
分布式开发和部署:通过使用SOA框架,服务可以分布在不同的计算节点上,可以独立开发、测试和部署。这种分布式的特性使得大型应用系统的开发和运维更加灵活和可扩展。
-
跨平台和技术无关:SOA框架可以支持不同技术栈和平台之间的互操作性。通过使用标准化的通信协议和数据格式,服务可以在不同的环境中进行调用和集成。
缺点:
-
复杂性:实施SOA需要在设计、开发、测试和部署阶段引入额外的复杂性。需要仔细规划和管理服务的接口和协议,确保正确的服务交互和数据一致性。
-
性能开销:使用SOA框架进行服务调用和消息传递时会引入一定的性能开销。分布式系统的通信和协作通常需要额外的网络和处理开销,可能会影响应用程序的性能。
-
依赖管理和版本控制:由于分布式服务的多样性和依赖关系,管理服务版本和依赖项变得非常重要。必须管理好服务之间的依赖关系,避免由于版本不一致导致的兼容性问题。
-
安全性和隐私问题:由于多个服务之间的通信,安全性和隐私问题变得更加复杂。必须实施适当的安全措施,包括数据加密、身份验证和访问控制等,以确保服务之间的安全通信。
五,微服务架构
微服务架构是一种建立在面向服务架构(SOA)理念基础上的软件架构风格,它通过将应用程序拆分成一组小型、独立的、自治的服务来构建整体系统。每个服务都是一个独立的部署单元,可以独立进行开发、部署、扩展和维护。
以下是微服务架构的一些关键特点:
-
单一职责原则:每个微服务只负责一个特定的业务功能,并隔离于其他微服务。这种精细化的拆分和设计使得每个微服务都可以更加专注和独立地进行开发和演进。
-
分布式架构:每个微服务可以运行在独立的进程、容器或虚拟机中,通过轻量级的通信机制(如RESTful API或消息队列)进行相互通信。这种分布式的特性提供了更好的水平扩展和高可用性。
-
自治性:每个微服务都拥有自己的数据存储和业务逻辑,可以独立地进行开发、部署和维护。这种自治性使得服务更具灵活性和自治性,可以独立地进行优化和扩展。
-
逐步升级:由于微服务的独立性,可以逐步地对单个微服务进行升级和演进,而不会对整个系统造成影响。这种逐步升级的能力使得系统更具可维护性和灵活性。
-
弹性和可伸缩性:由于微服务之间的松耦合关系,系统可以更容易地实现弹性和可伸缩性,即根据需求进行快速扩展和缩减。
-
多语言和技术多样性:每个微服务可以使用不同的编程语言和技术栈,根据具体的业务需求进行选择。这种技术多样性提供了更大的灵活性和选项。
微服务架构的优点包括:
-
可扩展性:每个微服务可以独立地进行扩展,无需整体扩展系统。
-
独立部署和维护:每个微服务可以独立进行部署和维护,无需影响其他服务。
-
独立演进和快速迭代:每个微服务可以独立进行演进和迭代,提高开发速度和灵活性。
-
支持多团队协作:不同的团队可以独立负责不同的微服务,使团队更加专注和高效。
微服务的一些挑战:
-
系统复杂性增加:由于分布式特性,系统的复杂性增加,需要更多的管理和调试。
-
分布式事务管理:处理跨多个微服务的事务一致性可能会更加复杂。
-
网络和通信开销:由于微服务之间的通信,网络和通信开销可能增加,影响系统性能。
-
运维和监控成本:微服务的数量增加,需要更多的运维和监控工作。
番外:
最后提及一下微服务架构相较于SOA架构的提升
-
粒度更细:微服务架构将应用程序拆分成更小粒度的服务单元,每个服务都关注一个具体的业务功能。相比之下,SOA架构中的服务粒度较大,更倾向于组织和管理大型的服务集合。微服务架构的细粒度使得每个服务更加独立和可维护。
-
独立部署和升级:微服务可以独立进行部署和升级,每个服务都有自己的代码库和部署管道。这种独立性使得团队可以更加灵活地开发和发布新功能,无需整体升级系统。相比之下,SOA架构中的服务通常需要通过集中式部署和升级机制进行管理。
-
技术多样性:微服务架构支持多语言和技术多样性,每个服务可以使用适合自身需求的最佳技术栈。这种灵活性使得团队可以更好地选择合适的技术来解决特定的业务问题。相比之下,SOA架构对于技术的选择可能受到限制。
-
弹性和扩展性:微服务架构的细粒度和独立性使得系统更容易实现弹性和可扩展性。每个服务可以根据需求进行独立的水平扩展,提高系统的负载能力和可用性。相比之下,SOA架构中的服务扩展可能受到整体系统的限制。
-
较小的团队协作:微服务架构通过将系统拆分成小型服务,使得团队可以更加专注于特定的功能领域。每个团队可以独立负责一个或多个微服务的开发和维护,加强了团队之间的协作和沟通,提高了开发效率。
文章知识点与官方知识档案匹配,可进一步学习相关知识 Java技能树首页概览144184 人正在系统学习中