1.项目介绍

1.1项目背景

  1. 电商模式
  • 市面上有 5 种常见的电商模式 B2B、B2C、C2B、C2C、O2O;
    1. B2B (Business to Business), 是指商家与商家建立的商业关系。 如:阿里巴巴
    2. B2C (Business to Consumer), 就是我们经常看到的供应商直接把商品卖给用户,即“商对客” 模式。。如:苏宁易购、京东、天猫、小米商城
    3. C2B (Customer to Business),即消费者对企业。先有消费者需求产生而后有企业生产,即先有消费者提出需求,后有生产企业按需求组织生产
    4. C2C (Customer to Consumer) ,客户之间自己把东西放上网去卖,如:淘宝,闲鱼
    5. O2O 即 Online To Offline,也即将线下商务的机会与互联网结合在了一起,让互联网成为线下交易的前台。线上快速支付,线下优质服务。如:饿了么,美团,淘票票,京东到家
  1. 谷粒商城
  • 谷粒商城是一个 B2C 模式的电商平台,销售自营商品给客户。

1.2项目架构图

  1. 项目微服务架构图
    code
  2. 微服务划分图
    code
  3. 项目技术和特殊
    • 前后分离开发,并开发基于 vue 的后台管理系统
    • SpringCloud 全新的解决方案
    • 应用监控、限流、网关、熔断降级等分布式方案 全方位涉及
    • 透彻讲解分布式事务、分布式锁等分布式系统的难点
    • 分析高并发场景的编码方式,线程池,异步编排等使用
    • 压力测试与性能优化
    • 各种集群技术的区别以及使用
    • CI/CD 使用
  4. 项目前置要求
    • 熟悉 SpringBoot 以及常见整合方案
    • 了解 SpringCloud
    • 熟悉 git,maven
    • 熟悉 linux,redis,docker 基本操作
    • 了解 html,css,js,vue
    • 熟练使用 idea 开发项目

      2.分布式概念

      2.1微服务

  • 微服务架构风格,就像是把一个单独的应用程序开发为一套小服务,每个小服务运行在自己的进程中,并使用轻量级机制通信,通常是 HTTP API。这些服务围绕业务能力来构建,并通过完全自动化部署机制来独立部署。这些服务使用不同的编程语言书写,以及不同数据存储技术,并保持最低限度的集中式管理。
  • 简而言之:拒绝大型单体应用,基于业务边界进行服务微化拆分,各个服务独立部署运行。
  • 我们希望有一个出现问题,不会影响其他服务。

    2.2 集群&分布式&节点

  • 集群是个物理形态,分布式是个工作方式。
  • 分布式是指将不同的业务分布在不同的地方。
  • 分布式系统是若干独立计算机的集合,这些计算机对于用户来说就像单个相关系统
  • 集群指的是将几台服务器集中在一起,实现同一业务。
  • 例如:京东是一个分布式系统,众多业务运行在不同的机器,所有业务构成一个大型的业务集群。每一个小的业务,比如用户系统,访问压力大的时候一台服务器是不够的。我们就应该将用户系统部署到多个服务器,也就是每一个业务系统也可以做集群化;
    • 分布式中的每一个节点,都可以做集群。 而集群并不一定就是分布式的。
    • 节点:集群中的一个服务器

      2.3远程调用

  • 在分布式系统中,各个服务可能处于不同主机,但是服务之间不可避免的需要互相调用,我们称为远程调用。
  • SpringCloud 中使用 HTTP+JSON 的方式完成远程调用
    code

    2.4负载均衡

  • 分布式系统中,A 服务需要调用 B 服务,B 服务在多台机器中都存在,A 调用任意一个服务器均可完成功能。
  • 为了使每一个服务器都不要太忙或者太闲,我们可以负载均衡的调用每一个服务器,提升网站的健壮性。
  • 常见的负载均衡算法:
    • 轮询:为第一个请求选择健康池中的第一个后端服务器,然后按顺序往后依次选择,直到最后一个,然后循环。
    • 最小连接:优先选择连接数最少,也就是压力最小的后端服务器,在会话较长的情况下可以考虑采取这种方式。
    • 散列:根据请求源的 IP 的散列(hash)来选择要转发的服务器。这种方式可以一定程度上保证特定用户能连接到相同的服务器。如果你的应用需要处理状态而要求用户能连接到和之前相同的服务器,可以考虑采取这种方式。
      code

      2.5服务注册/发现&注册中心

  • A 服务调用 B 服务,A 服务并不知道 B 服务当前在哪几台服务器有,哪些正常的,哪些服务已经下线。解决这个问题可以引入注册中心;
    code
  • 如果某些服务下线,我们其他人可以实时的感知到其他服务的状态,从而避免调用不可用的服务

    2.6配置中心

  • 每一个服务最终都有大量的配置,并且每个服务都可能部署在多台机器上。我们经常需要变更配置,我们可以让每个服务在配置中心获取自己的配置。
  • 配置中心用来集中管理微服务的配置信息
    code

    2.7服务熔断&服务降级

  • 在微服务架构中,微服务之间通过网络进行通信,存在相互依赖,当其中一个服务不可用时,有可能会造成雪崩效应。要防止这样的情况,必须要有容错机制来保护服务。
    code
  • 当库存服务发送故障,商品服务就会等它,而订单服务也会等商品服务, 这样就会一直阻塞
  • 如果高并发就会导致请求积压,导致雪崩现象
    1. 服务熔断
    • 设置服务的超时,当被调用的服务经常失败到达某个阈值,我们可以开启断路保护机制,后来的请求不再去调用这个服务。本地直接返回默认的数据
    1. 服务降级
    • 在运维期间,当系统处于高峰期,系统资源紧张,我们可以让非核心业务降级运行。降级:某些服务不处理,或者简单处理抛异常、返回 NULL、调用 Mock 数据、调用 Fallback 处理逻辑。

      2.8API网关

  • 在微服务架构中,API Gateway 作为整体架构的重要组件,它抽象了微服务中都需要的公共功能,同时提供了客户端负载均衡,服务自动熔断,灰度发布,统一认证,限流流控,日志统计等丰富的功能,帮助我们解决很多 API管理难题。
  • 前端发来的请求都先到达网关,网关对这些请求进行统一认证,限流流控等 code

3.环境搭建

3.1创建虚拟机

  • 账号/密码:root/123456
  • ip:192.168.56.10
  • gateway:192.168.56.2
  • 配置IP地址
    • vi /etc/sysconfig/network-scripts/ifcfg-ens33
      1
      2
      3
      4
      5
      `BOOTPROTO=static`(指定静态IP地址)
      `IPADDR=<ip_address>`(设置IP地址)
      `NETMASK=<netmask>`(设置子网掩码)
      `GATEWAY=<gateway>`(设置网关)
      `GATEWAY=<gateway>`(设置DNS) --与网关一样
    • systemctl restart network

3.2安装docker

  1. 卸载系统之前的 docker
    1
    2
    3
    4
    5
    6
    7
    8
    sudo yum remove docker \
    docker-client \
    docker-client-latest \
    docker-common \
    docker-latest \
    docker-latest-logrotate \
    docker-logrotate \
    docker-engine
  2. 安装 Docker-CE
    • 安装必须的依赖
      1
      2
      3
      sudo yum install -y yum-utils \
      device-mapper-persistent-data \
      lvm2
    • 设置 docker repo 的 yum 位置
      1
      2
      3
      sudo yum-config-manager \
      --add-repo \
      https://download.docker.com/linux/centos/docker-ce.repo
    • 安装 docker,以及 docker-cli
      1
      sudo yum install docker-ce docker-ce-cli containerd.io
  3. 启动 docker
    1
    sudo systemctl start docker
  4. 设置 docker 开机自启
    1
    sudo systemctl enable docker
  5. 配置 docker 镜像加速
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    sudo mkdir -p /etc/docker

    sudo tee /etc/docker/daemon.json <<-'EOF'
    {
    "registry-mirrors": ["https://a9yw2dbn.mirror.aliyuncs.com"]
    }
    EOF

    sudo systemctl daemon-reload
    sudo systemctl restart docker

3.3docker 安装 mysql

  • 账号/密码 root/root
  1. 下载镜像文件
    1
    docker pull mysql:5.7
  2. 创建实例并启动
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    docker run -p 3306:3306 --name mysql \
    -v /mydata/mysql/log:/var/log/mysql \
    -v /mydata/mysql/data:/var/lib/mysql \
    -v /mydata/mysql/conf:/etc/mysql \
    -e MYSQL_ROOT_PASSWORD=root \
    -d mysql:5.7

    参数说明
    -p 3306:3306:将容器的 3306 端口映射到主机的 3306 端口
    -v /mydata/mysql/conf:/etc/mysql:将配置文件夹挂载到主机
    -v /mydata/mysql/log:/var/log/mysql:将日志文件夹挂载到主机
    -v /mydata/mysql/data:/var/lib/mysql/:将配置文件夹挂载到主机
    -e MYSQL_ROOT_PASSWORD=root:初始化 root 用户的密码
    • MySQL 配置

      注意配置文件里面的信息记得换行,不然会导致MySQL启动不起来

      1
      vi /mydata/mysql/conf/my.cnf
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      [client]
      default-character-set=utf8
      [mysql]
      default-character-set=utf8
      [mysqld]
      init_connect='SET collation_connection = utf8_unicode_ci' init_connect='SET NAMES utf8' character-set-server=utf8
      collation-server=utf8_unicode_ci
      skip-character-set-client-handshake
      skip-name-resolve

      注意:解决 MySQL 连接慢的问题
      在配置文件中加入如下,并重启 mysql
      [mysqld]
      skip-name-resolve
      解释:
      skip-name-resolve:跳过域名解析
  3. 通过容器的 mysql 命令行工具连接
    1
    docker exec -it mysql mysql -uroot -proot
  4. 设置 root 远程访问
    1
    2
    grant all privileges on *.* to 'root'@'%' identified by 'root' with grant option;
    flush privileges;
  5. 进入容器文件系统
    1
    docker exec -it mysql /bin/bash

3.4docker 安装 redis

  1. 下载镜像文件
    1
    docker pull redis
  2. 创建实例并启动
    1
    2
    3
    4
    5
    6
    mkdir -p /mydata/redis/conf
    touch /mydata/redis/conf/redis.conf

    docker run -p 6379:6379 --name redis -v /mydata/redis/data:/data \
    -v /mydata/redis/conf/redis.conf:/etc/redis/redis.conf \
    -d redis redis-server /etc/redis/redis.conf
  3. 配置redis持久化
    1
    2
    3
    vi /mydata/redis/conf/redis.conf

    appendonly yes
  4. 测试持久化
    1
    2
    3
    4
    5
    6
    7
    docker exec -it redis redis-cli
    set aa bb
    get aa 输出bb

    docker restart redis
    docker exec -it redis redis-cli
    get aa 输出aa ---表明成功

4.开发环境的统一

4.1配置maven

  • 在maven的settings.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
    配置阿里云镜像
    <mirrors>
    <mirror>
    <id>nexus-aliyun</id>
    <mirrorOf>central</mirrorOf>
    <name>Nexus aliyun</name>
    <url>http://maven.aliyun.com/nexus/content/groups/public</url>
    </mirror>
    </mirrors>

    配置 jdk1.8 编译项目
    <profiles>
    <profile>
    <id>jdk-1.8</id>
    <activation>
    <activeByDefault>true</activeByDefault>
    <jdk>1.8</jdk>
    </activation>
    <properties>
    <maven.compiler.source>1.8</maven.compiler.source>
    <maven.compiler.target>1.8</maven.compiler.target>
    <maven.compiler.compilerVersion>1.8</maven.compiler.compilerVersion>
    </properties>
    </profile>
    </profiles>

    4.2 Idea&VsCode

  • idea 安装 lombok、mybatisx 插件
  • vscode
    1. Auto Close Tag —— 自动闭合 HTML/XML 标签
    2. Auto Rename Tag —— 自动完成另一侧标签的同步修改
    3. Chinese (Simplified) Language Pack for Visual Studio Code —— 中文语言包
    4. EsLint —— 语法纠错
    5. HTML CSS Support —— 让 html 标签上写 class 智能提示当前项目所支持的样式
    6. HTML Snippets —— html 快速自动补全
    7. JavaScript(ES6) code snippets — — ES6 语 法 智 能 提 示 以 及 快 速 输 入 , 除 js 外 还 支持.ts,.jsx,.tsx,.html,.vue,省去了配置其支持各种包含 js 代码文件的时间
    8. Live Server —— 以内嵌服务器方式打开
    9. Open in browser —— 浏览器快速打开
    10. Vetur —— 语法高亮、智能感知、Emmet 等包含格式化功能, Alt+Shift+F (格式化全文),Ctrl+K Ctrl+F(格式化选中代码,两个 Ctrl需要同时按着)

4.3安装配置git

  1. 下载 git;https://git-scm.com
  2. 配置 git,进入 git bash
    • 配置用户名 — git config —global user.name “名字”
    • 配置邮箱 — git config —global user.email “邮箱”
  3. 配置 ssh 免密登录
  • 进入 git bash;使用:ssh-keygen -t rsa -C “xxxxx@xxxxx.com”命令。 连续三次回车。
  • 在用户目录下查看id_rsa / id_rsa.pub 或 使用cat ~/.ssh/id_rsa.pub 查看密钥
  • 在gitee中填写密钥
  • ssh -T git@gitee.com 验证是否成功

5. 创建微服务

  1. 创建gitee仓库
    code
  2. 创建微服务
    • JDK用 1.8
    • SpringBoot用2.3.12.RELEASE
    gulimall
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    <?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>
    <groupId>com.atguigu.gulimall</groupId>
    <artifactId>gulimall</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>gulimall</name>
    <description>gulimall</description>
    <packaging>pom</packaging>

    <modules>
    <module>gulimall-ware</module>
    <module>gulimall-product</module>
    <module>gulimall-order</module>
    <module>gulimall-member</module>
    <module>gulimall-coupon</module>
    <module>renren-generator</module>
    <module>renren-fast</module>
    </modules>

    </project>

gulimall-coupon
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
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
<?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>
<groupId>com.atguigu.gulimall</groupId>
<artifactId>gulimall-coupon</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>gulimall-coupon</name>
<description>gulimall-coupon</description>
<properties>
<java.version>1.8</java.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<spring-boot.version>2.3.12.RELEASE</spring-boot.version>
<spring-cloud.version>Hoxton.SR12</spring-cloud.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</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>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>${spring-boot.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>

<build>
<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>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>${spring-boot.version}</version>
<configuration>
<mainClass>com.atguigu.gulimall.coupon.GulimallCouponApplication</mainClass>
<skip>true</skip>
</configuration>
<executions>
<execution>
<id>repackage</id>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>

</project>

gulimall-member
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
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
<?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>
<groupId>com.atguigu.gulimall</groupId>
<artifactId>gulimall-member</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>gulimall-member</name>
<description>gulimall-member</description>
<properties>
<java.version>1.8</java.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<spring-boot.version>2.3.12.RELEASE</spring-boot.version>
<spring-cloud.version>Hoxton.SR12</spring-cloud.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</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>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>${spring-boot.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>

<build>
<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>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>${spring-boot.version}</version>
<configuration>
<mainClass>com.atguigu.gulimall.member.GulimallMemberApplication</mainClass>
<skip>true</skip>
</configuration>
<executions>
<execution>
<id>repackage</id>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>

</project>

gulimall-order
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
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
<?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>
<groupId>com.atguigu.gulimall</groupId>
<artifactId>gulimall-order</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>gulimall-order</name>
<description>gulimall-order</description>
<properties>
<java.version>1.8</java.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<spring-boot.version>2.3.12.RELEASE</spring-boot.version>
<spring-cloud.version>Hoxton.SR12</spring-cloud.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</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>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>${spring-boot.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>

<build>
<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>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>${spring-boot.version}</version>
<configuration>
<mainClass>com.atguigu.gulimall.order.GulimallOrderApplication</mainClass>
<skip>true</skip>
</configuration>
<executions>
<execution>
<id>repackage</id>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>

</project>

gulimall-product
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
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
<?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>
<groupId>com.atguigu.gulimall</groupId>
<artifactId>gulimall-product</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>gulimall-product</name>
<description>gulimall-product</description>
<properties>
<java.version>1.8</java.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<spring-boot.version>2.3.12.RELEASE</spring-boot.version>
<spring-cloud.version>Hoxton.SR12</spring-cloud.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</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>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>${spring-boot.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>

<build>
<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>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>${spring-boot.version}</version>
<configuration>
<mainClass>com.atguigu.gulimall.product.GulimallProductApplication</mainClass>
<skip>true</skip>
</configuration>
<executions>
<execution>
<id>repackage</id>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>

</project>

gulimall-ware
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
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
<?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>
<groupId>com.atguigu.gulimall</groupId>
<artifactId>gulimall-ware</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>gulimall-ware</name>
<description>gulimall-ware</description>
<properties>
<java.version>1.8</java.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<spring-boot.version>2.3.12.RELEASE</spring-boot.version>
<spring-cloud.version>Hoxton.SR12</spring-cloud.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</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>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>${spring-boot.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>

<build>
<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>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>${spring-boot.version}</version>
<configuration>
<mainClass>com.atguigu.gulimall.ware.GulimallWareApplication</mainClass>
<skip>true</skip>
</configuration>
<executions>
<execution>
<id>repackage</id>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>

</project>

  • 共同点:
    • group:com.atguigu.gulimall
    • Artifact:工程名
    • Web和OpenFeign
      出现服务找不到主启动类
      • 在Maven中对服务进行compile
      • 在projectStructure中修改jdk

6.初始化数据库

创建gulimall_oms数据库
创建gulimall_pms数据库
创建gulimall_sms数据库
创建gulimall_ums数据库
创建gulimall_wms数据库

  • 字符编码为 utf8mb4_bin
  • 导入sql文件

7.人人开源搭建后台管理系统

  1. 在码云中找到renren-fast / renren-fast-vue项目
  2. 在git命令行中使用 git clone 地址 进行克隆
  3. 把renren-fast里面的.git文件删除,拷贝到gulimall里面
  4. 在gulimall中填加聚合
  5. 创建gulimall_admin数据库,sql语句在renren-fast文件里面
  6. 修改yaml文件里面的数据库配置

前端

  • 在vscode中打开renren-fast-vue项目
  • npm install
  • npm run dev

8. 逆向工程搭建&使用

8.1搭建

  1. 克隆renren-generator项目
  2. 导入gulimall文件,并聚合工程
  3. 修改yaml文件里面的mysql配置
    • 设置主机ip
    • 设置要生成的数据库
      1
      2
      3
      4
      5
       #MySQL配置
      driverClassName: com.mysql.cj.jdbc.Driver
      url: jdbc:mysql://192.168.56.10:3306/gulimall_pms?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai
      username: root
      password: root
  4. 修改properties文件,指定生成路径

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #代码生成器,配置信息

    mainPath=com.atguigu
    #包名
    package=com.atguigu.gulimall
    moduleName=product
    #作者
    author=GYM
    #Email
    email=1984906301@.com
    #表前缀(类名不会包含表前缀)
    tablePrefix=pms_
  5. 注释工程template的controller模板里面的@RequiresPermissions和引用

  6. 启动工程
  7. 生成代码并导入文件
  8. 出现爆红
  9. 创建gulimall-common工程来存放工具类
  10. 让其他服务依赖common服务
  11. 根据爆红缺少的依赖来向common添加依赖,并从renren-fast中复制工具类
    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
    <dependencies>
    <!-- mybatis-plus -->
    <dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-boot-starter</artifactId>
    <version>3.2.0</version>
    </dependency>

    <!-- lombok -->
    <dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.18.8</version>
    </dependency>

    <!-- httpcore -->
    <dependency>
    <groupId>org.apache.httpcomponents</groupId>
    <artifactId>httpcore</artifactId>
    <version>4.4.12</version>
    </dependency>

    <dependency>
    <groupId>commons-lang</groupId>
    <artifactId>commons-lang</artifactId>
    <version>2.6</version>
    </dependency>

    <dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>servlet-api</artifactId>
    <version>2.5</version>
    <scope>provided</scope>
    </dependency>

    </dependencies>


    code

    8.2使用

    整合mybatis-plus
    1. 导入依赖 — 以前在common模块导入过
      1
      2
      3
      4
      5
       <dependency>
      <groupId>com.baomidou</groupId>
      <artifactId>mybatis-plus-boot-starter</artifactId>
      <version>3.2.0</version>
      </dependency>
    2. 配置
      • 配置数据源
        1. 导入数据库驱动 —common模块
          1
          2
          3
          4
          5
          6
          <!--   mysql 驱动     -->
          <dependency>
          <groupId>mysql</groupId>
          <artifactId>mysql-connector-java</artifactId>
          <version>8.0.17</version>
          </dependency>
        2. 在product模块中,创建application.yaml文件配置数据源
          1
          2
          3
          4
          5
          6
          spring:
          datasource:
          username: root
          password: root
          url: jdbc:mysql://192.168.56.10:3306/gulimall_pms
          driver-class-name: com.mysql.jdbc.Driver
      • 配置mybatis-plus
        1. 在启动类中添加@MapperScan注解类扫描包
        2. 告诉mybatis-plus,sql映射文件位置
          • application.yaml
            1
            2
            3
            4
            5
            mybatis-plus:
            mapper-locations: classpath:/mspper/**/*.xml
            global-config:
            db-config:
            id-type: auto
    3. 测试 —Test里面测试
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      @Test
      void contextLoads() {

      BrandEntity brandEntity = new BrandEntity();
      brandEntity.setBrandId(1L);
      brandEntity.setDescript("华为");
      // brandEntity.setName("华为");
      // brandService.save(brandEntity);
      // System.out.println("保存成功...");

      brandService.updateById(brandEntity);
      }

    8.3导入剩余服务

  12. 修改generator的yaml,properties文件
  13. 生成代码并导入文件
  14. 复制yaml文件,并设置端口号7000 — 11000
  15. 启动并测试

    导入ware服务时出现Longblob类型错误,改为byte[]