百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

四种常见的微服务架构模型,你用过哪一种?

ccwgpt 2025-04-10 21:05 104 浏览 0 评论

在互联网的快速发展的今天,微服务架构能力已经成为了后端人员一个必备技能,这篇文章,我们来分享四种常见的微服务架构模型以及它们之间的区别。

1. 洋葱架构

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


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

1.1 各层说明

  • Domain Model:领域模型层,它是最中心的,代表了为组织建模真相的状态和行为组合,封装了企业级的业务规则;
  • Model Services:领域服务,涉及多个实体的复杂业务逻辑,例如抽象存储库(仍然将实现细节留给外层,例如数据库连接);
  • Application Services:应用程序服务,它定义了应用程序的业务流程;
  • User interface/Infrastructure/Tests:最外层是用户界面、与外部基础设施的连接和自动化测试。与端口和适配器一样,此模式将与所有外部依赖项(例如数据库、API 和用户界面)的连接留在边缘,以便轻松切换;

1.2 提出原因

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


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

1.3 适用范围

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

2. 整洁架构

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


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

2.1 各层说明

  • Entities:实体。它封装了企业范围的业务规则,实体可以是具有方法的对象,也可以是一组数据结构和函数。只要实体可以被企业中的许多不同应用程序使用,就没有关系。
  • Use Cases:用例。该层中的软件包含特定于应用程序的业务规则。它封装并实现了系统的所有用例。这些用例协调进出实体的数据流,并指导这些实体使用其企业范围的业务规则来实现用例的目标。
  • Interface Adapters:接口适配器。该层中的软件是一组适配器,可将数据从对用例和实体最方便的格式转换为对某些外部机构(如数据库或 Web)最方便的格式。例如,这一层将完全包含 GUI 的 MVC 架构。Presenters、Views 和 Controllers 都属于这里。这些模型可能只是从控制器传递到用例,然后从用例返回到呈现器和视图的数据结构。
  • Frameworks and Drivers:框架和驱动程序。最外层主要提供适配的能力,适配能力分为主动适配和被动适配,一般由Database、Web Framework等框架和工具组成,这一层一般不会写太多代码,除了往内和下一个圈子通信的胶水代码。

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

3. 六边形架构

3.1 结构

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

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

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

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

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

3.2 实现逻辑

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

4. DDD分层架构

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

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

4.1 各层说明

  • User interface:用户接口层,用户接口层负责向用户显示信息和解释用户指令。这里的用户可能是:用户、程序、自动化测试和批处理脚本等等。
  • Application:应用层,它可以协调多个聚合的服务和领域对象完成服务编排和组合,协作完成业务操作;
  • Domain:领域层,领域层的作用是实现企业核心业务逻辑,通过各种校验手段保证业务的正确性。领域层主要体现领域模型的业务能力,它用来表达业务概念、业务状态和业务规则。
  • Infrastructure:基础层,基础层是贯穿所有层的,它的作用就是为其它各层提供通用的技术和基础服务,包括第三方工具、驱动、消息中间件、网关、文件、缓存以及数据库等。比较常见的功能还是提供数据库持久化。

4.2 模型对比

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

5. 总结

  • 微服务的几种模型见证了微服务架构的演进历史,每种架构都有其使用场景和一定的时代意义;
  • 四种架构都是分离关注点,将变与不变进行分离;
  • 四种架构模型表现形式不一样,但设计思想都体现了微服务架构高内聚低耦合原则,正所谓神同行异;
  • 四种架构的核心层都是领域层,它保持领域模型和业务逻辑的稳定,对外提供稳定的细粒度的领域服务;

相关推荐

NestJS入门教程系列一

介绍Nest(NestJS)是用于构建高效,可扩展的Node.js服务器端应用程序的框架。它使用渐进式JavaScript,内置并完全支持TypeScript(但开发人员仍然能够使用JavaScrip...

【推荐】一个网盘资源搜索与转存工具,支持移动端与PC端!

如果您对源码&技术感兴趣,请点赞+收藏+转发+关注,大家的支持是我分享最大的动力!!!项目介绍CloudSaver是一个基于Vue3和Express的网盘资源搜索与转存开源实用工具。它支持...

Appium原理精讲

目前使用Appium新版本和旧版本的企业数目都很多,而两个版本的安装过程和api的使用又有较大的区别。但是无论表面上的东东如何变化,内部原理都是一样的。在这里我给大家介绍一下appium的核心,增进大...

Kubernetes最小部署单元Pod

一、Kubernetes与Pod简介在当今云计算和容器化技术盛行的时代,Kubernetes已然成为容器编排领域的中流砥柱。它是一个开源的容器编排平台,由Google基于其内部使用的Bo...

最常用的四种跨域解决方案

前置知识什么是跨域?浏览器发送的请求地址(URL)与所在页面的地址不同(端口/协议/域名其一不同)。简言之,浏览器发出的请求url,与其所在页面的url不一样。此时,同源策略会让浏览器拒收服务器...

Bolt.New —— 全栈AI Web自动编程

Bolt.New是由StackBlitz公司推出的,全栈AI工具,代码编辑、运行、部署,通通一站式搞定。它使用WebContainers技术,无需任何本地安装或配置,在浏览器中,就可以运行完整的No...

Nodejs Express新手教程&高手进阶

NodejsExpress新手教程&高手进阶Express是一个NodeJS平台的框架,主要用于构于Web服务器项目。本文将通过示例介绍适合新手入门的Express基础使用,以及高手进阶知识,如:c...

Express.js 创建Node.js Web应用

Express.js是一个基于Node.js的Web应用框架,框架的设计目的是构建应用的架构和简化应用的开发。框架会解决一些通用的问题,在Express.js中,Express框架会处理如:中间件、代...

JavaScript 的 Express.js 功能及应用场景详解

Express.js是一个基于Node.js的轻量级Web应用框架,主要用于快速构建服务器端应用和API。它的核心功能包括以下关键点:1.路由管理URL路径与HTTP方法映射:通过...

nodejs的express4文件下载

在nodejs的express框架中,下载变得非常简单,就一个方法,res.download()首先express命令行生成项目基本框架:不会的看这里:http://blog.csdn.net/zz...

Express 系列:快速生成一个项目

系列预告本系列将以一个项目入手结合相关技术细节来带领大家一起学习Express这个基于Node.js的后端框架。本文首先将介绍:如何快速的生成一个具有一定结构的Express项目。Express项目结...

nodejs的express自动生成项目框架

nodejs版本为:4.X,express版本为4.X1.全局安装2个模块express、express-generator在命令行输入:npminstall-gexpressnpminsta...

express开发(一)简介与搭建

上周末去了趟上海书城,不愧是上海数得上号的书城,流行的科技书应有尽有,话不多说直接上图。最经典的C语言O(∩_∩)O最流行的java(づ ̄3 ̄)づ超酷的R语言/(ㄒoㄒ)/~~然而,身为一个坚定的前...

Vue+Echarts可视化大屏系统后端框架搭建(附代码)

各位同学,大家好。上节课,前面我们讲解了Vue+Echarts前端部分的设计方法。这节课程,我们开始讲解使用Express进行后端设计的方法。01项目相关理论介绍什么是expressExpress是...

Shopify电商API接口开发

Shopify电商API接口开发上线流程主要包括以下步骤。北京木奇移动技术有限公司,专业的软件外包开发公司,欢迎洽谈合作。前期准备-注册Shopify账号:在Shopify官网注册,用于后续开发测试...

取消回复欢迎 发表评论: