4 springcloud基础工程构建
4.1 Spring Cloud版本选择
-
在使用 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 的版本更新。
- 除了上表中展示的版本对应关系之外,我们还可以使用浏览器访问 https://start.spring.io/actuator/info,获取 Spring Cloud 与 Spring Boot 的版本对应关系(JSON 版)。
{
...
"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-cloud实际开发版本与spring-boot版本关系
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依赖版本采用年号版
4.2 DEMO整体介绍及创建
- 由 Spring Boot 创建的微服务,为了方便管理,这里我们采用 Maven 的多 Module 结构(即一个 Project 包含多个 Module)来构建工程。使用一个Dept部门模块做一个微服务通用案例Consumer消费者(Client)通过REST调用Provider提供者(Server)提供的服务。
- 回忆Spring,SpringMVC,MyBatis等以往学习的知识
- Maven的分包分模块架构复习
一个简单的Maven模块结构是这样的:
-app-parent:一个父项目(app-parent)聚合很多子项目(app-util,app-dao,app-web...)
--pom.xm1
--app-core
--pom.xml
--app-web
--pom.xm1
--
- 一个父工程带着多个子Module子模块
- spring-cloud-microservice父工程(Project)下初次带着3个子模块(Module)
-
- microservicecloud-api【封装的整体entity/接口/公共配置等】
- microservicecloud-provider-dept-8001【服务提供者】
- microservicecloud-consumer-dept-80【服务消费者】
4.3 创建基础父工程(Maven Project)
- 创建一个普通的maven项目名为 spring-cloud-microservice的 Maven 主工程 ,然后在该主工程的 pom.xml 中使用 dependencyManagement 来管理 Spring Cloud 的版本,切记Packageing是pom模式.内容如下。
- 主要是定义POM文件,将后续各个子模块公用的jar包等统一提取出来,类似一个抽象父类。
- 后续服务提供者、消费者,分布式组件基于此基础工程使用
<?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>
<groupId>org.example</groupId>
<artifactId>spring-cloud-microservice</artifactId>
<version>1.0-SNAPSHOT</version>
<modules>
<module>microservice-cloud-api</module>
<module>microservice-cloud-provider-dept-8001</module>
</modules>
<!--打包方式pom-->
<packaging>pom</packaging>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<java.version>1.8</java.version>
<resource.delimiter>@</resource.delimiter>
<maven.compiler.source>${java.version}</maven.compiler.source>
<maven.compiler.target>${java.version}</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<junit.version>4.13.2</junit.version>
<slf4j.version>2.0.0-alpha7</slf4j.version>
<log4j.version>2.17.2</log4j.version>
<lombok.version>1.18.24</lombok.version>
<logback-core.version>1.2.11</logback-core.version>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<!--以pom方式导入spring-cloud依赖,减少pom体积-->
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>2021.0.3</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!--spring-boot依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.7.2</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!--数据库驱动-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.29</version>
</dependency>
<!--数据源-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.2.11</version>
</dependency>
<!--非spring-boot官方-->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.2.2</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${lombok.version}</version>
</dependency>
<!--测试-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>${junit.version}</version>
</dependency>
<!-- configure logging 日志门面-->
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-core</artifactId>
<version>${logback-core.version}</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>${log4j.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<finalName>spring-cloud-microservice</finalName>
<!-- 资源导出相关,总项目可以省略-->
<resources>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.yml</include>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>true</filtering>
</resource>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.yml</include>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>true</filtering>
</resource>
</resources>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<!--以$开头的或者结尾的在src/main/resources路径下的就能读取-->
<configuration>
<delimiters>
<delimit>$</delimit>
</delimiters>
</configuration>
</plugin>
</plugins>
</build>
</project>
4.4 创建公共子模块(Maven Module)
- 在父工程下,创建一个名为 microservice-cloud-api 的 Maven Module:microservice-cloud-api,其 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">
<parent>
<artifactId>spring-cloud-microservice</artifactId>
<groupId>org.example</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>microservice-cloud-api</artifactId>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
</dependencies>
</project>
注:microservice-cloud-api 是整个工程的公共子模块,它包含了一些其他子模块共有的内容,例如实体类、公共工具类、公共依赖项等。当其他子模块需要使用公共子模块中的内容时,只需要在其 pom.xml 引入公共子模块的依赖即可。
- idea链接mysql数据库,注意设置时区serverTimezone=UTC
- 创建一个数据库springcloud_db_core,并在数据库中创建一张部门表dept
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());
- 在microservice-cloud-api的 com.zk.springcloud.entity 包下,创建一个名为 Dept 的实体类,代码如下。
序列化就是为了防止用户访问量过多 服务器内存多度消耗
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直接插入,避免了想命名的麻烦
下一篇:SpringCloud-4-基础工程-创建服务提供者
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/123825.html