基于Spring Cloud的架构使用学习升级之路

news/2024/5/18 2:58:32/文章来源:https://blog.csdn.net/u013034223/article/details/127970234

引言

Spring Cloud全家桶用了挺长时间了,很长一段时间都是基于已有的架构进行需求研发。今年成为团队技术负责人,承担了新的项目,这是很好的一个机会,于是开启了项目架构升级之路。

架构,是团队项目的根基。在一个团队内通过规定一个固定的架构设计,可以让团队内能力参差不齐的同学们都能有一个统一的开发规范,降低沟通成本,提升效率和代码质量。

本篇博客将以项目架构熟悉使用-学习接触新的架构设计-新项目新架构为思路,记录一下自己在项目架构设计方面的成长。

熟悉使用

其实之前对Spring Cloud仅停留在自己的了解,还没有真正的实战经验,刚看到项目框架,整体上看是比较简单的,项目都是由固定的三个模块组成,结构如下:

在这里插入图片描述
下面具体描述一下每个模块所包含的包及作用:

  • web模块
    1)依赖api模块,提供前端接口。
    2)在controller层代码中,调用feign client包下的feign接口。
    3)nacos config包下均是需要通过nacos配置获取得到的属性等。core包下主要是aop日志记录和异常捕获。

  • provider模块
    1)依赖api模块,实现feign接口。
    2)feign client包主要是调用其他服务的feign接口。
    3)dao和service实现包是对数据库进行操作数据库访问层和逻辑处理层。
    4)nacos config包同样是需要通过nacos配置获取属性定义的各个类。

  • api模块
    1)feign接口,即服务与服务之间的调用接口定义。
    2)entity和service interface是数据库实体与service接口定义。
    3)dto包下是所有feign接口的入参和出参类定义。
    4)vo包下是前端web模块入参和出参类定义。

以上项目架构,从过去一段时间的使用体会来说,其实对于熟悉项目框架的研发人员来说代码的编写是不可控的,对于不熟悉了项目框架的研发人员来说是不太友好的。这里列举几个明显的弊端:

  1. api中包含对数据库操作的相关类,如entity、service implement,这原本是项目本身的基础类,加在api中,那么暴露在引用api的模块甚至于是其他项目的服务中,是不符合架构设计的,将自身内部逻辑暴露于api,而外部也不关心这部分内容。
  2. controller模块和provider模块都有feign client包,如果是web模块和provider模块需要调用相同的feign接口,那么在两个模块都需要分别定义,这显然会存在大量重复的代码。
  3. web层模块缺少service业务逻辑处理类,controller层包含大量的逻辑代码,那么对于重复的逻辑也是复用不了,代码可读性也比较差。

很长一段时间,我都是基于以上架构做需求开发,也是因为改变不了,所以只能是接受使用。今年机会来了,我独立带了一个新的项目团队,该团队有新项目也有旧项目,新项目勾起了我的改变欲望,于是就开始了下面的新架构设计之路。

DDD“洋葱架构”

在这里插入图片描述

如上图所示,洋葱架构是由多个同心层构成,它们相互连接,并朝向代表领域的核心。

原则

  • 依赖性

    圆圈代表不同的责任层。一般来说,潜入得越深,就越接近于领域和业务规则。外圈代表机制,内圈代表核心领域逻辑。外层依赖于内层,而内层则对外圈一无所知。通常情况下,属于外圈的类、方法、变量和源代码依赖于内圈,但是反过来也一样。

    数据格式/结构可能因层而异。外层的数据格式不应该被内层使用。例如,API 中使用的数据格式可以与 DB 中用于持久化的数据格式不同。数据流可以使用数据传输对象。每当数据跨层/跨界时,它应该以方便该层的形式出现。例如,API 可以有 DTO,DB 层可以有 Entity Objects,这取决于存储在数据库中的对象与领域模型的不同。

  • 数据封装

    每个层/圈封装或隐藏内部的实现细节,并向外层公开接口。所有的层也需要提供便于内层消费的信息。其目的是最小化层与层之间的耦合,最大化跨层垂直切面内的耦合。

  • 关注点的分离

    应用被分为若干层,每一层都有一组职责,并解决不同的关注点。每一层都作为应用中的模块/包/命名空间。

  • 耦合性

    低耦合性,可以使一个模块与另一个模块交互,而不需要关注另一个模块的内部。所有的内部层都不需要关注外部层的内部实现。

优势

  • 提供了灵活、可持续和可移植的架构。
  • 各层之间没有紧密的耦合,并且有关注点的分离。
  • 由于所有的代码都依赖于更深的层或者中心,所以提供了更好的可维护性。
  • 提高了整体代码的可测试性,因为单元测试可以为单独的层创建,而不会影响到其他的模块。
  • 框架/技术可以很容易地改变而不影响核心领域。例如,RabbitMQ 可以被 ActiveMQ 取代,SQL 可以被 MongoDB 取代。

其实自己一开始并没有了解过“洋葱架构”,而是在其他项目组重构的时候听说而来,所以不忙的时候就会看看关注一下。通过对架构思想的了解,从github上看过了很多的项目示例,在新项目开始前,也有充足的时间让我去做准备。接下来的架构升级就是将学习到的架构设计与自身项目实际相结合的成果。

架构升级

新项目整体架构设计如下图所示:
在这里插入图片描述
原来的三个模块转变为六个模块,这也不是凭空想象而来,而是依据项目实际情况拆分的,主要是为了避免旧架构的一些明显缺陷,每个模块都是有着明确的职责。

  • type模块
    前端接口的请求参数和返回参数,属于独立模块,仅对参数做一些校验功能,类的命名也不用再加VO标识。

  • client模块
    spring cloud feign client统一定义模块,web模块调用feign client接口使用。在web模块中加了一层service也是为了对于不同的类需要用到的feign client可以在这一层统一处理,provider模块中不再定义feign client。

  • infrastructure模块
    与数据库操作相关的所有类均存在于该模块中,并且不会对外暴露,只供自身项目的provider模块使用。

  • web模块
    1)提供前端接口的模块,但不再依赖api模块。直接通过依赖feign client模块,调用服务的feign接口。
    2)依赖types模块,直接提供接口的入参和出参。

  • provider模块
    1)依赖api模块,实现feign接口。
    2)依赖infrastructure模块,实现对数据库的操作。

  • api模块
    1)feign接口,即服务与服务之间的调用接口定义。
    2)dto包下是所有feign接口的入参和出参类定义。

前三个模块是新加的模块,后三个模块与之前的设计相比也有不同的作用,这改变了过去架构混乱各模块职责不清的弊端,降低了各模块的耦合程度,从实际使用来看,新成员的加入很容易理解和上手,也提升了代码可读性与健壮性。

总结

目前,团队中部分新项目采用的是升级后的架构,但也不是所有项目都采用的该架构。由于不同项目有着业务与职责的差异,也是在不同的项目中会根据实际情况做调整。

正如之前看到过文章里说的那样,实际使用中“洋葱架构”的每一层我们并不一定都是需要的,而应该根据项目实际情况做动态设计和调整。这一次的架构使用——学习——升级对自己来说算是一次很好地成长。

参考资料:

详解DDD系列——应用架构

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

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

相关文章

为什么开源在线表单工具能做好数据管理?

在数字化时代,数据的有效应用和管理可以说是企业的无形资产,做好数据管理既能提升办公效率,又能帮助企业从规律的数字化管理中获取高效的管理策略。那么,什么样的开源在线表单工具可以实现这一目的?对于企业而言&#…

token的使用

一:什么是token及token的作用? 1.什么是token? Token是首次登录时,由服务器下发,作为客户端进行请求时的一个令牌。当请求后台方法时,用于身份验证 当第一次登录后,服务器生成一个Token便将此…

【SpringBoot】SpringBoot+SpringSecurity+CAS实现单点登录

文章目录一.CAS的概述1.SSO2.CAS3.概念二.CAS的流程三.CAS服务端部署1.下载地址2.源码打包3.部署运行4. java.io.FileNotFoundException: \etc\cas\thekeystore (系统找不到指定的文件。)四.CAS的定制1.定制数据源2.兼容 HTTP3.定制登录页五.SpringBoot集成CAS1.工程创建2.导入…

【OpenCV 例程 300篇】248. 特征描述之HOG描述符

『youcans 的 OpenCV 例程300篇 - 总目录』 【youcans 的 OpenCV 例程 300篇】248. 特征描述之HOG描述符 1. 方向梯度直方图 方向梯度直方图(Histogram of Oriented Gradient, HOG)使用梯度方向的分布作为特征来构造描述符,应用非常广泛。 梯…

十万部冷知识:“澳大利亚”为什么属于亚洲球队?

在2022年卡塔尔世界杯上,总共有6支球队入围,他们分别是日本队,韩国队,沙特队,伊朗队,澳大利亚队,还有就是东道主卡塔尔队。但是我们知道,澳大利亚,并不是亚洲的国家&…

前端面试题(JS部分)

目录一, 数据类型1,什么是引用类型,值类型?2,哪些值类型3,哪些引用类型4,判断数据类型5,typeof判断6,instanceof7,construtor二,浅拷贝 / 深拷贝1…

在阿里云 ACK 上部署 EMQX MQTT 服务器集群

云进入以「应用为中心」的云原生阶段,Operator 模式的出现,则为 Kubernetes 中的自动化任务创建配置与管理提供了一套行之有效的标准规范。通过将运维知识固化成高级语言 Go/Java 代码,使得运维知识可以像普通软件一样交付,并能支…

Jmeter的使用说明

一、安装Jmeter工具 链接:https://pan.baidu.com/s/1ZYc15eq9DO-r0ChKHxMXlg?pwdckcd 提取码:ckcd --来自百度网盘超级会员V5的分享二、Jmeter的常用元器件说明 jmeter八大元件件:取样器,前置处理器,后置处理器&a…

MySQL的高阶学习:索引、B+树

1.索引 索引是一种数据结构,如果没有索引,查找一个数据就需要从第一页开始全局检索直至找到需要的数据,有了索引可以先在目录中根据拼音查找到该数据所在的页数,因此通过索引可以大大减少了查询时间。 索引有两种存储类型&#xf…

汽车安全气囊设计?Abaqus/Part特殊建模方法-附案例step-by-step教学

作者 | 邓怡超 Abaqus/Part基于特征的建模功能可以说非常齐全,基本能够满足一般的分析要求,更复杂的模型则可以通过与专业三维建模软件之间的接口来导入,今天要说的是部件的另外一种建模方法。 有一种类型的分析,部件自身的初始…

Linux基础8 - 网络配置

Linux基础8 - 网络配置 一、网络连接的三种方式 Vmware为我们提供了三种网络工作模式,它们分别是:Bridged(桥接模式)、NAT(网络地址转换模式)、Host-Only(仅主机模式)。 1、桥接模式…

zabbix日志监控:操作系统、业务系统、文件大小、多行日志

zabbix日志监控:操作系统、业务系统、文件大小、多行日志 目录1 监控操作系统日志2 监控业务系统日志具体要求:分析:操作:3 监控日志文件大小(1)在被管主机当中安装agent(2)在以下za…

Activity、Fragment之间的传值

1、Activity和Activity之间传值 1、使用Intent 2、使用Intent结合Bundle IntentBundle 3、传自定义对象实现(实现Serialzable接口,性能较差,系统自动处理) 传自定义对象 4、传自定义对象(实现Parcelable,性能较好…

操作系统复习【面试】

操作系统复习【面试】前言推荐操作系统复习第一章 操作系统引论 11.3 操作系统的基本特性 141.3.1 并发1.3.2 共享1.3.3 虚拟1.3.4 异步1.4 操作系统的主要功能 171.4.1 处理机管理功能1.4.2 存储器管理功能1.4.3 设备管理功能1.4.4 文件管理功能1.4.5 操作系统和用户之间的接口…

MySQL Hash Join前世今生

GreatSQL社区原创内容未经授权不得随意使用,转载请联系小编并注明来源。GreatSQL是MySQL的国产分支版本,使用上与MySQL一致。作者:nw MySQL Hash Join前世今生 因工作需要,对MySQL Hash Join的内部实现做了一些探索和实践&#x…

内部类_Java

作者:爱塔居的博客_CSDN博客-JavaSE领域博主 专栏:JavaSE 文章目录 目录 文章目录 一、内部类的概念 二、内部类的分类 1.静态内部类(被static修饰) 2.非静态内部类 3.局部内部类 4.匿名内部类 一、内部类的概念 当一个事物…

【微服务解耦之事件启动】Spring Boot 解耦之事件驱动

一、前言 简介: 在项目实际开发过程中,我们有很多这样的业务场景:一个事务中处理完一个业务逻辑后需要跟着处理另外一个业务逻辑,伪码大致如下: Service public class ProductServiceImpl {...public void saveProdu…

ggplot2 | 世界杯赛程的可视化就交给我吧!~

11. 写在前面 昨天卡塔尔🇶🇦输了比赛真是让人大跌眼镜啊😱,打破了世界杯东道主必胜的神律,也不知道王子们是怎么想的。🤣 今天是英格兰🏴󠁧󠁢󠁥&#xe006e…

WebRTC Pacer

目录 一. 前言 二. WebRTC Pacer 1. 数据包传入Pacer模块的队列 2. Pacer模块取出队列的包发送 (1)什么时候取出数据包发送 (2)每次发送多少数据量 (3)避免引入较大延时的处理方法 一. 前言 实时音视…

Android Studio实现一个点餐系统

点餐系统作业要求效果登录注册欢迎页用户管理菜品种类管理菜品管理订单查询点餐后厨助手源码导读手把手编写注册、用户管理板块新建实体类User新建User服务新建注册活动用户管理作业要求 功能: 1.数据管理 菜品类别:凉菜;热菜&…