第三章 使用idea搭建spring cloud maven多模块项目框架
本系列博客旨在搭建一套能用于实际开发使用的spring cloud多模块微服务项目框架,并不是一个spring cloud的demo而已,提供系统的开发规范限制,微服务注册中心,配置中心,负载均衡,熔断,redis缓存,分布式事务,kafka服务消息通信,系统安全(sql注入攻击,xxs攻击等等),多数据源切换,全局异常处理等等:
目录顺风车:
spring cloud多模块项目框架搭建:spring cloud多模块项目框架搭建-目录_springclound中配置模块的编译目录-CSDN博客
经过前面两章的废话,从本章开始进入正式的搭建过程,把项目整体的架子先搭起来,我们采用先动手后动口,不然很多小伙伴嫌弃总说些废话,迟迟get不到干货。动手过程固然重要,后面的为什么这么操作也不可忽略啊。
本章将使用idea 利用maven搭建spring cloud多模块框架,开发你的多模块Spring cloud Hello Word.我们搭建一个电商的架构,分为三个模块,一个activity(活动)模块,一个order(订单)模块,一个common(公共组件模块),建好后应该是这个层级结构,至于为啥要建成这个结构,我们先建好再说,先动手。
一.搭架子
1. idea ->file->new-> prject ,点击Spring Initalizr,选择创建方式为Default,通过spring官网的方式来创建。
2. next下一步,填写maven项目信息,Group对应maven pom.xml中的<groupId>,Artifact对应<artifactId>,version对应<version>
3. next下一步,选择你需要的maven start,也就是选择你的jar包,可以不选,后面通过pom.xml添加。
4. next下一步,Project name 填写包名,也就是你这个项目顶级文件夹的名称,建议默认,和前面的项目名称一样,Project location填写存放路径
5. 点击finish.一个基于maven的spring boot项目就创建好了,选择好maven仓库路径,jar拉下来,就可以启动了,但是还没完,别忘了我是创建maven多模块项目。
6. 删掉src及其目录下的所有文件。
7. 以上父模块创建好了,接下来创建dream-activity模块.点击项目上右键 new ->module,点击Spring Initalizr,选择创建方式为Default,通过spring官网的方式来创建。
具体操作就不再一一截图了,就是把前面2-6步重复操作一遍,但是注意名字dream-activity。完成的应该是如下这个样子:
8. 接下来,我们来添加dream-activity模块的视图层,服务层,接口层等等,分别是如下7个模块,点击项目上右键 new ->module,点击Spring Initalizr,选择创建方式为Default,通过spring官网的方式来创建。
分别创建如下几个模块,具体操作就是把前面2-6步重复操作一遍,放一个示例,就不再一一截图了,但是注意名字dream-activity-xx。
- dream-activity-common
- dream-activity-dao
- dream-activity-entity
- dream-activity-interface
- dream-activity-interface-impl
- dream-activity-service
- dream-activity-web
完成的应该是下面这个样子:
9. dream-activity模块创建好了,下面创建dream-order模块项目,学着dream-activity模块操作一遍就ok了,成品如下:
10. 创建dream-common模块公共项目。公共项目就放一些两个模块都用的到的东西,所以就不用这么复杂, 照着前面2-5步重复操作一遍创建一个spring boot模块就可以了。
到此多模块的架子虽然搭好了,但是还是跑不起来,接下来我们让他跑起来,跑出Hello Word.
二. 编辑pom.xml 文件,给maven配置依赖和编译入口
1. dream父模块pom.xml,这里主要注意packaging 为pom类型和<dependencyManagement>标签
<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.6.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.dream</groupId>
<artifactId>dream</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>dream</name>
<description>Demo project for Spring Boot</description>
<packaging>pom</packaging>
<modules>
<module>dream-activity</module>
<module>dream-order</module>
<module>dream-common</module>
</modules>
<properties>
<java.version>1.8</java.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<spring-boot-starter.version>2.2.6.RELEASE</spring-boot-starter.version>
<spring-boot-starter-test.version>2.3.1.RELEASE</spring-boot-starter-test.version>
<spring-boot-starter-web.version>2.2.6.RELEASE</spring-boot-starter-web.version>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<version>${spring-boot-starter.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<version>${spring-boot-starter-test.version}</version>
<scope>test</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-web -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>${spring-boot-starter-web.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<finalName>dream</finalName>
<resources>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*</include>
</includes>
<filtering>true</filtering>
</resource>
</resources>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</plugins>
</build>
</project>
2. 编写子模块bream-activity模块的pom.xml,这里注意<parent>标签,父模块不再是spring boot,而是dream。要是common公共类的一些工具,所以要依赖dream-common模块,因为这里才是真正的项目父类,所以要引用需用到的顶级父类里的jar包,顶级父类的出现很多程度上只是为了统一管理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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.dream</groupId>
<artifactId>dream</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<groupId>com.dream-activity</groupId>
<artifactId>dream-activity</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>dream-activity</name>
<description>Demo project for Spring Boot</description>
<packaging>pom</packaging>
<!--有哪些子模块 -->
<modules>
<module>dream-activity-common</module>
<module>dream-activity-dao</module>
<module>dream-activity-entity</module>
<module>dream-activity-interfaces</module>
<module>dream-activity-interfaces-impl</module>
<module>dream-activity-service</module>
<module>dream-activity-web</module>
</modules>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<version>${spring-boot-starter.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<version>${spring-boot-starter-test.version}</version>
<scope>test</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-web -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>${spring-boot-starter-web.version}</version>
</dependency>
<!--引入dream-common 模块 -->
<dependency>
<groupId>com.dream.common</groupId>
<artifactId>dream-common</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
3. 编写bream-activity下的7个子模块的pox.xml依赖。
3.1. 编写bream-activity-web模块的pom.xml,此模块作为web视图层,也就是常用的Controller层。这里主要注意设置bream-activity模块的maven编译及spring boot启动入口。得调用service对吧?所以要依赖service,entity,common三个模块
<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.dream-activity</groupId>
<artifactId>dream-activity</artifactId>
<version>0.0.1-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath>
</parent>
<groupId>com.dream-activity.web</groupId>
<artifactId>dream-activity-web</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>dream-activity-web</name>
<description>Demo project for Spring Boot</description>
<packaging>jar</packaging>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<!--引入dream-activity-common模块 -->
<dependency>
<groupId>com.dream-activity.common</groupId>
<artifactId>dream-activity-common</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
<!--引入dream-activity-service模块 -->
<dependency>
<groupId>com.dream-activity.service</groupId>
<artifactId>dream-activity-service</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.dream-activity.entity</groupId>
<artifactId>dream-activity-entity</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.dream-activity.interfaces.impl</groupId>
<artifactId>dream-activity-interfaces-impl</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.dream-activity.interfaces</groupId>
<artifactId>dream-activity-interfaces</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
</dependencies>
<!--spring boot打包的话需要指定一个唯一的入门-->
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>2.1.7.RELEASE</version>
<configuration>
<!-- 指定该Main Class为全局的唯一入口 -->
<mainClass>com.dream.activity.web.DreamActivityWebApplication</mainClass>
<layout>ZIP</layout>
</configuration>
<executions>
<execution>
<goals>
<goal>repackage</goal><!--可以把依赖的包都打包到生成的Jar包中-->
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
3.2. 编写 dream-activity-common模块的pom.xml ,此模块为dream-activity系统的公共模块。主要放一些只在dream-activity模块公用的类。不需要依赖其他模块。
<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.dream-activity</groupId>
<artifactId>dream-activity</artifactId>
<version>0.0.1-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath>
</parent>
<groupId>com.dream-activity.common</groupId>
<artifactId>dream-activity-common</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>dream-activity-common</name>
<description>Demo project for Spring Boot</description>
<packaging>jar</packaging>
<properties>
<java.version>1.8</java.version>
</properties>
</project>
3.3 . 编写dream-activity-dao的pom.xml,此模块为dream-activity项目模块的持久层,写持久层接口,映射实体类和sql的模块。不需要依赖其他模块。
<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.dream-activity</groupId>
<artifactId>dream-activity</artifactId>
<version>0.0.1-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath>
</parent>
<groupId>com.dream-activity.dao</groupId>
<artifactId>dream-activity-dao</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>dream-activity-dao</name>
<description>Demo project for Spring Boot</description>
<packaging>jar</packaging>
<properties>
<java.version>1.8</java.version>
</properties>
</project>
3.4 编写dream-activity-entity的pom,xml。在开始时的结构图中可以看到这个模块下面还有两个包(req[入参],resp[出参]),由此这个模块存放是视图层实体类的。在这套系统框架视图层实体类和持久层实体类是分开的,至于为何这样设计,后面再说。需要依赖dream-activity-common模块,使用公用模块的注解什么的。
<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.dream-activity</groupId>
<artifactId>dream-activity</artifactId>
<version>0.0.1-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath>
</parent>
<groupId>com.dream-activity.entity</groupId>
<artifactId>dream-activity-entity</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>dream-activity-entity</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>com.dream-activity.common</groupId>
<artifactId>dream-activity-common</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
</dependencies>
</project>
3.5 . 编写 dream-activity-interfaces 模块的pom.xml,此模块为内部系统提供接口使用,如activity系统需要使用order系统提供订单能力,就需调用order系统intafaces下的接口,也为后面接入Dubbo RPC框架做好铺垫。需要依赖dream-activity-common公共模块。
<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.dream-activity</groupId>
<artifactId>dream-activity</artifactId>
<version>0.0.1-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath>
</parent>
<groupId>com.dream-activity.interfaces</groupId>
<artifactId>dream-activity-interfaces</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>dream-activity-interfaces</name>
<description>Demo project for Spring Boot</description>
<packaging>jar</packaging>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>com.dream-activity.common</groupId>
<artifactId>dream-activity-common</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
</dependencies>
</project>
3.6 . 编写dream-activity-interfaces-impl模块的pom.xml.此模块为dream-activity-interfaces模块的接口逻辑实现类,对接收到的内部数据加工后传递给service逻辑层处理。此模块需要依赖dream-activity-interfaces内部接口模块,dream-activity-common公共模块,dream-activity-service逻辑层,dream-activity-entity实体类模块。
<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.dream-activity</groupId>
<artifactId>dream-activity</artifactId>
<version>0.0.1-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath>
</parent>
<groupId>com.dream-activity.interfaces.impl</groupId>
<artifactId>dream-activity-interfaces-impl</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>dream-activity-interfaces-impl</name>
<description>Demo project for Spring Boot</description>
<packaging>jar</packaging>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>com.dream-activity.common</groupId>
<artifactId>dream-activity-common</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.dream-activity.interfaces</groupId>
<artifactId>dream-activity-interfaces</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.dream-activity.entity</groupId>
<artifactId>dream-activity-entity</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.dream-activity.service</groupId>
<artifactId>dream-activity-service</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
</dependencies>
</project>
3.7. 编写dream-activity-service模块的pom.xml,此模块为mvc 逻辑层,编写功能具体逻辑实现。需要依赖dream-activity-common公共模块,dream-activity-dao持久层,dream-activity-entity实体类。
<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.dream-activity</groupId>
<artifactId>dream-activity</artifactId>
<version>0.0.1-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath>
</parent>
<groupId>com.dream-activity.service</groupId>
<artifactId>dream-activity-service</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>dream-activity-service</name>
<description>Demo project for Spring Boot</description>
<packaging>jar</packaging>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>com.dream-activity.common</groupId>
<artifactId>dream-activity-common</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.dream-activity.entity</groupId>
<artifactId>dream-activity-entity</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.dream-activity.dao</groupId>
<artifactId>dream-activity-dao</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
</dependencies>
</project>
4. 到此dream-activity系统的maven依赖就配置完成了,接下来来配置dream-order系统的maven依赖,结构dream-activity系统的一致,下面我就只把dream-order系统及其7个子模块pom.xml分别贴出来。
4.1. dream-order系统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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.dream</groupId>
<artifactId>dream</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<groupId>com.dream.order</groupId>
<artifactId>dream-order</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>dream-order</name>
<description>Demo project for Spring Boot</description>
<packaging>pom</packaging>
<modules>
<module>dream-order-common</module>
<module>dream-order-dao</module>
<module>dream-order-entity</module>
<module>dream-order-interfaces</module>
<module>dream-order-interfaces-impl</module>
<module>dream-order-service</module>
<module>dream-order-web</module>
</modules>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<version>${spring-boot-starter.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<version>${spring-boot-starter-test.version}</version>
<scope>test</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-web -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>${spring-boot-starter-web.version}</version>
</dependency>
<!--引入dream-common 模块 -->
<dependency>
<groupId>com.dream.common</groupId>
<artifactId>dream-common</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
4.2. dream-order-web 视图层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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.dream.order</groupId>
<artifactId>dream-order</artifactId>
<version>0.0.1-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath>
</parent>
<groupId>com.dream-order.web</groupId>
<artifactId>dream-order-web</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>dream-order-web</name>
<description>Demo project for Spring Boot</description>
<packaging>jar</packaging>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<!--引入dream-activity-common模块 -->
<dependency>
<groupId>com.dream-activity.common</groupId>
<artifactId>dream-activity-common</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
<!--引入dream-activity-service模块 -->
<dependency>
<groupId>com.dream-activity.service</groupId>
<artifactId>dream-activity-service</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.dream-order.entity</groupId>
<artifactId>dream-order-entity</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.dream-order.interfaces</groupId>
<artifactId>dream-order-interfaces</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.dream-order.interfaces.impl</groupId>
<artifactId>dream-order-interfaces-impl</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
</dependencies>
<!--spring boot打包的话需要指定一个唯一的入门-->
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>2.1.7.RELEASE</version>
<configuration>
<!-- 指定该Main Class为全局的唯一入口 -->
<mainClass>com.dream.order.web.DreamOrderWebApplication</mainClass>
<layout>ZIP</layout>
</configuration>
<executions>
<execution>
<goals>
<goal>repackage</goal><!--可以把依赖的包都打包到生成的Jar包中-->
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
4.3. dream-order-service 服务逻辑层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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.dream.order</groupId>
<artifactId>dream-order</artifactId>
<version>0.0.1-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath>
</parent>
<groupId>com.dream-order.service</groupId>
<artifactId>dream-order-service</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>ream-order-service</name>
<description>Demo project for Spring Boot</description>
<packaging>jar</packaging>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>com.dream-order.dao</groupId>
<artifactId>dream-order-dao</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.dream-order.entity</groupId>
<artifactId>dream-order-entity</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.dream-order.common</groupId>
<artifactId>dream-order-common</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
</dependencies>
</project>
4.4 . dream-order-interfaces-impl内部接口数据处理模块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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.dream.order</groupId>
<artifactId>dream-order</artifactId>
<version>0.0.1-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath>
</parent>
<groupId>com.dream-order.interfaces.impl</groupId>
<artifactId>dream-order-interfaces-impl</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>dream-order-interfaces-impl</name>
<description>Demo project for Spring Boot</description>
<packaging>jar</packaging>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>com.dream-order.common</groupId>
<artifactId>dream-order-common</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.dream-order.interfaces</groupId>
<artifactId>dream-order-interfaces</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.dream-order.entity</groupId>
<artifactId>dream-order-entity</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.dream-order.service</groupId>
<artifactId>dream-order-service</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
</dependencies>
</project>
4.5 dream-order-interfaces内部接口模块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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.dream.order</groupId>
<artifactId>dream-order</artifactId>
<version>0.0.1-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath>
</parent>
<groupId>com.dream-order.interfaces</groupId>
<artifactId>dream-order-interfaces</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>dream-order-interfaces</name>
<description>Demo project for Spring Boot</description>
<packaging>jar</packaging>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>com.dream-order.common</groupId>
<artifactId>dream-order-common</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
</dependencies>
</project>
4.6. dream-order-entity 实体类model模块的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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.dream.order</groupId>
<artifactId>dream-order</artifactId>
<version>0.0.1-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath>
</parent>
<groupId>com.dream-order.entity</groupId>
<artifactId>dream-order-entity</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>dream-order-entity</name>
<description>Demo project for Spring Boot</description>
<packaging>jar</packaging>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>com.dream-order.common</groupId>
<artifactId>dream-order-common</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
</dependencies>
</project>
4.7. dream-order-dao 持久层的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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.dream.order</groupId>
<artifactId>dream-order</artifactId>
<version>0.0.1-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath>
</parent>
<groupId>com.dream-order.dao</groupId>
<artifactId>dream-order-dao</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>dream-order-dao</name>
<description>Demo project for Spring Boot</description>
<packaging>jar</packaging>
<properties>
<java.version>1.8</java.version>
</properties>
</project>
4.8. dream-order-common 公共模块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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.dream.order</groupId>
<artifactId>dream-order</artifactId>
<version>0.0.1-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath>
</parent>
<groupId>com.dream-order.common</groupId>
<artifactId>dream-order-common</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>dream-order-common</name>
<description>Demo project for Spring Boot</description>
<packaging>jar</packaging>
</project>
5. 上面dream-order系统也全部配置完了,接下来配置dream-common公共组件模块。作为公共组件模块也不需要启动啥的,主要被其他模块依赖,放一些公共的类,比如工具类。所以也不需要编译,启动类,现在也没啥东西,继承下顶级父类就行了。
<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.dream</groupId>
<artifactId>dream</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<groupId>com.dream.common</groupId>
<artifactId>dream-common</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>dream-common</name>
<description>Demo project for Spring Boot</description>
<packaging>jar</packaging>
<properties>
<java.version>1.8</java.version>
</properties>
</project>
6. 至此maven依赖就全部配置完成了,上面也分别配置了order,activity下的web模块的启动类为两个系统的唯一启动,编译入口,下面我分别从启动下,看看能否启动成功。
6.1. 启动 dream-order系统,DreamOrderWebApplication 右击run/debug执行下,启动成功,完美!!!
6.2. 再试试启动 dream-activity系统,这里注意先关闭dream-order系统,因为我没还没设置启动端口,两个系统都默认的是8080端口,dream-order系统已经启动了,再启动 dream-activity系统会报端口占用。DreamActivityWebApplication 右击run/debug执行下,同样也完美启动。
6.3. 虽然启动了,还得验证下能不能用啊,所以在web视图层,创建controller包,建一个测试类返回当前时间,启动。
浏览器访问:127.0.0.1:8080/dream/test,同样完美请求到了数据。
7. 上面dream-order系统浏览器请求成功了,dream-activity也是同样,就不一一截图了,自己试试就可以了。到了这个时候有人就要问了这感觉不对啊,我们不是要搭建spring cloud项目嘛,这怎么搭建的spring boot项目??我们在《spring cloud 多模块项目框架搭建-前言篇》中就以提到过这二者的关系,没看过的可以移步去看看,或者问度娘。
7.1. 接下来我们就让它变身一下(突然想起一句台词,巴啦啦小魔仙,乌卡拉,全身变。(/≧▽≦)/,好傻子),加个spring cloud 的maven依赖就ok了,在dream的pom.xml加入如下依赖:
<properties>
<spring-cloud-starter.version>2.2.1.RELEASE</spring-cloud-starter.version>
</properties>
<!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter</artifactId>
<version>${spring-cloud-starter.version}</version>
</dependency>
7.2 在dream-activity和dream-order的pom.xml分别加入如下依赖:
<!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter</artifactId>
<version>${spring-cloud-starter.version}</version>
</dependency>
以上依赖加完之后,再次分别启动dream-activity系统和dream-activity系统,你就会发现,控制的日志多了些spring cloud的信息,但是图标还是spring boot的,我第一次搭建的时候就在这里绕了半天,还以为没集成成功。
8. 最后还要把这些模块扫描进来,在dream-activity和dream-order启动类上增加扫描路径,不然是不能注入的,这步很重要。
package com.dream.order.web;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication(scanBasePackages = {"com.dream.order.web", "com.dream.order.entity","com.dream.order.service", "com.dream.order.dao", "com.dream.order.interfaces","com.dream.order.interfaces.impl","com.dream.order.common"})
public class DreamOrderWebApplication {
public static void main(String[] args) {
SpringApplication.run(DreamOrderWebApplication.class, args);
}
}
package com.dream.activity.web;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication(scanBasePackages = {"com.dream.activity.web", "com.dream.activity.entity","com.dream.activity.service", "com.dream.activity.dao", "com.dream.activity.interfaces","com.dream.activity.interfaces.impl","com.dream.activity.common"})
public class DreamActivityWebApplication {
public static void main(String[] args) {
SpringApplication.run(DreamActivityWebApplication.class, args);
}
}
至此整个架子就搭完了,看看你的是不是也一样完美启动呢?
三. 下面我们就来聊聊为何这么设计:
1. 为何要将dream-activity系统和dream-order系统两个独立系统设计成dream的子模块?
a.方便maven jar包版本统一管理,版本统一由deam管理,各个子模块不在需要维护共有的jar的版本。如果依赖版本需要更改,只需要改一处,所有依赖版本都改变了。但是这里题外说一句,不要把自己模块私有的jar包也加到公有的来,其他系统继承了,会增加负担。
b.方便扩展,现在只有dream-activity系统和dream-order系统两个系统,如果以后需要支付系统,库存系统,供应商系统等等呢?只需要在dream下添加model就ok了。
c.方便项目开发过程中代码统一管理,不需要某个系统时直接折叠起来,不需要再各个系统中来回切换,maven打包也是互不干扰,每个系统可以独立打包成自己的jar包。如果项目团队人数众多,分系统开发。这套系统也是非常好拆分的,dream-activity系统和dream-order系统本身就是两个独立的spring cloud项目,只需要把这两个系统拷贝出来,不需要任何改动,再把dream提成一个独立的项目就行,因为dream中并无任何逻辑,只负责管理maven依赖版本。
2. 拿dream-activity系统来说,为何有了dream-activity-entity实体类模块来管理实体类,还在dream-activity-dao持久层设计一个model来管理数据库映射的实体类呢?
这一点是特意设计的一个点,从上面的maven依赖中就可以发现,dream-activity-dao持久层并未依赖dream-activity-entity实体类模块,这也就说明dream-activity-dao持久层是不能使用dream-activity-entity中实体类,所以持久层就需要维护自己的映射实体类。dream-activity-entity下有DOT包放入参实体类,VO包放出参实体类。至于为何这样这样设计,主要是为了从根本上解决甚至截断以下几个问题:
a. 很多开发者代码不规范,为了省事,持久层的映射实体,入参实体类(DTO),出参实体类(VO)共用一个。这样就导致了很多问题,最明显的就是持久层实体类上有很多视图层的注解,视图层上还有mybatis-plus的注解,由此就造成了系统上的不必要的性能开销和代码阅读弱及后期维护的压力大。
b. 也是上面这样不规范使用VO,DTO,model映射造成很多前端不需要的数据库字段返给了前端,很多时候DTO可能就只需传一两个参数,而model映射的数据库有十多个甚至几十个字段,而VO返回的就几个字段,大量冗余字段造成了传输压力及数据库安全问题,在一些大公司在视图层都会进行字段转义,来防止数据库字段外泄,避免给一些有非分之想的人带来可乘之机。
综合以上两点,这样设计以后,入参,出参,持久层映射不再共用,想共用也用不了,DOT包放入参实体类就负责入参,VO包就负责出参,dream-activity-dao持久层就负责数据库字段映射,从根本上解决这个问题。
比如数据库merchant表有a,b,c,d 四个字段,入参就只需要a这个字段,出参只需要c d两个字段.使用这套系统的设计就是这个样子的;
@Data
public class MerchantDTO{
private String a;
}
@Data
public class MerchantVO{
private String c;
private String d;
}
@Data
public class MerchantEntity{
private String a;
private String b;
private String c;
private String d;
}
这样子看起来是不是瞬间变身小清新了呢,这是有人要问了,那MerchantDTO那有人要问持久层的实体对象和入参及出参如何互相传递呢,总不能在逻辑层一个个的get,set吧,这个自然不会这么傻,后面会提供一些简单易用的工具类,直接一行代码完成参数传递。
c. 持久层拆出来,每个表单独提供自己的crud,再在service模块中进行逻辑关联,这样就能根据自己的业务对数据进行缓存,延迟写入,避免关联查询,以后不管是业务还是数据增大,比如分库分表,加多数据源等,都可以简单轻松应对,甚至都不用动代码逻辑,这才是微服务设计的根本。既然要用到分布式那就是说传统系统无法支撑,上面也说了,一个好的架构师不只是只顾眼前,还应该让系统有可持续的扩展性,如果是传统式的关联设计,遇到前面说的这些需求是不是就得推翻重构??其实说到底,就是运用了程序6大设计原则中的单一原则,里氏替换原则和接口隔离原则。
到此刻这套系统的架子就搭好了,其中的知识点和需要注意的点,我也尽我所能的尽量描述清楚,这个章节就暂时写这么多,也没想出还有啥其他要写的,写了这两天才写完,因为上班写的,写几个字瞄一眼老大来了没有,像做贼似的,也是好笑。如果您要使用这套系统,请你遵循其中的设计结构,如此也不枉我一份苦心和初衷。下一章开始我们开始来集成spring cloud的一些具体组件。
本章代码我打成了压缩包放在蓝奏云了(链接:https://wws.lanzoux.com/b01htmnyh 密码:2o80 ),可以下载下来对照对照。
上面所写内容如有不足和纰漏,欢迎留言或私聊指正批评。如果需要转载,也是欢迎,不甚荣幸,但请把《spring cloud多模块项目框架搭建》这一系列博客全部一起转载,这一系列博客毕竟是个整体教程,如果别人只看到一部分,那就是个残次品,谢谢,鞠躬。
eg:感谢小伙伴私聊我,common打成了commcon,实在抱歉,当时不知道怎么就手残了,文中和配置文件中,代码压缩包中都已更正了,截图上的实在改不了了,发现时已经写道第九章了,这个不是功能性错误,只是粗心将包单词打错了。粗心大意,还望各位见谅,后面我也将谨慎小心,努力更新。