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

news2024/10/6 22:29:51

引言

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.coloradmin.cn/o/25463.html

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

相关文章

数字信号处理-5-傅里叶分析

1 傅里叶系数 傅里叶级数用公式如下: a0、a1、a2、a3…b1、b2、b3…叫做傅里叶系数。cosnx 或 sinnx 中的 n 对应着频率,决定 sin、cos 大小的系数是 an、bn。 2 傅里叶变换 步骤1 求傅里叶系数 从原波形 F(x) 中求傅里叶系数中的 a0、a1、a2、a3……

IPD-产品需求管理过程(1)

一、产品需求管理模型 在确定客户需求时,要考虑影响用户购买标准的八类基本需求($APPEALS),并基于客户视角进行详细分解,形成有针对性的产品。 1.1、需求管理业务流程 二、需求收集流程 2.1、需求收集的来源 路标规划:通过市场管理流程分析,落实到路标规划中的需求…

python中StringIO和BytesIO

1. 类文件对象 最常见的io操作是将磁盘中的文件读到内存以及内存内容写入文I件。还有一种内存和内存之间的IO,叫类文件对象,python中的StringIO和BytesIO就是类文件对象,通俗解释即:像操作文件一样在内存中操作字符串和二进制内容…

基于FPGA的SD卡的数据读写实现(SD NAND FLASH)

文章目录 1、存储芯片分类 2、NOR Flash 与 NAND Flash的区别 3、什么是SD卡? 4、什么是SD NAND? 5、SD NAND的控制时序 6、FPGA实现SD NAND读写 6.1、设计思路 6.2、仿真结果 6.3、实验结果 1、存储芯片分类 目前市面上的存储芯片&#xff0…

如何使用腾讯云提供的WordPress应用镜像搭建博客网站系统!

之前也有写过搭建WordPress的教程,如何使用轻量应用服务器搭建WordPress个人博客使用的是宝塔面板一件搭建的方式,但是还是有一些麻烦,这里我们之间使用腾讯云提供的WordPress应用镜像搭建,感兴趣小伙伴可以参考以下! …

嵌入式分享合集108

一、PLC串口通讯的基本知识 这几天弄plc都要神经了 尤其西门子的 太烦了 s7200cn s7200smart s1200 编程软件都不一样~~服 , 然后接线也很烦 好了 正题 电气作业人员在使用PLC的时候会接触到很多的通讯协议以及通讯接口 什么是串口通讯? 串口通讯的使…

阿里强势推出Spring源码进阶宝典:思维脑图+视频教程+笔记文档

这不是准备跳槽了,所以最近摸鱼比较多一些,老大默许了,我觉得我老大还是很好的。也在网上看了一些资料,但是,我发现很多讲解注解的时候,对于一些可以直接点击源码查看的内容讲解的占多数,但是授…

ThreadPoolExecutor 线程池参数详解,执行流程

线程池的使用: public static void main(String[] args) {ThreadFactory sThreadFactory new ThreadFactory() {private final AtomicInteger mCount new AtomicInteger(1);Overridepublic Thread newThread(Runnable r) {int andIncrement mCount.getAndIncrement();return…

成熟的汽车衡称重软件,应具备哪些品质

每台汽车都配电子计算机、打印机各一台,并配相应称重管理软件。制造厂商开发的最新软件应免费及时为买方升级。自动称重系统管理软件选用国内成熟产品,至少在国内有10套以上稳定运行业绩,需配一套容量为2KVA,220V的UPS电源至少满足…

Guava LongMath类

Guava LongMath类 Guava LongMath类 LongMath提供long基础类型的实用方法。 类声明 以下是com.google.common.math.LongMath类的声明: GwtCompatible(emulatedtrue) public final class LongMath extends Object 方法 方法继承 这个类继承了以下类方法&#xf…

二、数据库查询语句(多表查询篇)

二、数据库查询语句(多表查询篇) 1、笛卡尔积 ​ 前面涉及的都是单张表的查询,如果我们的查询条件相对比较复杂,需要涉及多张表进行查询,如果是两张无关的表联合查询,列出所有的可能的结果,如下图: 如果没…

网易云课堂-课程分析

需要原始数据的可以联系我、在评论区留下邮箱 需要原始数据的可以联系我、在评论区留下邮箱 需要原始数据的可以联系我、在评论区留下邮箱 需要原始数据的可以联系我、在评论区留下邮箱 数据展示 一级类目 二级类目 三级类目 求和项:在学人数 平均值项:原始价格 平均值…

docker-compose配合Dockerfile使用

也就是在dockers-compose.yml文件中添加build 指定一下我的Dockerfile文件的路径 例如我的dockers-compose.yml文件在docker-compose文件夹下,而docker-compose文件夹与Dockerfile和项目的war包在同一级目录,也就是Dockerfile文件,在dockers-…

readme.md编写并生成html

目录1、Markdown教程2、生成html3、目录制作3.1 vscode Markdown Preview Enhanced 插件3.2 自定义侧边栏4、参考1、Markdown教程 Markdown 教程 | 菜鸟教程 2、生成html 通过 vscode 下载 Markdown Preview Enhanced、Markdown PDF等插件,就可以实现转化 3、目…

Linux网络管理OSI和TCP/IP

作者简介:一名软件运维工作人员,正在自学云计算课程。宣言:人生就是B(birth)和D(death)之间的C(choise),做好每一个选择。创作不易,动动小手给个点…

【改进灰狼优化算法】贪婪的非分层灰狼优化算法(Matlab代码实现)

👨‍🎓个人主页:研学社的博客 💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜…

RF电路设计常见bug及解决方法

单片射频器件大大方便了一定范围内无线通信领域的应用,采用合适的微控制器和天线并结合此收发器件即可构成完整的无线通信链路。它们可以集成在一块很小的电路板上,应用于无线数字音频、数字视频数据传输系统,无线遥控和遥测系统,…

转自【AI科技评论】专访李海洲教授 | 机器智能对话是毕生所求

一直来到实叻坡,乜事无。上山来做工,伯公“多隆”保平安。——潮州过番歌 所谓“过番”,指早期潮州人外出务工,乘坐小船历经七天七夜到达东南亚谋生,“实叻坡”是马来语“Selat”的音译词,便是指“新加坡”…

Quartz学习

任务执行流程 StdSchedulerFactory创建和属性初始化 如果自定义了属性,会在这里加载 StdScheduler创建 入口为StdSchedulerFactory#getScheduler();,首次进入时调用StdSchedulerFactory#instantiate: 如果没有配置自定义属性,则先…

2022年企业数字化技术应用 5 大趋势丨三叠云

根据易观分析发布的相关报告,本期视频将对2022年企业数字化技术应用 5 大趋势进行讲解,内容可能比较硬核,值得你先收藏再观看。 趋势一:武装数字员工“RPA低代码AI” 中国市场技术供应商正在快速推动技术民主化进程,其…