六边形架构

六边形架构

    • 微服务系统架构
      • 微服务定义
      • 微服务系统设计
    • 传统分层架构
    • 六边形架构
    • 参考资料

微服务系统架构

需求描述做什么的问题,架构描述怎么做的问题(描述组成系统的各部件及其之间的关系)

微服务定义

下面的定义来自周志明老师的 凤凰架构

微服务是一种通过多个小型服务组合来构建单个应用的架构风格,这些服务围绕业务能力而非特定的技术标准来构建。各个服务可以采用不同的编程语言,不同的数据存储技术,运行在不同的进程之中。服务采取轻量级的通信机制和自动化的部署机制实现通信与运维。

微服务系统设计

在讨论如何设计一个微服务之前,我们可以先想一想如何描述一个系统。

当我们在讨论微服务系统架构时,很多人都会把架构粗犷的理解为根据系统需求划分为几个模块的服务,这是不对的。站在工程的角度,我们描述一个系统的角度应该是立体的。主要使用 “4+1” 视图来进行描述.

那么,什么是 “4+1” 视图呢?

4+1架构模型:(逻辑、实现、进程、部署) + 场景

整理如下,
4 + 1架构视图四种视图并不互斥,可互相组合。

架构可以描述一个软件的质量属性,我们评价一个系统主要可以从以下几个方向进行评估,

可维护性,可测试性,可部署性
安全性,可靠性,可扩展性

当我们学习如何描述一个系统的架构之后才可以慢慢观察如何对系统架构进行设计,
如果是微服务的系统架构设计,从较高的视角来看,我们可以从两个点思考,

  1. 根据需求描述,把他转换成一堆服务的组合,(如何把一个系统分解成不通过的服务)
  2. 把服务确定之后,如何建立服务之间的通信?

在思考这两个问题之前,我们需要矫正自己的认知,

系统设计描绘的是系统的实现而不是需求, 而软件工程就是把一个系统的需求转换成一个系统的架构

如果解决了上面的两个问题,我们就需要针对单个微服务进行设计。因此又引申出三个问题。

  1. 我们如何对服务进行详细的设计?
  2. 如何衡量一个微服务的系统设计优劣?
  3. 怎样描述一个微服务系统程序?

这就需要我们回到微服务的代码结构去思考!

传统分层架构

微服务时代,具体到微服务组件的设计。国内常用的还是使用传统的分层架构。

分层架构(逻辑视图):表示层(用户接口或外部API),业务逻辑层,持久层

| - Web
	| - Controller
| - Domain
	| - Service
| - Persistence
	| - Repository

开发问题:有些人会把Web层写的很臃肿,导致domain层没啥逻辑,失去了Web层可替换的优点

传统分层架构的优点和缺点

  • 缺点:不支持客户端,不支持多数据库((同一个功能不支持两个数据库)MySQL -> Oracle 行吗?),领域层依赖持久层
  • 优点:开发简单
  1. 什么业务场景适合使用传统分层架构?
需要快速构建的新应用程序
传统IT部门和流程的企业或业务应用程序
具有尚不了解其他架构的经验不足的开发人员的团队
需要严格的可维护性和可测试性标准的应用

六边形架构

what is 六边形架构,我们应该怎么去使用它?

Hexagonal Architecture, a layered architecture, is also called the Ports and Adapters architecture.

又称为端口与适配器架构,业务逻辑作为核心,实现了Domain和持久层的解耦,

六边形架构代码结构如下,
六边形架构代码描述

我们为什么要使用六边形架构?

要聊到六边形架构的优点,我们必须先回顾传统分层结构的特点,

传统分层结构的缺点主要:

  • 分层不能支持多表现层,多持久层
  • 业务逻辑层依赖数据库持久层

而当我们回过头来仔细观察六边形架构,可以发现如下特点,

  1. 属于逻辑视图
  2. 引入多个入站适配器(inbound adapter)
取代单一的表现层
完成对多种外部请求的处理
调用业务逻辑
  1. 引入多个出栈适配器
取代单一的持久层
被业务逻辑调用
同时调用外部应用程序,如数据库

分布式微服务时代,对比传统的分层架构,六边形架构更为优雅。
六边形架构的核心在于业务逻辑,业务逻辑具有一个或多个端口,一个端口定义了一组操作供外界调用或者实现,但是,业务逻辑并不依赖这些适配器,而是适配器依赖业务逻辑。

关于入站端口和出站端口,详细解释如下,

  • 入站端口
定义业务逻辑提供的API,供外部应用调用
入站适配器调用入站端口
REST 适配器是最常见的入站适配器
  • 出战端口
定义业务逻辑如何调用外部应用
出战适配器实现了出战端口
DAO是最常见的出栈适配器

六边形架构的优点如下:
因为在代码结构上把业务逻辑与表示层,持久层完全解耦。从而可以保持业务逻辑的独立性,业务逻辑与环境,技术,框架无关。因为解耦,所以可与多种外部应用进行适配。

六边形架构的可扩展性如何?服务变大之后可以拆分吗?

可以拆分,但是复杂度比传统的分层架构高,小颗粒度单元用六边形架构比较好。

什么情况下应该选择六边形架构?

  • 单体架构
    实现视图:打包成一个可执行文件或WAR包
    进程视图:运行在一个进程中
    部署视图:部署到一台服务器
    与逻辑视图不冲突:可采用分层架构,也可采用六边形架构

  • 微服务架构:应用被分解成多个服务
    实现视图:每个服务被打包成一个可执行文件,JAR包或者WAR包
    进程视图:每个服务运行在一个进程中
    部署视图:每个服务被部署到一台机器上
    每个服务是一个小的单体应用,每个服务一般采用六边形架构

参考资料

微服务架构
微服务设计

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/47961.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Linux6.17 Docker 安全及日志管理

文章目录 计算机系统5G云计算第四章 LINUX Docker 安全及日志管理一、Docker 容器与虚拟机的区别1.隔离与共享2.性能与损耗 二、Docker 存在的安全问题1.Docker 自身漏洞2.Docker 源码问题 三、Docker 架构缺陷与安全机制1.容器之间的局域网攻击2.DDoS 攻击耗尽资源3.有漏洞的系…

Redis 高可用之持久化

一、Redis 高可用 1.1 什么是高可用 在web服务器中,高可用是指服务器可以正常访问的时间,衡量的标准是在多长时间内可以提供正常服务(99.9%、99.99%、99.999%等等)。 但是在Redis语境中,高可用的含义似乎要宽泛一些,除了保证提…

postgresql|数据库|启动数据库时报错:FATAL: could not map anonymous shared memory的解决

前言: 一个很偶然的出现的问题,因为我需要验证备份文件是否正确,因此,我在一台已启动了一个数据库实例的服务器上,依据全备的数据库文件在启动一个实例,当然,在此之前,已经修改了备…

LeakCanary内存泄漏检测框架分析。

一、什么叫内存泄漏、内存溢出? 内存溢出(out of memory):是指程序在申请内存时,没有足够的内存空间供其使用,出现out of memory;比如申请了一个integer,但给它存了long才能存下的数,那就是内存溢出。 内…

IO模型、javaIO

介绍 网络通讯,一台计算机给另一台计算机传输数据,中间过程就叫做通信,也就是通过IO接口输入输出到另一台计算机,这个就叫做网络IO. 文件描述符(File descriptor) 是计算机科学中的一个术语,是…

进阶高级测试专项,Pytest自动化测试框架总结(一)

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 1、框架简介 pyt…

ad+硬件每日学习十个知识点(9)23.7.20

文章目录 1.正点原子fpga开拓者无gui检查项目2.排针连接器A2541WR-XP-2P3.肖特基二极管反接在LDO的输出端,是什么用?4.在AD中如何实现批量元器件的移动?5.在PCB中,如何让元器件以任意角度旋转?6.接口设计都要做静电防护…

Kotlin 内联函数语法之let、apply、also、run、with的用法与详解

一、介绍 kotlin的语法千奇百怪,今天我们将介绍项目中频率使用比较高的几个内联函数。 二、什么叫内联函数? 内联函数 的语义很简单:把函数体复制粘贴到函数调用处 。使用起来也毫无困难,用 inline关键字修饰函数即可。 语法&a…

MySQL中锁的简介——表级锁-表锁

1.表级锁简介 2.读锁介绍 lock tables score read;3.写锁介绍 lock tables score write;

Eurographics 2023最新综述:图形学中的神经-符号模型

随着 CVPR 2023 Best Paper 的公布,其中一篇名为 VISPROG 的工作引起了广泛关注。这项工作利用自然语言指令解决复杂且组合性的视觉任务,重新将神经-符号方法带回了人们的视野,并证明了计算机视觉社区对这种方法的认可。实际上,VI…

对比CahtGPT Bard Claude2对中文的理解

对比CahtGPT Bard Claude2对中文的理解 今天简单测试了一下目前这三个很火的模型对中文的理解能力 简单问题 鲁迅和周树人的关系 Bard CahtGPT Claude 介绍一下平凡的世界这本书 Bard CahtGPT

在pycharm运行成功但在linux运行ModuleNotFoundError: No module named *xxx*

问题所在 在pycharm里可以运行成功但是在linux中python main.py运行出现ModuleNotFoundError: No module named xxx 此处xxx大概率是你的from的自定义的package 原因 这类原因主要是在使用pycharm的时候你进行多个文件的目录的整理或者打包,在主函数中被调用 from …

MQ公共特性介绍 (ActiveMQ, RabbitMQ, RocketMQ, Kafka对比)

本章介绍 本文主要介绍所有MQ框架都具备的公共特点,同时对比了一些目前比较主流MQ框架的优缺点,给大家做技术选型作参考。 文章目录 本章介绍MQ介绍适用场景异步通信案例一案例二 系统解耦削峰填谷广播通信总结 缺点MQ对比APQP历史AMQP是什么 MQ介绍 M…

css设置背景图片和边框背景

介绍一个网站,在这个网站里可以找到各种好看的背景图片和边框图片。 数据大屏 (代码是reactts,使用时请自行转换) 一:设置页面背景图片 css部分 .productionBoard {width: 100%;height: 100%;padding: 0 2rem;box-si…

操作系统知识点总结

操作系统知识点总结: 第一章:操作系统概述 1.1操作系统的概念: ​ 操作系统是一种系统软件,与其他系统软件和应用软件不同,它有自己的基本特征。它的四大基本特征也就是并发,共享,虚拟,异步。 1.2操作系统的特征(四大…

智慧消防:如何基于视频与智能分析技术搭建可视化风险预警平台?

一、背景分析 消防安全是一个重要的话题,涉及到每个人的生活和安全。每年都会发生大量的火灾,给人们带来极大的危害,摧毁了大量的财产,甚至造成了可怕的人员伤亡。而消防安全监督管理部门人员有限,消防安全监管缺乏有…

垃圾回收之三色标记法(Tri-color Marking)

关于垃圾回收算法,基本就是那么几种:标记-清除、标记-复制、标记-整理。在此基础上可以增加分代(新生代/老年代),每代采取不同的回收算法,以提高整体的分配和回收效率。 无论使用哪种算法,标记…

Gitlab服务器备份恢复及系统升级

居安思危,思则有备,有备无患。 基于此,申请了一个测试服务器,准备先安装同版本服务器,按照最新的数据进行恢复,然后再将现在的服务器升级到Gitlab的最新版本,记录一下完整的过程,以…

【第一阶段】varval类型推断

Val 可读不可改 代码示例: 不可改: fun main() {//val可读不可改val name:String"kotlin"//不可改 此时会报错 报错打印信息:Val cannot be reassignedname"java" }可读: fun main() {//val可读不可改val…

uniapp WIFI上下班打卡

大纲 🥙 uniapp官网:uni-app官网 🥙 WIFI功能模块: 1、下载 wifi 插件 uni-WiFi 2、在 manifest.json 中 App权限配置中 配置权限 1. ACCESS_WIFI_STATE (访问权限状态) 2. CHANGE_WIFI_STATE&#xff…