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

SpringBoot的六边形架构案例

时间:2022-08-10 14:19:24  来源:  作者:解道Jdon

六边形架构是一种用于设计软件应用程序的架构模式。近年来,它的受欢迎程度有所增加,因为它是传统分层架构的替代品。

 

分层架构有什么问题?

这种架构模式应用 SoC(关注点分离)原则将我们的组件分解为层,每一层都有不同的职责。通常,有 3 层:

  1. 表示层,其中包含用户界面。
  2. 业务层领域层,包含业务逻辑。
  3. 持久层,处理数据库操作。

在应用这种架构模式时,我们面临着层与层之间的依赖关系,即每一层都依赖于紧接其下的层。该模型未能表明我们可以与多个数据库交互或根本不与任何数据库交互。此外,表示层没有考虑到用户与我们的应用程序交互的方式可能不止一种。

六边形架构如何克服分层架构的弊端?

该模型将所有业务逻辑置于应用程序的核心,抽象出任何类型的外部依赖。这种隔离使得逻辑更容易测试和维护。

应用程序现在拥有一个或多个处理用户请求的输入适配器,而不是表示层。类似地,现在我们有一个或多个输出适配器来调用外部应用程序或服务,而不是持久层,例如 Amazon S3 中的文件存储、SendGrid 等电子邮件服务,或者更常见的是数据库。

 

业务核心有一个或多个端口。端口定义了一组操作,允许核心与适配器进行交互,从而与应用程序外部的内容进行交互正如我们有两种类型的适配器,输入和输出,有一个输入端口和一个输出端口输入端口是内核公开的供外部应用程序访问的 API,而输出端口是允许内核使用外部服务的接口。

输入适配器通过调用输入端口来处理来自外部世界的请求。这方面的一个例子是实现 REST API 或 gRPC 服务器的 Spring 控制器。

输出适配器实现了一个输出端口,该端口通过调用外部应用程序或服务来处理来自业务核心的请求。一些示例是执行数据库操作的 DAO(数据访问对象)类,或使用电子邮件服务的 Spring 组件。

到目前为止,我们已经看到了与六边形架构相关的概念。现在,让我们将理论付诸实践,并使用 Kotlin 构建一个 Spring 应用程序。

首先,我个人喜欢将项目分为三个主要包:

  • core”包,包含与核心业务相关的组件。
  • “ ports ”包,包含将业务核心与外界通信的输入和输出组件。
  • “ config ” 包,用于启动应用程序和处理其内部行为所需的所有配置。
  •  

构建核心

放置我们的Article实体。请注意,它使用普通的 Kotlin(或 JAVA),但完美地代表了业务实体。

package com.github.manerajona.blog.coreimport java.time.LocalDateTimetypealias ArticleId = Longdata class Article(    val id: ArticleId?,    var title: String,    var headline: String,    var content: String,    val addedAt: LocalDateTime?)


其他包括:
 

  • ArticleRepository接口,它允许业务核心与外部服务进行通信。
  • ArticleService接口,它允许外部应用程序与业务核心进行通信。在usecase包中,ArticleServiceImpl 类 扩展了ArticleService并包含实际的业务逻辑。

 

数据库适配器的输出端口

ports/output/jpa包包含将数据持久保存到数据库中的组件。

包含:

  • 基于core实体的ArticleJpa类。
  • 从 Spring JPA 库扩展JpaRepository的ArticleJpaRepository类。
  • ArticleDao类扩展了ArticleRepository,允许业务核心获取和持久化数据。

 

REST 适配器的输入端口

最后,ports/inputs/rs包包含 Rest Controller,暴露端点以供外部应用程序使用。

 

为什么架构很重要?

设计软件时存在一组基本要求,称为服务质量要求。这些要求定义了我们在构建高质量软件的过程中必须解决的一些权衡问题,例如可伸缩性可靠性可维护性可测试性可部署性。

架构很重要,因为如果我们在选择时足够明智,那么适合我们项目的架构模式将帮助我们的软件达到预期的质量,并且也许可以让我们免去一些麻烦。

示例代码可在GitHub上找到。



Tags:SpringBoot   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
概念IOC:控制反转。从前需要在程序中创建对象实例;现在则通过一个外部的容器统一动态创建spring IOC 容器中的实例如何动态加载Condition:只有在特定条件满足时才加载举例 @Con...【详细内容】
2022-10-10  Tags: SpringBoot  点击:(96)  评论:(0)  加入收藏
简介在项目中,存在传递超大 json 数据的场景。直接传输超大 json 数据的话,有以下两个弊端 占用网络带宽,而有些云产品就是按照带宽来计费的,间接浪费了钱 传输数据大导致网络...【详细内容】
2022-10-10  Tags: SpringBoot  点击:(22)  评论:(0)  加入收藏
前言最近自己用Spring Cloud Alibaba做了一个微服务架构的项目,部署的时候遇到了难题:内存不够。目前该项目有7个微服务,因为我只有一台阿里云的服务器(2C 4G),所以我只能把所有...【详细内容】
2022-10-06  Tags: SpringBoot  点击:(24)  评论:(0)  加入收藏
关于NettyNetty 是一个利用 Java 的高级网络的能力,隐藏其背后的复杂性而提供一个易于使用的 API 的客户端/服务器框架。MAVEN依赖 <dependencies> <!-- https://mvnrepos...【详细内容】
2022-09-27  Tags: SpringBoot  点击:(22)  评论:(0)  加入收藏
因业务需要, 公司内需要使用 SpringBoot Starter 构建 SDK. 不同的是使用了更为灵活的 Kotlin 语言, 构建脚本也换成了 Kotlin Script. 框架: SpringBoot 业务代码语言: Kot...【详细内容】
2022-09-27  Tags: SpringBoot  点击:(25)  评论:(0)  加入收藏
一、下载MinIo的地址https://min.io/download#/windows二、如何进行启动 绝对路径\minio.exe server F:\Data --console-address ":9001" 访问页面http://192.168.1.100:90...【详细内容】
2022-09-26  Tags: SpringBoot  点击:(40)  评论:(0)  加入收藏
姿势1:ThreadLocal+TaskDecorator用户工具类/** *使用ThreadLocal存储共享的数据变量,如登录的用户信息 */public class UserUtils { private static final ThreadLocal<...【详细内容】
2022-09-16  Tags: SpringBoot  点击:(57)  评论:(0)  加入收藏
添加依赖 org.springframework.boot spring-boot-starter-logging 在yml配置文件中添加配置应用配置文件logging: config: classpath: logback.xml 配置logback.xml文件信...【详细内容】
2022-09-16  Tags: SpringBoot  点击:(105)  评论:(0)  加入收藏
Spring官方已不推荐使用Autowired字段/属性注入bean,,一些大公司的新项目也明令禁止使用了。1. 说明最近公司升级框架,由原来的spring framerwork 3.0升级到5.0,然后写代码的时...【详细内容】
2022-09-16  Tags: SpringBoot  点击:(56)  评论:(0)  加入收藏
最近在开发一个新项目,用的框架(中间件)比较多,所以最近的文章,都会以优雅的实战为主,也可以是框架(中间件)的简单DEMO。今天给大家带来EhCache在SpringBoot框架下使用实战。简介EhC...【详细内容】
2022-09-16  Tags: SpringBoot  点击:(66)  评论:(0)  加入收藏
▌简易百科推荐
数据一致性前面总结了微服务的9个痛点,有些痛点没有好的解决方案,而有些痛点是有对策的,从本章开始,就来讲解某些痛点对应的解决方案。这一章先解决数据一致性的问题,先来看一个...【详细内容】
2022-10-23  互联共商     Tags:微服务   点击:(1)  评论:(0)  加入收藏
前导近期有个同事跟我说遇到一件很奇怪的事情,时不时收到售后反馈说 部分用户无法接收到聊天室(WebSocket 服务)消息,然而在测试服以各种方式测试都无法复现这种现象。于是陷...【详细内容】
2022-10-21  raylin666  今日头条  Tags:WebSocket   点击:(11)  评论:(0)  加入收藏
引言笔者在经历的的一些项目中都使用了 DDD 领域驱动设计进行架构设计,尤其是在业务梳理、中台规划以及微服务划分等方面,DDD 是重要的架构设计方法论,对业务领域建模、微服务...【详细内容】
2022-10-20  宫心职场攻略   网易号  Tags:DDD   点击:(5)  评论:(0)  加入收藏
微服务的痛点在产品研发过程中,引入一种技术来解决一个业务问题并不难,难的是能否合理评估技术风险,这个观点对微服务同样适用。因此,本节将专门讨论微服务会带来哪些问题,这部分...【详细内容】
2022-10-17  大数据架构师  今日头条  Tags:微服务   点击:(2)  评论:(0)  加入收藏
译者 | 布加迪数据在急剧增多。全球每天生成的数据量三年后将达到463 EB。相比之下,人类迄今生成的所有单词量估计总共也就5 EB。为了在当今的数字经济下取得成功,许多企业在...【详细内容】
2022-10-08    51CTO  Tags:架构   点击:(14)  评论:(0)  加入收藏
大家好!在本手册中,您将了解软件架构这一广阔而复杂的领域。当我第一次开始编码之旅时,我发现这是一个既令人困惑又令人生畏的领域。所以我会尽量避免你的困惑。在这本手册中,我...【详细内容】
2022-10-08  一个即将被退役的码农  今日头条  Tags:软件架构   点击:(5)  评论:(0)  加入收藏
消息队列中的消息消费时并不能保证总是成功的,那失败的消息该怎么进行消息补偿呢?这就用到今天的主角消息重试和死信队列了。生产者消息重试有时因为网路等原因生产者也可能发...【详细内容】
2022-10-07  索码理  稀土掘金  Tags:RocketMq   点击:(20)  评论:(0)  加入收藏
访问者模式:从介绍到实践百万级高并发WebRTC流媒体服务器设计与开发download:https://www.zxit666.com/1305/01什么是访客模式?访问者模式的定义如下,是指在不改变数据结构的情...【详细内容】
2022-10-07  石哥学长  网易号  Tags:WebRTC   点击:(19)  评论:(0)  加入收藏
在云原生架构出现之前,大家谈论最多的是微服务架构。有的企业可能只有一种架构,有的企业经历过多种架构的演变。架构的选择与企业当前所处的阶段有很大关系,好的架构都是为了解...【详细内容】
2022-10-06  大数据推荐杂谈  今日头条  Tags:架构   点击:(18)  评论:(0)  加入收藏
本期推荐的优质项目是基于 Java开发的微服务聚合网关,是拥有自主知识产权的应用网关国产化替代方案,能够实现热服务编排聚合、自动授权选择、线上服务脚本编码、在线测试、高...【详细内容】
2022-10-06  硕宇精选开源  今日头条  Tags:微服务   点击:(34)  评论:(0)  加入收藏
站内最新
站内热门
站内头条