一、Spring Cloud 和 Spring Boot版本选择
1.选择Spring Boot版本
2022年3月30日,国家信息安全漏洞共享平台(CNVD)收录了Spring框架远程命令执行漏洞(CNVD-2022-23942),漏洞影响的产品版本包括:版本低于5.3.18和5.2.20的Spring框架或其衍生框架构建的网站或应用。
查询spring boot版本 SpringBoot2.6.6最新版本对应spring-framework的5.3.18版本,所以采用SpringBoot版本2.6.6。
查询方法:进入 mvnrepository.com/ 输入Spring Boot Starter 进入 mvnrepository.com/artifact/or… 选择版本进入 mvnrepository.com/artifact/or… 查看[org.springframework]对应的版本号(5.3.18)
2.选择Spring Cloud版本
根据SpringBoot版本选择Spring Cloud版本
"spring-cloud": {
"Hoxton.SR12": "Spring Boot >=2.2.0.RELEASE and <2.4.0.M1",
"2020.0.5": "Spring Boot >=2.4.0.M1 and <2.6.0-M1",
"2021.0.0-M1": "Spring Boot >=2.6.0-M1 and <2.6.0-M3",
"2021.0.0-M3": "Spring Boot >=2.6.0-M3 and <2.6.0-RC1",
"2021.0.0-RC1": "Spring Boot >=2.6.0-RC1 and <2.6.1",
"2021.0.1": "Spring Boot >=2.6.1 and <2.6.7-SNAPSHOT",
"2021.0.2-SNAPSHOT": "Spring Boot >=2.6.7-SNAPSHOT and <3.0.0-M1",
"2022.0.0-M1": "Spring Boot >=3.0.0-M1 and <3.0.0-M2",
"2022.0.0-M2": "Spring Boot >=3.0.0-M2 and <3.1.0-M1" }
匹配选择Sping Cloud版本 2021.0.1
<!--springboot版本 -->
<spring-boot.version>2.6.6</spring-boot.version>
<!--spring-cloud版本-->
<spring-cloud.version>2021.0.1</spring-cloud.version>
<!-- 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-boot配置 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.6.6</version>
<!-- 为了解决子工程单继承的问题,通过<type>pom</type>可以依赖于其他的pom父工程,从而将pom工程中的依赖都传递过来 -->
<type>pom</type>
<scope>import</scope>
</dependency>
二. Spring-cloud-alibaba组件选择
github.com/alibaba/spr…
每个 Spring Cloud Alibaba 版本及其自身所适配的各组件对应版本(经过验证,自行搭配各组件版本不保证可用)如下表所示(最新版本用*标记):
Spring Cloud Alibaba Version Sentinel Version Nacos Version RocketMQ Version Dubbo Version Seata Version 2021.0.1.0* 1.8.3 1.4.2 4.9.2 2.7.15 1.4.2 2.2.7.RELEASE 1.8.1 2.0.3 4.6.1 2.7.13 1.3.0 2.2.6.RELEASE 1.8.1 1.4.2 4.4.0 2.7.8 1.3.0 2021.1 or 2.2.5.RELEASE or 2.1.4.RELEASE or 2.0.4.RELEASE 1.8.0 1.4.1 4.4.0 2.7.8 1.3.0 2.2.3.RELEASE or 2.1.3.RELEASE or 2.0.3.RELEASE 1.8.0 1.3.3 4.4.0 2.7.8 1.3.0 2.2.1.RELEASE or 2.1.2.RELEASE or 2.0.2.RELEASE 1.7.1 1.2.1 4.4.0 2.7.6 1.2.0 2.2.0.RELEASE 1.7.1 1.1.4 4.4.0 2.7.4.1 1.0.0 2.1.1.RELEASE or 2.0.1.RELEASE or 1.5.1.RELEASE 1.7.0 1.1.4 4.4.0 2.7.3 0.9.0 2.1.0.RELEASE or 2.0.0.RELEASE or 1.5.0.RELEASE 1.6.3 1.1.1 4.4.0 2.7.3 0.7.1
毕业版本依赖关系(推荐使用)
下表为按时间顺序发布的 Spring Cloud Alibaba 以及对应的适配 Spring Cloud 和 Spring Boot 版本关系(由于 Spring Cloud 版本命名有调整,所以对应的 Spring Cloud Alibaba 版本号也做了对应变化)
Spring Cloud Alibaba Version Spring Cloud Version Spring Boot Version 2021.0.1.0 Spring Cloud 2021.0.1 2.6.3 2.2.7.RELEASE Spring Cloud Hoxton.SR12 2.3.12.RELEASE 2021.1 Spring Cloud 2020.0.1 2.4.2 2.2.6.RELEASE Spring Cloud Hoxton.SR9 2.3.2.RELEASE 2.1.4.RELEASE Spring Cloud Greenwich.SR6 2.1.13.RELEASE 2.2.1.RELEASE Spring Cloud Hoxton.SR3 2.2.5.RELEASE 2.2.0.RELEASE Spring Cloud Hoxton.RELEASE 2.2.X.RELEASE 2.1.2.RELEASE Spring Cloud Greenwich 2.1.X.RELEASE 2.0.4.RELEASE(停止维护,建议升级) Spring Cloud Finchley 2.0.X.RELEASE 1.5.1.RELEASE(停止维护,建议升级) Spring Cloud Edgware 1.5.X.RELEASE
1. 使用 Spring Cloud 2021 版本,请在 dependencyManagement 中添加如下内容
<properties>
<cloud.alibaba.version>2021.0.1.0</cloud.alibaba.version>
</properties>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>${cloud.alibaba.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
2. 子项目引入nacos
<!-- nacos依赖 接入 Nacos 作为注册中心,实现服务的注册与发现-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
三.父项目创建pom.xml
注意事项:pom.xml中使用maven分模块管理 pom
pom.xml
<?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">
<modelVersion>4.0.0</modelVersion>
(1) groupId:存储的包的路径,一般分为多段,第一段为域,第二段为公司名。。。。。。如图,org是域中的一个,和它类似的
还有com、cn等,org为非盈利组织,com为商业组织。
(2) artifactId:模块名 它们统称为坐标,是为了保证项目的唯一性提出的,如果把自己的项目弄到maven本地仓库去,必须通过groupId+artifactId去查找。
(3) version 它是用来声明版本号的。在父pom中通常将一些通用的组件的版本号抽取出来,统一做版本号管理,当再次用到这个组件时就不用再去声明版本号了,
这样做还可以避免因为组件版本不一致带来的冲突问题。
<groupId>com.baize</groupId>
<artifactId>baize-parent</artifactId>
<version>1.0-SNAPSHOT</version>
以下配置<packaging>pom</packaging>的意思是使用maven分模块管理,都会有一个父级项目,
pom文件一个重要的属性就是packaging(打包类型),一般来说所有的父级项目的packaging都为pom,
packaging默认类型jar类型,如果不做配置,maven会将该项目打成jar包
<packaging>pom</packaging>
<!--这里设置版本号,父类做版本统一管理 properties里面可以定义用户自己的属性值,这些属性值可以在POM文件的任何地方同通过${x}的方式来引用 -->
<properties>
<!--java版本18:该版本比较稳定,使用者较多,兼容性较好 -->
<java.version>1.8</java.version>
<!--springboot版本 -->
<spring-boot.version>2.6.6</spring-boot.version>
<!--spring-cloud版本-->
<spring-cloud.version>2021.0.1</spring-cloud.version>
<!-- Spring Cloud Alibaba 致力于提供微服务开发的一站式解决方案。
此项目包含开发分布式应用微服务的必需组件,方便开发者通过 Spring Cloud 编程模型轻松使用这些组件来开发分布式应用服务
<cloud.alibaba.version>2021.0.1.0</cloud.alibaba.version>
<!--swagger3接口API文档生成 -->
<springfox.swagger3.version>3.0.0</springfox.swagger3.version>
<!--swagger UI界面 bootstrap-ui-->
<swagger-bootstrap-ui.version>1.9.6</swagger-bootstrap-ui.version>
<!--swagger UI界面 knife4j;knife4j和 bootstrap-ui 两个选择一个,选择knife4j-->
<swagger-knife4j.version>3.0.3</swagger-knife4j.version>
<!-- fastjson依赖是阿里巴巴提供的用于处理json-object数据转换。接收前端传过来的json参数数据,转换成Java对象-->
<fastjson.version>1.2.70</fastjson.version>
<!--lombok依赖 Lombok的原理是在编译生成AST之后,根据注解对AST进行修改,比如增加上Getter、Setter方法,然后用修改后的AST生成字节码。-->
<lombok.version>1.18.8</lombok.version>
<!--jasypt加密解密配置文件 -->
<jasypt.version>2.0.0</jasypt.version>
<!--JJWT鉴权(JSON Web Token):用户登录使用taken -->
<jjwt.version>0.9.1</jjwt.version>
<!-- 常用的时间处理类库 -->
<joda-time.version>2.10.8</joda-time.version>
<!-- 阿里云短信接口sdk -->
<aliyun-java-sdk-dysmsapi.version>2.1.0</aliyun-java-sdk-dysmsapi.version>
<!-- Hutool 是一个小而全的 Java 工具类库-->
<hutool.version>4.5.6</hutool.version>
<!--commons工具包-->
<commons-lang3.version>3.9</commons-lang3.version>
<!--jackson Java Json解析器-->
<jackson.version>2.10.3</jackson.version>
<!-- 开源对象池化组件-->
<commons-pool2.version>2.6.2</commons-pool2.version>
</properties>
<!-- dependencyManagement只在父工程(即pom类型的maven工程)中声明,在子工程中定义无需声明版本从而生效 -->
<dependencyManagement>
<dependencies>
<!-- 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-boot配置 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.6.6</version>
<!-- 为了解决子工程单继承的问题,通过<type>pom</type>可以依赖于其他的pom父工程,从而将pom工程中的依赖都传递过来 -->
<type>pom</type>
<scope>import</scope>
</dependency>
Spring Cloud Alibaba 致力于提供微服务开发的一站式解决方案。
此项目包含开发分布式应用微服务的必需组件,方便开发者通过 Spring Cloud 编程模型轻松使用这些组件来开发分布式应用服务
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>${cloud.alibaba.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!--swagger3接口API文档依赖 -->
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-boot-starter</artifactId>
<version>${springfox.swagger3.version}</version>
</dependency>
<!--swagger-ui 这里是用了一个好看一点ui界面-->
<!--<dependency>
<groupId>com.github.xiaoymin</groupId>
<artifactId>swagger-bootstrap-ui</artifactId>
<version>${swagger-bootstrap-ui.version}</version>
</dependency>-->
<dependency>
<groupId>com.github.xiaoymin</groupId>
<artifactId>knife4j-spring-boot-starter</artifactId>
<version>${swagger-knife4j.version}</version>
</dependency>
<!-- fastjson依赖是阿里巴巴提供的用于处理json-object数据转换。接收前端传过来的json参数数据,转换成Java对象 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>${fastjson.version}</version>
</dependency>
<!--lombok依赖 Lombok的原理是在编译生成AST之后,根据注解对AST进行修改,比如增加上Getter、Setter方法,然后用修改后的AST生成字节码。-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${lombok.version}</version>
<optional>true</optional>
</dependency>
<!--jasypt加密解密依赖 -->
<dependency>
<groupId>com.github.ulisesbocchio</groupId>
<artifactId>jasypt-spring-boot-starter</artifactId>
<version>${jasypt.version}</version>
</dependency>
<!--JJWT鉴权(JSON Web Token):用户登录使用taken -->
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>${jjwt.version}</version>
</dependency>
<!-- 常用的时间处理类库 -->
<dependency>
<groupId>joda-time</groupId>
<artifactId>joda-time</artifactId>
<version>${joda-time.version}</version>
</dependency>
<!-- 阿里云短信接口sdk -->
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-dysmsapi</artifactId>
<version>${aliyun-java-sdk-dysmsapi.version}</version>
</dependency>
<!-- Hutool 是一个小而全的 Java 工具类库-->
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>${hutool.version}</version>
</dependency>
<!--commons工具包-->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>${commons-lang3.version}</version>
</dependency>
<!--jackson Java Json解析器-->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>${jackson.version}</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>${jackson.version}</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>${jackson.version}</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.dataformat</groupId>
<artifactId>jackson-dataformat-xml</artifactId>
<version>${jackson.version}</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.module</groupId>
<artifactId>jackson-module-jaxb-annotations</artifactId>
<version>${jackson.version}</version>
</dependency>
<!--jackson Java Json解析器-->
<!-- 开源对象池化组件-->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
<version>${commons-pool2.version}</version>
</dependency>
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
<version>2.3.30</version>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<pluginManagement>
<plugins>
<!-- maven打包指定jdk版本 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>${java.version}</source>
<target>${java.version}</target>
</configuration>
</plugin>
<!-- maven测试框架的依赖-->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.22.2</version>
<configuration>
<skip>true</skip>
</configuration>
</plugin>
<!-- maven 打war包配置:failOnMissingWebXml=false避免缺少web.xml导致failOnMissingWebXml错误-->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>3.2.3</version>
<configuration>
<failOnMissingWebXml>false</failOnMissingWebXml>
</configuration>
</plugin>
<!-- maven打jar包依赖 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>3.1.2</version>
</plugin>
<!-- 将spring boot的应用程序打包-->
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>${spring-boot.version}</version>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
<!-- 插件主要是用来打包源代码的-->
<plugin>
<artifactId>maven-source-plugin</artifactId>
<version>2.1</version>
<configuration>
<attach>true</attach>
</configuration>
<executions>
<execution>
<phase>compile</phase>
<goals>
<goal>jar</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</pluginManagement>
<!--解决资源导出问题-->
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>false</filtering>
</resource>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
<include>**/*.yml</include>
</includes>
<filtering>false</filtering>
</resource>
</resources>
</build>
</project>
白泽2023
技术经理 @中科大脑