SpringCloud-3-基础工程构建

4 springcloud基础工程构建

4.1 Spring Cloud版本选择
  • 在使用 Spring Boot + Spring Cloud 进行微服务开发时,我们需要根据项目中 Spring Boot 的版本来决定 Spring Cloud 版本,否则会出现许多意想不到的错误。

  • Spring Boot 与 Spring Cloud 的版本对应关系如下表(参考自 Spring Cloud 官网)。

Spring CloudSpring Boot关系
2021.0.x aka Jubilee2.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-parentspring-cloud-dependencies
版本号/发布日期版本号/发布日期
2.0.6.RELEASE/0ct,2018Finchley.SR2/0ct,2018
2.1.4.RELEASE/Apr,2019Greenwich.SR1/Mar.2019
Spring Boot >=2.6.1 and < 3.0.0-M12021.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-基础工程-创建服务提供者
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值