六边形架构

六边形架构

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

微服务系统架构

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

微服务定义

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

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

微服务系统设计

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

当我们在讨论微服务系统架构时,很多人都会把架构粗犷的理解为根据系统需求划分为几个模块的服务,这是不对的。站在工程的角度,我们描述一个系统的角度应该是立体的。主要使用 “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包
    进程视图:每个服务运行在一个进程中
    部署视图:每个服务被部署到一台机器上
    每个服务是一个小的单体应用,每个服务一般采用六边形架构

参考资料

微服务架构
微服务设计

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Linux】 由“进程”过渡到“线程” -- 什么是线程(thread)?

知识引入初识线程1.什么叫做进程?2.什么叫做线程?3.如何看待我们之前学习的进程? 理解线程创建线程函数调用1.线程一旦被创建,几乎所有资源都是被线程所共享的2.与进程之间切换相比,线程的切换 初识线程总结&#xff1…

使用 Docker 快速上手中文版 LLaMA2 开源大模型

本篇文章,我们聊聊如何使用 Docker 容器快速上手朋友团队出品的中文版 LLaMA2 开源大模型,国内第一个真正开源,可以运行、下载、私有部署,并且支持商业使用。 写在前面 感慨于昨天 Meta LLaMA2 模型开放下载之后,Git…

操作系统练习:进程间通信(共享内存方式)

说明 本文是《操作系统概念(第九版)》3.4节“进程间通信”的练习。 进程间通信主要由两种模型: 共享内存消息传递 本文使用共享内存的方式实现进程间的通信 创建消息生产者 创建生产者的主要操作包括: 定义共享内存的大小、名称,以及通…

netty知识集锦2

粘包半包 粘包半包解决方案, 1短链接,它的消息边界是从链接建立到链接断开 2.定长解码器:服务器端选最大长度的消息作为定长,客户端不足补齐,缺点造成浪费 netty协议设计与解析 Message编码解码

AWS IAM介绍

前言 AWS是世界上最大的云服务提供商,它提供了很多组件供消费者使用,其中进行访问控制的组件叫做IAM(Identity and Access Management), 用来进行身份验证和对AWS资源的访问控制。 功能 IAM的功能总结来看,主要分两种&#xff1…

《零基础入门学习Python》第060讲:论一只爬虫的自我修养8:正则表达式4

有了前面几节课的准备,我们这一次终于可以真刀真枪的干一场大的了,但是呢,在进行实战之前,我们还要讲讲正则表达式的实用方法和扩展语法,然后再来实战,大家多把持一会啊。 我们先来翻一下文档:…

openGauss学习笔记-17 openGauss 简单数据管理-表达式

文章目录 openGauss学习笔记-17 openGauss 简单数据管理-表达式17.1 简单表达式17.2 条件表达式17.3 子查询表达式17.4 数组表达式17.5 行表达式 openGauss学习笔记-17 openGauss 简单数据管理-表达式 表达式类似一个公式,我们可以将其应用在查询语句中&#xff0c…

25 MFC 数据库

文章目录 导入ADO库 导入ADO库 #import "C:\Program Files\Common Files\System\ado\msado15.dll" no_namespace rename("EOF","rsEOF")void CADODlg::OnBnClickedBtnQuery() {//导入ADO库::CoInitialize(NULL);//初始化COM库_ConnectionPtr pCo…

《面试1v1》如何提高远程用户的吞吐量

🍅 作者简介:王哥,CSDN2022博客总榜Top100🏆、博客专家💪 🍅 技术交流:定期更新Java硬核干货,不定期送书活动 🍅 王哥多年工作总结:Java学习路线总结&#xf…

Flutter动画库:animations(路由过渡动画或者页面切换动画)

animations animations 是一个 Flutter 库,它提供了一组用于创建动画效果的工具和组件。这个库的核心重点是路由过渡动画或者页面切换动画 地址 https://pub-web.flutter-io.cn/packages/animations 安装 flutter pub add animations看了下官方文档和官方例子&a…

计科web常见错误排错【HTTP状态404、导航栏无法点开、字符乱码及前后端数据传输呈现、jsp填写的数据传到数据库显示null、HTTP状态500】

web排错记录 在使用javaweb的过程中会出现的一些错误请在下方目录查找。 目录 错误1:HTTP状态404——未找到 错误2:导航栏下拉菜单无法点开的问题 错误3:字符乱码问题 错误4:jsp网页全部都是??&#x…

【单片机】MSP430F149单片机,晨启,音乐播放器,蜂鸣器音乐

四、音乐播放器 任务要求: 设计制作一个简易音乐播放器(通过手柄板上的蜂鸣器发声,播放2到4首音 乐),同时LED模块闪烁,给人视、听觉美的感受。 评分细则: 按下播放按键P15开始播放音乐&#x…

【C++】继承基础知识及简单应用,使用reportSingleClassLayout(在Visual Studio开发人员命令提示窗口)查看派生类详细信息

author:&Carlton tag:C topic:【C】继承基础知识及简单应用,使用reportSingleClassLayout(在Visual Studio开发人员命令提示窗口)查看派生类详细信息 website:黑马程序员C date&#xf…

微信小程序原生上传图片和预览+云函数上传

1.前台页面 1.1wxml问阿金 <!-- 说明一个上传页面的按钮 --> <button type"primary" bindtap"uploadPage">上传页面展示</button> <!-- 声明一个上传服务器的按钮 --> <button type"warn" bindtap"uploadSeve…

第四讲:MySQL中DDL一些基本数据类型及表的创建、查询

目录 1、创建表:2、DDL一些基本数据类型&#xff1a; 1、创建表: 部分单词及解析&#xff1a; 1、tables:表 2、comment:评论&#xff0c;解释 3、gender:性别 4、neighbor&#xff1a;邻居 1、创建表&#xff1a;&#xff08;注&#xff1a;在自定义数据库操作&#xff0c;…

spring中bean实例化的三种方式 -- Spring入门(二)

文章目录 前言1.Bean实例化简介2.bean的实例化 -- 构造方法3.bean的实例化 -- 静态工厂实例化4.bean实例化 -- 实例工厂和FactoryBean5.三种bean实例化方式的区别 总结 前言 为了巩固所学的知识&#xff0c;作者尝试着开始发布一些学习笔记类的博客&#xff0c;方便日后回顾。…

Leetcode 112. 路径总和

题目链接&#xff1a;https://leetcode.cn/problems/path-sum/description/ 思路 递归&#xff0c;先序遍历二叉树&#xff0c;每遍历一个节点便减去当前存储值&#xff08;targetSum targetSum - root.val&#xff09;&#xff1b;当到达某个节点等于targetSum (targetSum…

labview 子画面插入面板

1.前言 在前面一篇文章中描述了弹框式显示子画面&#xff0c; labview 弹窗(子vi)_weixin_39926429的博客-CSDN博客 本文介绍插入式显示子画面。 本文的主题在以前的文章中介绍过&#xff0c; labview 插入子面板_labview插入子面板_weixin_39926429的博客-CSDN博客 借用…

机器学习算法分类

机器学习根据任务的不同&#xff0c;可以分为监督学习、无监督学习、半监督学习、强化学习。 1. 无监督学习 训练数据不包含任何类别信息。无监督学习里典型例子是聚类。要解决的问题是聚类问题和降维问题&#xff0c;聚类算法利用样本的特征&#xff0c;将具有相似特征的样本…

微服务 云原生:搭建 K8S 集群

为节约时间和成本&#xff0c;仅供学习使用&#xff0c;直接在两台虚拟机上模拟 K8S 集群搭建 踩坑之旅 系统环境&#xff1a;CentOS-7-x86_64-Minimal-2009 镜像&#xff0c;为方便起见&#xff0c;直接在 root 账户下操作&#xff0c;现实情况最好不要这样做。 基础准备 关…