SpringCloud-3-基础工程构建

在人生的道路上,不管是潇洒走一回,或者是千山独行,皆须是自己想走的路,虽然,有的人并不是很快就能找到自己的方向和道路,不过,只要坚持到底,我相信,就一定可以找到自己的路,只要找到路,就不必怕路途遥远了。

导读:本篇文章讲解 SpringCloud-3-基础工程构建,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com,来源:原文

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

(0)
飞熊的头像飞熊bm

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!