您当前的位置:首页 > 电脑百科 > 程序开发 > 架构

微服务架构的四种常见模型

时间:2022-12-29 13:58:57  来源:微信公众号  作者:猿java

互联网的快速发展,微服务架构已经成为了后端人员一个必备技能,今天我们就来分享微服务中四种常见架构模型,帮助我们更好的去了解微服务的发展。

一、洋葱架构 

洋葱架构:Onion Architecture,它是由 Jeffrey Palermo(杰弗里·巴勒莫)在 2008 年提出的,下图摘自作者原论文:

洋葱架构因为整个架构外形看似像洋葱,因此而得名,它在很大程度上依赖于依赖倒置原则,所有代码都可以依赖于更中心的层,但代码不能依赖于远离核心的层。换句话说,所有耦合都朝向中心。这种体系结构毫不掩饰地偏向于面向对象的编程,它将对象置于所有其他对象之上。

各层说明

  • DomAIn Model:领域模型层,它是最中心的,代表了为组织建模真相的状态和行为组合,封装了企业级的业务规则;

  • Model Services:领域服务,涉及多个实体的复杂业务逻辑,例如抽象存储库(仍然将实现细节留给外层,例如数据库连接);

  • Application Services:应用程序服务,它定义了应用程序的业务流程;

  • User interface/Infrastructure/Tests:最外层是用户界面、与外部基础设施的连接和自动化测试。与端口和适配器一样,此模式将与所有外部依赖项(例如数据库、API 和用户界面)的连接留在边缘,以便轻松切换;

     

提出原因

洋葱架构被提出的原因是作者觉得传统自上而下的分层架构模式存在严重的弊端弊端:耦合,每一层都耦合到它下面的层,每一层通常耦合到各种基础设施问题。下图为传统分层架构图:

从传统架构图可以看出每层的强依赖关系,UI 和业务逻辑与数据访问的耦合,如果业务逻辑不存在,UI 将无法运行。如果没有数据访问,业务逻辑就无法运行。而洋葱架构强调整个系统的关注点分离,使得应用程序更易于维护。

适用范围

洋葱架构不适合小型网站,它适用于长期存在的业务应用程序以及具有复杂行为的应用程序。

 

二、整洁架构 

整洁架构:Clean Architecture,它是由 Robert C. Martin (Uncle Bob) 于 2012 年提出。整洁架构是基于洋葱架构的概念之上提出的,但各层的细节有所不同。它的核心不叫"领域模型",而是称为"实体",但仍然代表企业范围的业务规则。下图摘自作者原文:

从整洁架构的架构图可以看出:整洁架构最主要的原则是依赖原则,它定义了各个层级的依赖关系,同心圆代表软件的不同领域,越往里能力越是核心。外圆代码依赖只能指向内圆,内圆无需关注外圆变化(包括函数、类。变量,或任何其他命名的软件实体)。

 

各层说明

  • Entities:实体。它封装了企业范围的业务规则,实体可以是具有方法的对象,也可以是一组数据结构和函数。只要实体可以被企业中的许多不同应用程序使用,就没有关系。

  • Use Cases:用例。该层中的软件包含特定于应用程序的业务规则。它封装并实现了系统的所有用例。这些用例协调进出实体的数据流,并指导这些实体使用其企业范围的业务规则来实现用例的目标。

  • Interface Adapters:接口适配器。该层中的软件是一组适配器,可将数据从对用例和实体最方便的格式转换为对某些外部机构(如数据库或 Web)最方便的格式。例如,这一层将完全包含 GUI 的 MVC 架构。Presenters、Views 和 Controllers 都属于这里。这些模型可能只是从控制器传递到用例,然后从用例返回到呈现器和视图的数据结构。

  • Frameworks and Drivers:框架和驱动程序。最外层主要提供适配的能力,适配能力分为主动适配和被动适配,一般由 Database、Web Framework 等框架和工具组成,这一层一般不会写太多代码,除了往内和下一个圈子通信的胶水代码。

     

在图表的右下方展示了如何跨越圆圈边界的示例。它显示了 Controller 控制器和 Presenters 演示器与下一层中的用例进行通信。注意控制流。它从控制器开始,通过用例移动,然后结束在演示器中执行。还要注意源代码依赖性。它们中的每一个都向内指向用例。

 

三、六边形架构 

六边形架构:Hexagonal Architecture,又名“端口适配器架构”,它是由 Alistair Cockburn 于 2005 年在论文中引入的。

需要说明的是:六边形架构中的六边形不是六边形,因为数字 6 很重要,而是让绘图的人有空间根据需要插入端口和适配器,而不受一维分层绘图的限制。"六边形架构"一词就源于这种视觉效果。更直白地说,该图案实际上与六边形无关,它只是通常的绘制方式而已。下图摘自作者原论文:

六边形架构将系统分为内六边形和外六边形两层,这两层的职能划分如下:

  • 内六边形实现应用的核心业务逻辑;

  • 外六边形完成外部应用、驱动和基础资源等的交互和访问,对前端应用以 API 主动适配的方式提供服务,对基础资源以依赖倒置被动适配的方式实现资源访问。

     

六边形架构的核心理念是:应用是通过端口与外部进行交互的,一个端口可能对应多个外部系统。也就是说,在下图的六边形架构中,最内层的核心业务逻辑与外部资源(包括 APP、Web 应用以及数据库资源等)完全隔离,仅通过适配器进行交互。它解决了业务逻辑与用户界面的代码交错问题,很好地实现了前后端分离。六边形架构各层的依赖关系与整洁架构一样,都是由外向内依赖。

 

实现逻辑

当任何驱动程序想要在端口上使用应用程序时,它会发送一个请求,该请求由针对驱动程序特定技术的适配器转换为可用的过程调用或消息,然后将其传递到应用程序端口。该应用程序对驱动程序的技术一无所知。当应用程序有东西要发送时,它会通过端口将其发送到适配器,适配器会创建接收技术(人工或自动)所需的适当信号。应用程序在其所有方面都与适配器进行了语义上的声音交互,而实际上并不知道适配器另一端事物的性质。

 

四、DDD分层架构 

DDD 分层架构应该是目前流行度最高的一种架构方式,但是,其架构也经历了多次的变更。DDD 最早使用的是传统的四层架构;后来四层架构发生了优化,实现了各层对基础层的解耦;再后来领域层和应用层之间增加了上下文环境(Context)层,五层架构(DCI)就此形成了。架构演变图如下:

DDD 分层架构有一个重要的原则:每层只能与位于其下方的层发生耦合。

 

各层说明

  • User interface:用户接口层,用户接口层负责向用户显示信息和解释用户指令。这里的用户可能是:用户、程序、自动化测试和批处理脚本等等。

  • Application:应用层,它可以协调多个聚合的服务和领域对象完成服务编排和组合,协作完成业务操作;

  • Domain:领域层,领域层的作用是实现企业核心业务逻辑,通过各种校验手段保证业务的正确性。领域层主要体现领域模型的业务能力,它用来表达业务概念、业务状态和业务规则。

  • Infrastructure:基础层,基础层是贯穿所有层的,它的作用就是为其它各层提供通用的技术和基础服务,包括第三方工具、驱动、消息中间件、网关、文件、缓存以及数据库等。比较常见的功能还是提供数据库持久化。

 

五、模型对比 

通过上面对四种架构详细介绍可以发现:几种架构里面都有核心领域层(不同架构命名可能不一样),但都是实现核心业务逻辑,它的作用就是将核心业务逻辑与外部应用、基础资源进行隔离。不同架构,核心业务逻辑也是有差异的,有的业务逻辑属于领域模型的能力,有的则属于面向用户的用例和流程编排能力。应用层实现面向用户操作相关的用例和流程,对外提供粗粒度的 API 服务。它就像一个齿轮一样进行前台应用和领域层的适配,接收前台需求,随时做出响应和调整,尽量避免将前台需求传导到领域层。应用层作为配速齿轮则位于前台应用和领域层之间。

 

六、总结 

  • 微服务的几种模型见证了微服务架构的演进历史,每种架构都有其使用场景和一定的时代意义;

  • 四种架构都是分离关注点,将变与不变进行分离;

  • 四种架构模型表现形式不一样,但设计思想都体现了微服务架构高内聚低耦合原则,正所谓神同行异;

  • 四种架构的核心层都是领域层,它保持领域模型和业务逻辑的稳定,对外提供稳定的细粒度的领域服务;

 

七、参考文献 

Clean-Architecture:https://blog.cleancoder.com/uncle-bob/2012/08/13/the-clean-architecture.html

Hexagonal Architecture:http://alistair.cockburn.us/Hexagonal+architecture

Onion Architecture:https://alistair.cockburn.us

Screaming Architecture :https://cleancoders.com/blog/2011-09-30-Screaming-Architecture



Tags:微服务架构   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,不构成投资建议。投资者据此操作,风险自担。如有任何标注错误或版权侵犯请与我们联系,我们将及时更正、删除。
▌相关推荐
对于微服务架构监控应该遵守的原则
随着软件交付方式的变革,微服务架构的兴起使得软件开发变得更加快速和灵活。在这种情况下,监控系统成为了微服务控制系统的核心组成部分。随着软件的复杂性不断增加,了解系统的...【详细内容】
2024-04-03  Search: 微服务架构  点击:(5)  评论:(0)  加入收藏
PHP+Go 开发仿简书,实战高并发高可用微服务架构
来百度APP畅享高清图片//下栽のke:chaoxingit.com/2105/PHP和Go语言结合,可以开发出高效且稳定的仿简书应用。在实现高并发和高可用微服务架构时,我们可以采用一些关键技术。首...【详细内容】
2024-01-14  Search: 微服务架构  点击:(115)  评论:(0)  加入收藏
微服务架构中的数据一致性
在微服务中,一个逻辑上原子操作可以经常跨越多个微服务。即使是单片系统也可能使用多个数据库或消息传递解决方案。使用多个独立的数据存储解决方案,如果其中一个分布式流程参...【详细内容】
2023-12-27  Search: 微服务架构  点击:(141)  评论:(0)  加入收藏
Eureka: 微服务架构中不可或缺的服务治理工具
Eureka是Netflix开源的一款用于服务治理的工具,它是NetflixOSS(OpenSourceSoftware)项目的一部分,主要用于实现微服务架构中的服务注册与发现。在当今庞大而复杂的微服务系统中,E...【详细内容】
2023-12-14  Search: 微服务架构  点击:(191)  评论:(0)  加入收藏
微软官方出品微服务架构:十个.Net开源项目
1、一个高性能类型安全的.NET枚举实用开源库Enums.NET是一个.NET枚举实用程序库,专注于为枚举提供丰富的操作方法。它支持.NET Framework和.Net Core。它主要优点表现在类型...【详细内容】
2023-12-06  Search: 微服务架构  点击:(131)  评论:(0)  加入收藏
深入理解Java微服务架构与容器化部署
随着云计算和大规模分布式系统的兴起,Java微服务架构和容器化部署成为了现代应用开发中的热门话题。它们可以提供灵活性、可伸缩性和高效性,使得开发人员能够更好地构建和维护...【详细内容】
2023-11-29  Search: 微服务架构  点击:(254)  评论:(0)  加入收藏
DDD四层微服务架构
一、微服务搭建思路大家看到的这张架构图并不是空穴来潮,它是通过不断演变出来的,我们要从DDD四层架构、微服务架构两个维度去融合理解。这里的DDD四层架构适用于单个服务的工...【详细内容】
2023-11-24  Search: 微服务架构  点击:(216)  评论:(0)  加入收藏
在微服务架构中的数据一致性
当从传统的单体应用架构转移到微服务架构时,特别是涉及数据一致性时,数据一致性是微服务架构中最困难的部分。传统的单体应用中,一个共享的关系型数据库负责处理数据一致性。在...【详细内容】
2023-11-23  Search: 微服务架构  点击:(175)  评论:(0)  加入收藏
一文搞懂微服务架构演进
本文将介绍微服务架构和相关的组件,介绍他们是什么,以及为什么要使用微服务架构和这些组件。本文侧重于简明地表达微服务架构的全局图景,因此不会涉及具体如何使用组件等细节。...【详细内容】
2023-11-21  Search: 微服务架构  点击:(166)  评论:(0)  加入收藏
单体架构 vs 微服务架构的全面比较
软件架构是指软件系统的高层设计和组织方式。它定义了系统的结构、组件、它们之间的交互以及它们如何满足系统的需求。有各种软件架构模式,每种都有其自身的优点和权衡。两种...【详细内容】
2023-11-01  Search: 微服务架构  点击:(254)  评论:(0)  加入收藏
▌简易百科推荐
对于微服务架构监控应该遵守的原则
随着软件交付方式的变革,微服务架构的兴起使得软件开发变得更加快速和灵活。在这种情况下,监控系统成为了微服务控制系统的核心组成部分。随着软件的复杂性不断增加,了解系统的...【详细内容】
2024-04-03  步步运维步步坑    Tags:架构   点击:(5)  评论:(0)  加入收藏
大模型应用的 10 种架构模式
作者 | 曹洪伟在塑造新领域的过程中,我们往往依赖于一些经过实践验证的策略、方法和模式。这种观念对于软件工程领域的专业人士来说,已经司空见惯,设计模式已成为程序员们的重...【详细内容】
2024-03-27    InfoQ  Tags:架构模式   点击:(13)  评论:(0)  加入收藏
哈啰云原生架构落地实践
一、弹性伸缩技术实践1.全网容器化后一线研发的使用问题全网容器化后一线研发会面临一系列使用问题,包括时机、容量、效率和成本问题,弹性伸缩是云原生容器化后的必然技术选择...【详细内容】
2024-03-27  哈啰技术  微信公众号  Tags:架构   点击:(10)  评论:(0)  加入收藏
DDD 与 CQRS 才是黄金组合
在日常工作中,你是否也遇到过下面几种情况: 使用一个已有接口进行业务开发,上线后出现严重的性能问题,被老板当众质疑:“你为什么不使用缓存接口,这个接口全部走数据库,这怎么能扛...【详细内容】
2024-03-27  dbaplus社群    Tags:DDD   点击:(11)  评论:(0)  加入收藏
高并发架构设计(三大利器:缓存、限流和降级)
软件系统有三个追求:高性能、高并发、高可用,俗称三高。本篇讨论高并发,从高并发是什么到高并发应对的策略、缓存、限流、降级等。引言1.高并发背景互联网行业迅速发展,用户量剧...【详细内容】
2024-03-13    阿里云开发者  Tags:高并发   点击:(6)  评论:(0)  加入收藏
如何判断架构设计的优劣?
架构设计的基本准则是非常重要的,它们指导着我们如何构建可靠、可维护、可测试的系统。下面是这些准则的转换表达方式:简单即美(KISS):KISS原则的核心思想是保持简单。在设计系统...【详细内容】
2024-02-20  二进制跳动  微信公众号  Tags:架构设计   点击:(36)  评论:(0)  加入收藏
详解基于SpringBoot的WebSocket应用开发
在现代Web应用中,实时交互和数据推送的需求日益增长。WebSocket协议作为一种全双工通信协议,允许服务端与客户端之间建立持久性的连接,实现实时、双向的数据传输,极大地提升了用...【详细内容】
2024-01-30  ijunfu  今日头条  Tags:SpringBoot   点击:(10)  评论:(0)  加入收藏
PHP+Go 开发仿简书,实战高并发高可用微服务架构
来百度APP畅享高清图片//下栽のke:chaoxingit.com/2105/PHP和Go语言结合,可以开发出高效且稳定的仿简书应用。在实现高并发和高可用微服务架构时,我们可以采用一些关键技术。首...【详细内容】
2024-01-14  547蓝色星球    Tags:架构   点击:(115)  评论:(0)  加入收藏
GraalVM与Spring Boot 3.0:加速应用性能的完美融合
在2023年,SpringBoot3.0的发布标志着Spring框架对GraalVM的全面支持,这一支持是对Spring技术栈的重要补充。GraalVM是一个高性能的多语言虚拟机,它提供了Ahead-of-Time(AOT)编...【详细内容】
2024-01-11    王建立  Tags:Spring Boot   点击:(124)  评论:(0)  加入收藏
Spring Boot虚拟线程的性能还不如Webflux?
早上看到一篇关于Spring Boot虚拟线程和Webflux性能对比的文章,觉得还不错。内容较长,抓重点给大家介绍一下这篇文章的核心内容,方便大家快速阅读。测试场景作者采用了一个尽可...【详细内容】
2024-01-10  互联网架构小马哥    Tags:Spring Boot   点击:(115)  评论:(0)  加入收藏
站内最新
站内热门
站内头条