如何简洁高效的搭建一个SpringCloud2023的maven工程

前言

依赖管理有gradle和maven,在这里选择比较常用和方便的Maven作为工程项目和依赖管理工具来搭建SpringCloud实战工程。主要用到的maven管理方式是多模块和bom依赖管理。

什么是maven的多模块依赖管理

Maven 多模块项目相对于单模块项目而言,依赖是不共享的,但父模块提供了全局共享依赖的功能,可以针对不同模块所需要依赖的包进行分模块引入。具体如下:

  • 所有子模块都依赖的包,如junit可以统一由父模块中的<dependencies>设置依赖。
  • 多个子模块但非全部子模块依赖的包,可以在父模块中的<dependencyManagement>中统一管理依赖版本,再由每个子模块自主引入依赖,这样设置可以达到项目中多个子模块依赖的包版本统一的目的。
  • 单个子模块依赖的包,可以直接交由这个子模块引入即可。但有时候出于对后续可能添加子模块考虑,即使当前只有一个子模块依赖的包,也可以统一交由父模块的<dependencyManagement>统一管理,而如果确认后续不会再加子模块的,可以按前者进行处理。

在父模块中,可通过<properties>统一管理依赖包的版本,让共享包也更加统一管理。

什么是maven的bom依赖管理

Maven 的 BOM(Bill of Materials)依赖管理是一种用于集中管理项目依赖关系和版本的方式,它提供了一种方便的方法来确保多个项目或模块在使用相同依赖时具有一致的版本。

BOM 通常是一个特殊的 Maven POM(Project Object Model)文件,其中定义了项目所需的依赖项及其版本。通过在其他项目中引用这个 BOM,这些项目将自动获取 BOM 中定义的依赖版本,而无需明确指定每个依赖的版本。

这样做的好处是可以减少重复的依赖配置工作,并确保在多个项目中使用相同的依赖版本,从而减少由于依赖不一致导致的问题。此外,BOM 还可以用于管理依赖的升级和版本控制,只需在 BOM 中更新依赖的版本,所有引用该 BOM 的项目都会自动获取最新的版本。

要使用 Maven 的 BOM 依赖管理,通常需要执行以下步骤:

  • 创建或获取一个 BOM POM 文件,其中定义了项目的依赖和版本信息。
  • 在需要使用 BOM 的项目中,通过在<dependencyManagement>部分引用 BOM POM 文件。
  • 在项目的具体依赖部分,可以直接使用 BOM 中定义的依赖,而无需明确指定版本。

组件选型

在“SpringCloud2023最新版本该如何进行组件选型?”一文中已经具体的介绍了SpringCloud的组件对比和选型,具体可以查看合集里面的相关文档。

  • 注册中心(Spring Cloud Zookeeper):负责服务的注册和发现。
  • 网关(Spring Cloud Gateway):作为外部请求的入口,实现路由和负载均衡。
  • 云服务配置(Spring Cloud Config):用于管理服务的配置信息。
  • 熔断(Sentinel):提供熔断器功能,实现服务的限流和降级。
  • 服务追踪(Micrometer Tracing):用于追踪和监控服务的性能和调用情况。
  • 测试集成(JUnit 5 + Spring Boot Test):用于编写和执行单元测试。
  • 远程调用(OpenFeign):用于服务之间的远程调用。
  • 接口文档(springdoc-openapi + openapi3):用于生成和管理 API 的文档。
  • 分布式事务(Seata):用于处理跨多个服务的事务。

版本选择

在“SpringCloud和SpringBoot的版本依赖该怎么选择”一文中已经具体的介绍了SpringCloud的版本如何选择,具体可以查看合集里面的相关文档。

组件版本
jdk17
spring boot3.2.x
spring cloud2023.0.x
spring cloud alibaba2022.0.0.0(还未更新,但是兼容2023)

为什么选择JDK17

选择JDK17的原因如下:

  • JDK 17是 LTS(长期支持版)。
  • JDK 17性能提升不少。
  • 大多数第三方框架和库都已经支持,不会有什么大坑。
  • JDK 17有更多的新特性支持。

Maven工程依赖说明

|-- banana-client1
|-- banana-client2
|-- banana-client3
|-- banana-client4-sentinel
|-- banana-client5-tracing
|-- banana-client6-test
|-- banana-common
|   |-- banana-common-bom
|   `-- banana-common-core
|-- banana-config
|-- banana-gateway
|-- banana-gateway-sso
`-- banana-seata-example
  • 根目录下的pom.xml负责管理整个项目的版本和依赖引入版本管理,以及子模块的管理。
  • banana-common-bom 负责管理整个公共依赖的版本,比如undertow、swagger的版本。
  • banana-common-core 负责管理整个公共组件的引入,比如 hutool、validation、test等。
  • gateway 相关项目为SCG相关工程。
  • client 相关项目为springboot相关工程。
  • 其他工程会在后续的文章说明。欢迎持续关注。

顶级工程pom.xml配置

该maven的pom文件定义了如下内容:

  • Maven 项目的模块列表
  • Maven 项目的属性列表
  • Maven 项目的依赖管理
  • Maven 项目的仓库列表
  • Maven 项目的构建配置
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><!-- Maven 项目的根节点 --><modelVersion>4.0.0</modelVersion><!-- Maven 项目的groupId,在 Maven 仓库中,groupId 必须是唯一的 --><groupId>io.rainforest</groupId><!-- Maven 项目的 artifactId,可以包含多个模块 --><artifactId>banana</artifactId><!-- Maven 项目的版本号 --><version>1.0</version><!-- Maven 项目的打包方式,这里是 pom --><packaging>pom</packaging><!-- Maven 项目的模块列表 --><modules><module>banana-gateway</module><module>banana-config</module><module>banana-common</module><module>banana-client1</module><module>banana-client2</module><module>banana-client3</module><module>banana-client4-sentinel</module><module>banana-client5-tracing</module><module>banana-client6-test</module><module>banana-seata-example</module><module>banana-gateway-sso</module></modules><!-- Maven 项目的属性列表 --><properties><!-- Maven 编译器的 source 版本 --><maven.compiler.source>17</maven.compiler.source><!-- Maven 编译器的 target 版本 --><maven.compiler.target>17</maven.compiler.target><!-- 项目构建的源编码 --><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><!-- Spring Boot 的版本 --><spring-boot.version>3.2.3</spring-boot.version><!-- Spring Cloud 的版本 --><spring-cloud.version>2023.0.0</spring-cloud.version><!-- Spring Cloud Alibaba 的版本 --><spring-cloud-alibaba.version>2022.0.0.0</spring-cloud-alibaba.version></properties><!-- Maven 项目的依赖管理 --><dependencyManagement><!-- Maven 项目的依赖列表 --><dependencies><!-- banana 公共版本定义 --><dependency><groupId>io.rainforest</groupId><artifactId>banana-common-bom</artifactId><version>${project.version}</version><type>pom</type><scope>import</scope></dependency><!-- Spring Boot 依赖 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-dependencies</artifactId><version>${spring-boot.version}</version><type>pom</type><scope>import</scope></dependency><!-- Spring Cloud 依赖 --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>${spring-cloud.version}</version><type>pom</type><scope>import</scope></dependency><!-- Spring Cloud Alibaba 依赖 --><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-alibaba-dependencies</artifactId><version>${spring-cloud-alibaba.version}</version><type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement><!-- Maven 项目的仓库列表 --><repositories><!-- Maven 中央仓库的配置 --><repository><id>central</id><name>Central Repository</name><url>https://mirrors.huaweicloud.com/repository/maven/</url><layout>default</layout><snapshots><enabled>false</enabled></snapshots></repository></repositories><!-- Maven 项目的构建配置 --><build><!-- Maven 项目构建的最终名称 --><finalName>${project.name}</finalName><!-- Maven 项目的资源配置 --><resources><!-- 资源文件所在的目录 --><resource><directory>src/main/resources</directory><!-- 对资源文件进行过滤 --><filtering>true</filtering></resource></resources><!-- Maven 项目的插件管理 --><pluginManagement><!-- Maven 项目的插件列表 --><plugins><!-- Spring Boot Maven 插件的配置 --><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><version>${spring-boot.version}</version><configuration><!-- 项目构建的最终名称 --><finalName>${project.build.finalName}</finalName><!-- 启用 Spring Boot 的分层 --><layers><enabled>true</enabled></layers></configuration><!-- Maven 插件的执行配置 --><executions><!-- Maven 插件的执行目标 --><execution><goals><goal>repackage</goal></goals></execution></executions></plugin></plugins></pluginManagement></build>
</project>

工程的公用依赖bom配置

该maven的pom文件定义了如下内容:

  • Maven 项目的属性列表,包含版本等信息
  • Maven 项目使用到的依赖版本管理
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><groupId>io.rainforest</groupId><artifactId>banana-common-bom</artifactId><version>1.0</version><modelVersion>4.0.0</modelVersion><packaging>pom</packaging><description>banana-common-bom 公共依赖管理</description><properties><banana.common.version>${project.version}</banana.common.version><spring-boot.version>3.1.3</spring-boot.version><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><log4j2.version>2.17.1</log4j2.version><maven.compiler.target>17</maven.compiler.target><maven.compiler.source>17</maven.compiler.source><git.commit.plugin>4.9.9</git.commit.plugin><spring.checkstyle.plugin>0.0.39</spring.checkstyle.plugin><fastjson.version>1.2.83</fastjson.version><springdoc.version>2.1.0</springdoc.version><swagger.core.version>2.2.14</swagger.core.version><mybatis-plus.version>3.5.3.2</mybatis-plus.version><mysql.version>8.0.33</mysql.version><dynamic-ds.version>4.1.3</dynamic-ds.version><seata.version>1.6.1</seata.version><excel.version>3.1.0</excel.version><asm.version>7.1</asm.version><sms.version>3.0.0</sms.version><jaxb.version>2.3.5</jaxb.version><shardingsphere.version>5.4.0</shardingsphere.version><hutool.version>5.8.21</hutool.version><mica.version>3.0.8</mica.version><sentinel.version>1.8.4</sentinel.version></properties><!-- 定义全局jar版本,模块使用需要再次引入但不用写版本号--><dependencyManagement><dependencies><dependency><groupId>io.rainforest</groupId><artifactId>banana-common-core</artifactId><version>${banana.common.version}</version></dependency><dependency><groupId>com.mysql</groupId><artifactId>mysql-connector-j</artifactId><version>${mysql.version}</version></dependency><!--springdoc --><dependency><groupId>org.springdoc</groupId><artifactId>springdoc-openapi-starter-webflux-ui</artifactId><version>${springdoc.version}</version></dependency><dependency><groupId>org.springdoc</groupId><artifactId>springdoc-openapi-starter-webmvc-api</artifactId><version>${springdoc.version}</version></dependency><dependency><groupId>io.swagger.core.v3</groupId><artifactId>swagger-annotations-jakarta</artifactId><version>${swagger.core.version}</version></dependency><!--fastjson 版本--><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>${fastjson.version}</version></dependency><!-- 多数据源依赖 --><dependency><groupId>com.baomidou</groupId><artifactId>dynamic-datasource-spring-boot3-starter</artifactId><version>${dynamic-ds.version}</version></dependency><!--  阿里云短信下发 --><dependency><groupId>io.springboot.sms</groupId><artifactId>aliyun-sms-spring-boot-starter</artifactId><version>${sms.version}</version></dependency><!--  seata kryo 序列化--><dependency><groupId>io.seata</groupId><artifactId>seata-serializer-kryo</artifactId><version>${seata.version}</version></dependency><!--orm 相关--><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>${mybatis-plus.version}</version></dependency><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-extension</artifactId><version>${mybatis-plus.version}</version></dependency><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-annotation</artifactId><version>${mybatis-plus.version}</version></dependency><!--hutool bom 工具类--><dependency><groupId>cn.hutool</groupId><artifactId>hutool-bom</artifactId><version>${hutool.version}</version><type>pom</type><scope>import</scope></dependency><!--mica bom 工具类--><dependency><groupId>net.dreamlu</groupId><artifactId>mica-bom</artifactId><version>${mica.version}</version><type>pom</type><scope>import</scope></dependency><!--web 模块--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><version>${spring-boot.version}</version><exclusions><!--排除tomcat依赖--><exclusion><artifactId>spring-boot-starter-tomcat</artifactId><groupId>org.springframework.boot</groupId></exclusion></exclusions></dependency><dependency><groupId>com.github.xiaoymin</groupId><artifactId>knife4j-openapi3-jakarta-spring-boot-starter</artifactId><version>4.3.0</version></dependency></dependencies></dependencyManagement><build><plugins><!--打包jar 与git commit 关联插件--><plugin><groupId>io.github.git-commit-id</groupId><artifactId>git-commit-id-maven-plugin</artifactId><version>${git.commit.plugin}</version></plugin><!--代码格式插件,默认使用spring 规则--><plugin><groupId>io.spring.javaformat</groupId><artifactId>spring-javaformat-maven-plugin</artifactId><version>${spring.checkstyle.plugin}</version></plugin></plugins></build></project>

源码信息

和“SpringCloud实战”对应的源码信息如下:

  • github https://github.com/r0ad/spring-cloud-example
  • gitee https://gitee.com/r0ad/spring-cloud-example

关于作者

来自一线全栈程序员nine的八年探索与实践,持续迭代中。欢迎关注“雨林寻北”或添加个人卫星codetrend(备注技术)。

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

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

相关文章

SOC设计:关于reset的细节

有如下几个信号 1、时钟&#xff1a;clk_top 2、总的reset信号&#xff1a;rstn_top 3、scan的reset信号&#xff1a;scan_rstn 4、软件复位信号&#xff1a;rstn_soft_sub 5、scan模式信号&#xff1a;scan_mode 6、reset bypass 信号&#xff1a;scan_rstn_sel 功能&a…

Go程序是如何编译并运行起来的(图文详解)

Go程序是如何编译的 从hello RdrB1te开始 package main import "fmt" func main() { fmt.Println("hello RdrB1te") }不实际编译它&#xff0c;只输出它的编译过程&#xff1a; go build -n简单的编译过程分析&#xff1a; 上面的过程确认了两个…

Cookie和Session(会话技术)

文章目录 Cookie和Session&#xff08;会话技术&#xff09;一、Cookie1、Cookie概述1.1、Cookie简介1.2、Cookie的使用场景1.3、Cookie底层原理 2、Cookie的基本使用3、Cookie实现显示用户上次访问时间4、Cookie编码与解码5、Cookie总结 二、Session1、Session概述1.1、Sessio…

FPGA高端项目:FPGA基于GS2971的SDI视频接收+OSD动态字符叠加,提供1套工程源码和技术支持

目录 1、前言免责声明 2、相关方案推荐本博已有的 SDI 编解码方案本方案的SDI接收转HDMI输出应用本方案的SDI接收图像缩放应用本方案的SDI接收纯verilog图像缩放纯verilog多路视频拼接应用本方案的SDI接收HLS图像缩放HLS多路视频拼接应用本方案的SDI接收HLS多路视频融合叠加应用…

基于Matlab实现免疫荧光图像中的区域定位算法

基于Matlab实现免疫荧光图像中的区域定位算法 免疫荧光法。以荧光染料为标记物,试纸条为载体,发生抗原抗体特异性反应,根据免疫复合物被激发的荧光强度对待测物进行定量分析[。该方法具有环境要求不高、操作简单快速、无污染且荧光染料丰富等优点。 常用于食品安全检测过程中…

opengauss 数据库-高可用 jdbc 使用方法

opengauss 数据库-高可用 jdbc 使用方法 驱动下载 下载 jdbc 驱动 openGauss-2.1.0-JDBC.tar.gz 下载地址&#xff1a;软件包 | openGauss 表 demo 案例 create database test; create schema demo; CREATE TABLE demo.websites (id int NOT NULL,name char(20) NOT NULL …

sklearn随机森林实现(备忘版)

scikit-learn是广泛使用的机器学习python库. sklearn已经实现了决策树及集成模型, 下面是随机森林分类算法实现的示例代码. import numpy as np import pandas as pd from sklearn.ensemble import RandomForestClassifier datasetpd.read_table(/path/to/DataSet/Classificat…

uniapp路由跳转的方式

1. uniapp路由跳转的方式 1.1. uni.navigateTo保留当前页面&#xff0c;跳转到应用内的某个页面&#xff0c;使用uni.navigateBack可以返回到原页面。 uni.navigateTo({url:./index/index });注意&#xff1a; &#xff08;1&#xff09;页面跳转路径有层级限制&#xff0c;不…

vue3+element plus 实现百度地图显示路径

添加依赖 <!-- index.html --><script type"text/javascript" src"//api.map.baidu.com/getscript?v3.0&akyI6kBeC9G4LntEWXklE2iNHwRUrmFEQc"></script><script type"text/javascript" src"//api.map.baidu.co…

i++和++i区别

i和 i都是C和C等编程语言中的自增运算符&#xff0c;用于将变量的值增加1。它们的功能都是自增&#xff0c;但在实现细节上有一些差异。i是前缀自增运算符&#xff0c;它先将i的值增加1&#xff0c;然后返回增加后的值。i是后缀自增运算符&#xff0c;它先返回i的当前值&#x…

Python 用作计算器走向编程的第一步

Python 速览 下面的例子以是否显示提示符&#xff08;>>> 与 ...&#xff09;区分输入与输出&#xff1a;输入例子中的代码时&#xff0c;要键入以提示符开头的行中提示符后的所有内容&#xff1b;未以提示符开头的行是解释器的输出。注意&#xff0c;例子中的某行出…

【golang】26、retry-go 使用示例和源码解析

文章目录 一、使用方法1.1 http 示例1.1.1 retry.Do1.1.2 retry.DoWithData1.1.3 OnRetry1.1.4 根据 error 的类型&#xff0c;决定 delay 的时长1.1.5 自定义 retry function 二、API2.1 Do 执行2.1.1 Do2.1.2 DoWithData 2.2 Delay 策略2.3 错误处理2.3.1 Unwrap2.3.2 Unwrap…

idea手动导入插件

idea有时候连接不上 我们去手动下载压缩包 插件网址 选择下载的压缩包导入 导入成功

算力调度和云计算有何区别

Canalys发布的研究报告显示&#xff0c;2023年第二季度&#xff0c;全球云基础设施服务支出增长16%&#xff0c;达到724亿美元。 此前云厂商们的高速增长&#xff0c;主要归功于大规模的企业数字化转型和上云。当前市场的增速放缓&#xff0c;除了上云普及带来的市场增量见顶&…

软考笔记--软件架构风格

软件体系结构设计的一个核心目标是重复的体系结构模式&#xff0c;即达到体系结构级的软件重用。也就是说&#xff0c;在不同的软件系统中&#xff0c;使用统一体系结构。基于这个目标&#xff0c;主要任务就是研究和实践体系结构风格和类型问题。 一.软件架构风格概述 软件体…

centos7 部署kibana

先决条件参考 虚拟机部署elasticsearch集群-CSDN博客 这里使用elk101服务器安装kibana 下载rpm包(这里添加了-c参数用到wget的断点续传功能) #下载kibana-rpm包以及校验文件 wget -c https://artifacts.elastic.co/downloads/kibana/kibana-7.17.18-x86_64.rpm wget -c htt…

continue、break 和 return 的区别是什么?

continue、break和return同样是用于控制程序流程的关键字&#xff0c;它们有不同的作用和用法。 continue: 在Java中&#xff0c;continue语句同样通常用于循环结构&#xff08;如for循环、while循环&#xff09;。当程序执行到continue时&#xff0c;会立刻跳过当前循环中剩…

02_Git

文章目录 GitGit的核心流程Git的命令clone指令status指令add指令commit指令push指令pull指令log指令 Git中处理冲突协同合作Git中回退的措施忽略文件 Git git的特点&#xff1a; 分布式 比如说&#xff1a;同事A、同事B、同事C都能对远程仓库进行操作&#xff0c;就是分布式 …

微服务分布式中为什么要分库分表呢?

什么是分库分表&#xff1f; 概念&#xff1a; 分库分表是一种数据库水平扩展的方法&#xff0c;通过将数据分散存储在多个数据库实例或多张表中&#xff0c;以提高系统的性能和扩展性。在Java应用中&#xff0c;可以使用一些数据库中间件或框架来实现分库分表。 为什么要分…

Oracle常用语句语法

1 第一章Oracle命令 转载至 Oracle常用语句语法汇总 https://www.modb.pro/db/1759752946170548224 a) 系统管理员连接 conn */* as sysdba b) 查询当前用户 show user c) 创建新用户 create user 用户名 identified by 密码&#xff08;密码不能以数字开头&#xff09;。例如…