六边形架构

news2024/11/26 13:24:38

六边形架构

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

微服务系统架构

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

微服务定义

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

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

微服务系统设计

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

当我们在讨论微服务系统架构时,很多人都会把架构粗犷的理解为根据系统需求划分为几个模块的服务,这是不对的。站在工程的角度,我们描述一个系统的角度应该是立体的。主要使用 “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.coloradmin.cn/o/780594.html

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

相关文章

2023牛客暑期多校第一场部分题解

索引 BCDHJKLM B 官方题解说是乱搞题,而我队友实际上也确实乱搞过去了( 就是先随便取两个点,有了两个点之后第三个点肯定选离这两个点构成的直线最远的那个,要不然没法包含整个凸多边形。这个过程可以用个三分。 但是确定了第三…

前端(八)——深入探索前端框架中的Diff算法:优化视图更新与性能提升

😊博主:小猫娃来啦 😊文章核心:深入探索前端框架中的Diff算法:优化视图更新与性能提升 文章目录 前端框架中的Diff算法概述vue和react框架的diff算法React的diff算法:Vue的diff算法: Diff算法在…

实训笔记7.20

实训笔记7.20 7.20一、座右铭二、HDFS宕机之后的副本数的问题三、MapReduce的工作流程(简单版本)四、Hadoop的序列化问题五、MR程序运行中InputFormat类的作用5.1 作用主要有两个5.2 有一个核心实现类--抽象类FileInputFormat 当输入的数据是文件的时候5…

【图像分类】基于LIME的CNN 图像分类研究(Matlab代码实现)

目录 💥1 概述 📚2 运行结果 🎉3 参考文献 🌈4 Matlab代码实现 💥1 概述 基于LIME(Local Interpretable Model-Agnostic Explanations)的CNN图像分类研究是一种用于解释CNN模型的方法。LIME是一…

实用的设计模式08——适配器模式

适配器的单词是Adapter,我们在开发时经常碰到叫做XxxAdapter的类,此时一般就是使用了适配器模式,适配器模式是非常常用,本文就对适配器模式做一个简单的介绍 文章目录 1、真实开发场景的问题引入2、适配器模式讲解2.1 核心类及类图…

2021年全国大学生电子设计竞赛H题——用电器分析识别装置

用电器分析识别装置 一、题目要求二、系统方案三、硬件设计3.1、ATT7022电参数采集模块 一、题目要求 任务 设计并制作一个根据电源线电流的电参量信息分析在用电器类别的装置。该装置具有学习和分析识别两种工作模式。在学习模式下,测试并存储用于识别各单件电器的…

百亿规模京东实时浏览记录系统的设计与实现 | 京东云技术团队

1. 系统介绍 浏览记录系统主要用来记录京东用户的实时浏览记录,并提供实时查询浏览数据的功能。在线用户访问一次商品详情页,浏览记录系统就会记录用户的一条浏览数据,并针对该浏览数据进行商品维度去重等一系列处理并存储。然后用户可以通过…

mybatis事物是如何和spring事物整合的

目录 1、mybatis事物管理器 2、SpringManagedTransactionFactory如何处理事物 3、spring事物如何设置connection连接到threadLocal 1、mybatis事物管理器 mybatis事物抽象接口类:Transaction。该接口定义了事物基本方法和获取数据库连接方法 该类有三个实现类Jd…

【本地开发快速添加localstoreage和cookie】

在本地开发时,通常会需要线上开发或测试环境的缓存,然而,如果缓存过多时,一个一个的复制key,value太过麻烦,于是本文介绍了一种快速设置缓存的方法。 cookie 需要用到插件,使用JSON格式导出&am…

PPT逻辑设计与完美呈现

PPT逻辑设计与完美呈现 https://haoxinyunxueyuan.zhixueyun.com/#/study/course/detail/detailInfoCD00——朱宁川 logo设计神器: https://www.zitijia.com/logodiy/index 一 PPT设计 第一章、PPT的灵魂设计-5W PPT灵魂设计(5W) 以终为始,从目标出发 why 目…

136. 只出现一次的数字

题目 题解一&#xff1a;采用map集合 class Solution {public static int singleNumber(int[] nums) {Map map new HashMap<Integer,Integer>();for (int i 0; i < nums.length; i) {//判断key是否重复&#xff0c;重复直接删掉重复的keyif (map.containsKey(nums[i…

JavaWeb 速通Servlet(请求转发和请求重定向)

目录 一、HttpServletRequest 1.简介 : 2.常用方法 : 1 getRequestURI() : 2 getRequestURL() : 3 getRemoteHost() : 4 getHeader(String header) : 5 getParameter(name) : 6 getParameterValues(name) : 7 getMethod() : 8 setAttribute(key, value) : 9 getAttrib…

面试之JVM的储存空间

Java8之后&#xff0c;取消了整个永久代区域&#xff0c;取而代之的是元空间。运行时常量池和静态常量池存放在元空间中&#xff0c;而字符串常量池依然存放在堆中。&#xff08;&#xff09; JVM允许时数据区 程序计数器的特点以及作用 &#xff1f; 1、程序计数器 是一块较…

protobuf学习

protobuf的安装 Windos版安装 下载地址&#xff1a;https://github.com/protocolbuffers/protobuf/releases 选择合适的版本下载 将下载的压缩包解压&#xff0c;把解压后文件的bin目录的路径配置到系统环境比变量Path中 在cmd 中执行 protoc --version 成功就说明安装成功了l…

Vue.js基础简答题

系列文章目录 后续补充 文章目录 系列文章目录前言一、库与框架的区别是什么&#xff1f;二、Vue.js 的核心特性有哪些&#xff1f;三、什么是数据驱动视图&#xff1f;四、MVVM 模型各部分含义是什么&#xff0c;在 Vue.js 中分别对应哪些功能&#xff1f;五、el 选项的作用是…

一)Stable Diffusion使用教程:安装

目前AI绘画最火的当属Midjorney和Stable Diffusion&#xff0c;但是由于Midjourney没有开源&#xff0c;因此我们主要分享下Stable Diffusion&#xff0c;后面有望补上Midjourney教程。 本节主要讲解Stable Diffusion&#xff08;以下简述SD&#xff09;的下载和安装。 1&…

uniapp查看ios打包后的Info.plist文件

最近在用 uni 开发 ios 的时候给项目添加了自定义的 Info.plist 文件&#xff0c;但是打包后发现并没有生效&#xff0c;才有了查看打包后的 Info.plist 文件想法。 HBuilderX3.6.5起&#xff0c;支持直接在应用项目中配置 iOS 平台的 Info.plist 和 资源文件&#xff08;Bundl…

pytest中生成allure报告时,测试报告中统计的用例数不正确

【问题描述】&#xff1a;pytest中生成allure报告时&#xff0c;测试报告中统计的用例数不正确&#xff0c;用例数总是比实际用例数多 【问题定位】&#xff1a;因为生成index.html的allure报告&#xff0c;是根据临时的json文件生成的。每次运行时&#xff0c;没有删除旧的js…

Grafana图形web监控的安装与配置

目录 一、安装并配置 二、Web访问 三、Grafana启用zabbix插件 四、Grafana添加zabbix数据源 五、创建仪表盘 创建监控项完成保存仪表盘 六、查看创建的仪表盘 七、在现有的dashboard&#xff08;仪表盘&#xff09;中添加图形 八、查看最终dashborad&#xff08;仪表盘&#x…

react 实现小球加入购物车动画

代码 import React, { useRef } from react;const ProductLayout () > {const box useRef(null);const createBall (left, top) > {const ball document.createElement(div);ball.style.position absolute;ball.style.left left - 10 px;ball.style.top top - 1…