在使用 Spring Boot + Spring Cloud 进行微服务开发时,我们需要根据项目中 Spring Boot 的版本来决定 Spring Cloud 版本,否则会出现许多意想不到的错误。
Spring Boot 与 Spring Cloud 的版本对应关系如下表(参考自 Spring Cloud 官网)。
| Spring Cloud | Spring Boot | 关系 |
|---|---|---|
| 2021.0.x aka Jubilee | 2.6.x, 2.7.x (从 Spring Cloud 2021.0.3开始) | |
| 2020.0.x (Ilford) | 2.4.x, 2.5.x (从 Spring Cloud 2020.0.3 开始) | |
| Hoxton(霍克斯顿) | 2.2.x, 2.3.x (从 Spring Cloud SR5 开始) | |
| Greenwich(格林威治) | 2.1.x | |
| Finchley(芬奇利) | 2.0.x | 兼容Spring Boot2.0.x,不兼容Spring Boot1.5.× |
| Edgware(埃奇韦尔) | 1.5.x | 兼容Spring Boot1.5.×,不兼容Spring Boot2.0.× |
| Dalston(多尔斯顿) | 1.5.x | 兼容Spring Boot1.5.x,不兼容Spring Boot2.0.× |
| Camden(卡姆登) | 1.4.x | 兼容Spring Boot1.4.x,也兼容Spring Boot1.5.× |
| Brixton(布里克斯顿) | 1.3.x | 兼容Spring Boot1.3.×,也兼容Spring Boot1.4.× |
| Angel(天使) | 1.2.x | 兼容Spring Boot1.2.x |
注意:Spring Cloud 官方已经停止对 Dalston、Edgware、Finchley 和 Greenwich 的版本更新。
{
...
"bom-ranges": {
...
"spring-cloud": {
"Hoxton.SR12": "Spring Boot >=2.2.0.RELEASE and <2.4.0.M1",
"2020.0.6": "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.3": "Spring Boot >=2.6.1 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.0.0-M3",
"2022.0.0-M3": "Spring Boot >=3.0.0-M3 and <3.0.0-M4",
"2022.0.0-M4": "Spring Boot >=3.0.0-M4 and <3.1.0-M1"
},
....
}
...
}
| spring-boot-starter-parent | spring-cloud-dependencies |
|---|---|
| 版本号/发布日期 | 版本号/发布日期 |
| 2.0.6.RELEASE/0ct,2018 | Finchley.SR2/0ct,2018 |
| 2.1.4.RELEASE/Apr,2019 | Greenwich.SR1/Mar.2019 |
| Spring Boot >=2.6.1 and < 3.0.0-M1 | 2021.0.3 |
当前的spring-cloud-dependencies依赖版本采用年号版
一个简单的Maven模块结构是这样的:
-app-parent:一个父项目(app-parent)聚合很多子项目(app-util,app-dao,app-web...)
--pom.xm1
--app-core
--pom.xml
--app-web
--pom.xm1
--
4.0.0
org.example
spring-cloud-microservice
1.0-SNAPSHOT
microservice-cloud-api
microservice-cloud-provider-dept-8001
pom
8
8
1.8
@
${java.version}
${java.version}
UTF-8
UTF-8
4.13.2
2.0.0-alpha7
2.17.2
1.18.24
1.2.11
org.springframework.cloud
spring-cloud-dependencies
2021.0.3
pom
import
org.springframework.boot
spring-boot-dependencies
2.7.2
pom
import
mysql
mysql-connector-java
8.0.29
com.alibaba
druid
1.2.11
org.mybatis.spring.boot
mybatis-spring-boot-starter
2.2.2
org.projectlombok
lombok
${lombok.version}
junit
junit
${junit.version}
ch.qos.logback
logback-core
${logback-core.version}
org.apache.logging.log4j
log4j-core
${log4j.version}
spring-cloud-microservice
src/main/resources
**/*.yml
**/*.properties
**/*.xml
true
src/main/java
**/*.yml
**/*.properties
**/*.xml
true
org.apache.maven.plugins
maven-resources-plugin
$
spring-cloud-microservice
org.example
1.0-SNAPSHOT
4.0.0
microservice-cloud-api
8
8
org.projectlombok
lombok
注:microservice-cloud-api 是整个工程的公共子模块,它包含了一些其他子模块共有的内容,例如实体类、公共工具类、公共依赖项等。当其他子模块需要使用公共子模块中的内容时,只需要在其 pom.xml 引入公共子模块的依赖即可。

CREATE DATABASE springcloud_db_core DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
DROP TABLE IF EXISTS `dept`;
CREATE TABLE `dept` (
`dept_no` int NOT NULL AUTO_INCREMENT,
`dept_name` varchar(255) DEFAULT NULL,
`db_source` varchar(255) DEFAULT NULL,
PRIMARY KEY (`dept_no`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
-- DATABASE()当前数据库名字
INSERT INTO `dept` VALUES ('1', '开发部', DATABASE());
INSERT INTO `dept` VALUES ('2', '人事部', DATABASE());
INSERT INTO `dept` VALUES ('3', '财务部', DATABASE());
INSERT INTO `dept` VALUES ('4', '市场部', DATABASE());
INSERT INTO `dept` VALUES ('5', '运维部', DATABASE());
序列化就是为了防止用户访问量过多 服务器内存多度消耗
package com.zk.springcloud.entity;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
import java.io.Serializable;
@Data
@NoArgsConstructor
@Accessors(chain = true) //链式编程 true 如果为 true,setter 将返回this对象而不是void
public class Dept implements Serializable {
private Integer deptNo;
private String deptName;
//这个数据数是存在哪个数据库的宇段
//微服务,一个服务对应一个数据库,同一个信息可能存在不同的数据库
private String dbSource;
public Dept(String deptName) {
this.deptName = deptName;
}
}
链式编程只是简化了写法,没有什么影响,有些时候代码中需要new对象插入,正常情况下需要命名,链式可以直接new 对象.set直接插入,避免了想命名的麻烦