接下来我们就来搭建下云商城的项目工程结构。
因为我们搭建的是微服务项目,所以整体的项目结构会非常的零散。虽然零散但是程序的复用性会非常高,所以首先在划分的时候我们可以将相关的业务服务放置在一个工程结构下。
然后就是整个系统会使用到的依赖包、加载类及相关的普通工具包等我们也可以放置在一个util工程下
还有就是相关的业务微服务会有很多的JavaBean(API)是需要复用到的,还有就是feign接口等像这些我们也可以放置在同一个工程中。
还有一个比较重要的模块是微服务网关模块,这个我们也需要单独的放置
以上的模块我们都是基于Restful风格的方式进行通信,商城系统我们还需要涉及到页面渲染的部分,这部分我们也同样单独的来放置
最后我们将以上的微服务都放置在同一个父工程中,该父工程负责子工程、jar的管理工作
当然这种结构并不是唯一的,只要大家觉得合理的搭配都是可以的哦。
接下来我们就具体的来搭建相关的工程结构
我们单独来构建这个项目,顶级父工程我们通过SpringBoot的在线模板来构建。步骤如下:
设置系统相关的参数
相关的依赖选择
需要注意的是这部分我们可以什么都不选择,我们可以在后面具体使用的时候需要用都什么就选择什么即可,但是要注意SpringCloud Alibaba相关的依赖对SpringBoot的版本是有要求的,必须是在2.2到2.3之间的版本,但是上面最低的版本是2.3.7那么我们在创建完成后再修改下版本即可。
在这里插入图片描述
因为创建的是父工程,所以src目录没有必要,同时项目的类型应该是pom类型。然后添加的依赖应该是整个项目所有模块都会使用到的。所以设置如下:
<?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.10.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.bobo.vip.mall</groupId>
<artifactId>bobo-vip-mall</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>bobo-vip-mall</name>
<packaging>pom</packaging>
<description>商城系统</description>
<properties>
<java.version>1.8</java.version>
<spring-cloud-alibaba.version>2.2.1.RELEASE</spring-cloud-alibaba.version>
</properties>
<dependencies>
<!--lombok 便于Bean的创建 -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<!-- 单元测试 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
<!--热部署插件-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<!--alibaba-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>${spring-cloud-alibaba.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
我们可以按照功能分类,给每类工程创建一个父工程,方便管理。
mall-api:存储所有数据库表对应的Bean和Feign接口
mall-gateway:存储所有微服务网关
mall-service:存储所有微服务工程
mall-util:存储公共工程
mall-web:存储所有和页面渲染有关的工程
创建模块工程的时候我们只创建一个普通的maven工程即可。
相关属性设置
因为mall-api也是个父工程,所以packaging也设置为pom类型
pom文件的内容
<?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>bobo-vip-mall</artifactId>
<groupId>com.bobo.vip.mall</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>mall-api</artifactId>
<packaging>pom</packaging>
<description>
存放所有JavaBean和Feign接口
</description>
</project>
安装上面的步骤创建对应的其他几个模块的父工程。
网关模块的父工程
对应的pom文件内容
<?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>bobo-vip-mall</artifactId>
<groupId>com.bobo.vip.mall</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>mall-gateway</artifactId>
<packaging>pom</packaging>
<description>
存放微服网关集群
</description>
</project>
pom文件的内容
<?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>bobo-vip-mall</artifactId>
<groupId>com.bobo.vip.mall</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<packaging>pom</packaging>
<artifactId>mall-service</artifactId>
<description>所有的应用服务</description>
</project>
对应的pom文件中的内容
<?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>bobo-vip-mall</artifactId>
<groupId>com.bobo.vip.mall</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<packaging>pom</packaging>
<artifactId>mall-util</artifactId>
<description>
存放所有公共工程
</description>
</project>
对应的pom文件的内容
<?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>bobo-vip-mall</artifactId>
<groupId>com.bobo.vip.mall</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<packaging>pom</packaging>
<artifactId>mall-web</artifactId>
<description>
存放所有和页面渲染有关的工程,不建议放在service中,所有service只提供基于RESTful的服务
</description>
</project>
创建好的目录结构:
service中以后要创建微服务工程操作数据库,我们可以把所有service需要用到的包以及所有service需要初始化的对象放到一个独立的工程中,以后哪个工程要用,直接依赖即可。
在mall-util
中创建mall-service-dependency
,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>mall-util</artifactId>
<groupId>com.bobo.vip.mall</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>mall-service-dependency</artifactId>
<description>
所有service工程依赖的包汇总以及初始化工具包
</description>
<dependencies>
<!--web包-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--MyBatis Plus-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.3.2</version>
</dependency>
<!--MySQL-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<!--Redis-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<!--Nacos-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
</dependencies>
</project>
我们需要用到的工具包也可以单独放到一个工程中,每次要用,直接依赖即可。
在mall-util
中创建mall-common
,我们在工程中创建2个对象:
用于指定响应状态码的枚举对象:com.bobo.mall.util.RespCode
package com.bobo.mall.util;
public enum RespCode {
SUCCESS(20000, "操作成功"),
ERROR(50000, "操作失败"),
SYSTEM_ERROR(50001, "系统错误");
private Integer code;
private String message;
RespCode(Integer code, String message) {
this.code = code;
this.message = message;
}
RespCode() {
}
public Integer getCode() {
return code;
}
public void setCode(Integer code) {
this.code = code;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
}
用于响应用户信息封装的对象:com.bobo.mall.util.RespResult
package com.bobo.mall.util;
import java.io.Serializable;
public class RespResult<T> implements Serializable {
//响应数据结果集
private T data;
/**
* 状态码
* 20000 操作成功
* 50000 操作失败
*/
private Integer code;
/***
* 响应信息
*/
private String message;
public RespResult() {
}
public RespResult(RespCode resultCode) {
this.code = resultCode.getCode();
this.message = resultCode.getMessage();
}
public RespResult(T data, RespCode resultCode) {
this.data = data;
this.code = resultCode.getCode();
this.message = resultCode.getMessage();
}
public static RespResult ok() {
return new RespResult(null, RespCode.SUCCESS);
}
public static RespResult ok(Object data) {
return new RespResult(data, RespCode.SUCCESS);
}
public static RespResult error() {
return new RespResult(null, RespCode.ERROR);
}
public static RespResult error(String message) {
return secByError(RespCode.ERROR.getCode(),message);
}
//自定义异常
public static RespResult secByError(Integer code,String message) {
RespResult err = new RespResult();
err.setCode(code);
err.setMessage(message);
return err;
}
public static RespResult error(RespCode resultCode) {
return new RespResult(resultCode);
}
public T getData() {
return data;
}
public void setData(T data) {
this.data = data;
}
public Integer getCode() {
return code;
}
public void setCode(Integer code) {
this.code = code;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
}
service工程一定会依赖mall-service-dependency
和mall-common
,我们可以修改mall-service
将这两个工程添加到依赖中:
<dependencies>
<!--依赖mall-service-dependency-->
<dependency>
<groupId>com.bobo.vip.mall</groupId>
<artifactId>mall-service-dependency</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<!--依赖mall-common-->
<dependency>
<groupId>com.bobo.vip.mall</groupId>
<artifactId>mall-common</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>
整体的目录结构就创建到此咯~下篇我们开始具体的业务实现了!