咕泡云商城-第一章项目搭建

项目介绍

咕泡云商城是基于SpringCloud Alibaba技术栈研发的B2C电商平台,平台拥有核心的电商业务功能。运营商在后台管理商品,前台能通过搜索引擎实时搜索到最新商品,用户注册后可以直接在平台购买商品,并通过微信支付实现线上支付。用户还能参与平台秒杀抢购,并实现线上支付秒杀商品


云商城架构设计

架构设计

架构设计如下图,将在后面的章节分别介绍。


工程搭建

环境准备

这里需要用到数据库 MySQL和注册中心 Nacos,数据库和注册中心我全部装到腾讯云服务器,用docker部署

  1. 安装mysql,注意需要倒对应的服务器运营商管理界面的防火墙中,放开3306端口,否则可能连不上
1
docker run -di --name mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=xxxxxxxx mysql:5.7
  1. 安装nacos,同样需要放开8848端口,http://101.34.5.93:8848/nacos/#/login,账号密码都是nacos,注意jvm参数,nacos占用内存太大,如果是自己买的服务器内存大小不够,后面会出现微服务注册拒绝的情况。
1
docker run -d -p 8848:8848 -e MODE=standalone -e JVM_XMS=256m -e JVM_XMX=256m -v /opt/nacos/init.d/custom.properties:/home/nacos/init.d/custom.properties -v /opt/nacos/logs:/home/nacos/logs --restart always --name nacos nacos/nacos-server

项目搭建

工程结构

我们可以按照功能分类,给每类工程创建一个父工程,所有的父工程都是一个pom项目,方便管理。

最外层在建一个统一的父工程做jar包,子工程管理。此处依然是pom项目,管理所有工程都需要的jar包,比如lombok所有的模块都可能是要使用日志,还有测试模块。

1
2
3
4
5
mall-api:存储所有数据库表对应的Bean和Feign接口
mall-gateway:存储所有微服务网关
mall-service:存储所有微服务工程
mall-util:存储公共工程
mall-web:存储所有和页面渲染有关的工程

构建顶级父类工

构建顶级工程,作为pom项目,pom文件如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
<?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>3.0.1</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.chenghao.work</groupId>
<artifactId>chenghaoshop</artifactId>
<version>1.0.0-SNAPSHOT</version>
<name>chenghaoshop</name>
<description>咕泡云商城项目</description>
<properties>
<java.version>1.8</java.version>
<spring-cloud-alibaba.version>2.2.1.RELEASE</spring-cloud-alibaba.version>
</properties>

<dependencies>
<!-- 各个工程get,set,构造方法的创建以及日志操作 -->
<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>
</dependency>
</dependencies>

<dependencyManagement>
<dependencies>
<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>
<configuration>
<excludes>
<exclude>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</exclude>
</excludes>
</configuration>
</plugin>
</plugins>
</build>
</project>

构建各模块的父工程

  1. mall-api:存储所有数据库表对应的Bean和Feign接口
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?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>chenghaoshop</artifactId>
<groupId>com.chenghao.work</groupId>
<version>1.0.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>mall-api</artifactId>
<packaging>pom</packaging>
<description>
所有数据库表对应的Bean和Feign接口
</description>
</project>
  1. mall-service:存储所有微服务工程
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?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>chenghaoshop</artifactId>
<groupId>com.chenghao.work</groupId>
<version>1.0.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>mall-service</artifactId>
<packaging>pom</packaging>
<description>
所有微服务工程的父工程
</description>
</project>
  1. mall-util:存储公共工程
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?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>chenghaoshop</artifactId>
<groupId>com.chenghao.work</groupId>
<version>1.0.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>mall-util</artifactId>
<packaging>pom</packaging>
<description>
所有工具类的父工程
</description>
</project>
  1. mall-web:存储所有和页面渲染有关的工程
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?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>chenghaoshop</artifactId>
<groupId>com.chenghao.work</groupId>
<version>1.0.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>mall-web</artifactId>
<packaging>pom</packaging>
<description>所有涉及页面渲染的父工程</description>
</project>
  1. mall-gateway:存储所有微服务网关
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?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>chenghaoshop</artifactId>
<groupId>com.chenghao.work</groupId>
<version>1.0.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>mall-gateway</artifactId>
<packaging>pom</packaging>
<description>
微服务网关父工程
</description>
</project>

公共工程的搭建 mall-util中

1. 公共依赖包

service中以后要进行所有微服务工程的数据库操作,可以把所有service需要用到的包以及所有service需要初始化的对象放到一个独立的工程中,以后哪个工程要用,直接依赖即可。

mall-util中创建 mall-service-dependency,pom.xml依赖如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
<?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>chenghaoshop</artifactId>
<groupId>com.chenghao.work</groupId>
<version>1.0.0-SNAPSHOT</version>
<relativePath>../../pom.xml</relativePath>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>mall-service-dependency</artifactId>
<description>所有微服务工程共同的依赖包</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>

2.公共工具包

我们需要用到的工具包也可以单独放到一个工程中,每次要用,直接依赖即可。比如code,result,pageInfo

mall-util中创建 mall-common

定义项目错误码-部分代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
/**
* @author chenghao
*/
public enum RespCode {
/**
* 操作成功
*/
SUCCESS(20000, "操作成功"),

/**
* 操作失败
*/
ERROR(50000, "操作失败"),

/**
* 系统错误
*/
SYSTEM_ERROR(50001, "系统错误");

private Integer code;
private String message;
}

定义返回结果-部分代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
/**
* @author chenghao
*/
@Data
public class RespResult<T> implements Serializable {

/**
* 响应数据结果集
*/
private T data;

/**
* 状态码
* 20000 操作成功
* 50000 操作失败
*/
private Integer code;

/***S
* 响应信息
*/
private String message;
}