谷粒商城

项目架构图

在这里插入图片描述

安装虚拟机,配置网络

参考使用VMware15安装镜像CentOS-7-x86_64-DVD-1511.iso,并设置Linux网络

安装 Docker,安装 Redis,MySQL

参考Docker小总结

MySQL导入,导出

参考MySQL 备份与还原

Git安装,IDEA集成

参考Git 安装,Windows,Linux
IDEA使用设置—集成 Git

Maven 下载,安装,IDEA集成

参考Maven小总结

IDEA 安装 lombok 插件

参考IDEA使用设置—安装插件lombok

注册码云,创建仓库

1、注册码云https://gitee.com/

2、创建仓库
在这里插入图片描述
在这里插入图片描述

设置公钥

1、随便找一个地方,鼠标右键,选择Git Bash Here在这里插入图片描述

2、执行命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 设置用户名,随便定义
git config --global user.name 'TaoPanfeng'

# 注册账号时使用的邮箱
git config --global user.email '1801957499@qq.com'

# 生成公钥(三次回车)
ssh-keygen -t rsa -C "1801957499@qq.com"

# 查看公钥,复制下来,下面要用
cat ~/.ssh/id_rsa.pub

# 测试是否设置成功?
ssh -T git@gitee.com

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

导入git项目

在这里插入图片描述

创建 modules 子模块

1
2
3
4
5
6
7
8
Group:io.gitee.taopanfeng
Artifact:gulimall-xxx

商品服务 product
存储服务 ware
订单服务 order
优惠券服务 coupon
用户服务 member

在这里插入图片描述

创建父 pom.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?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>io.gitee.taopanfeng</groupId>
<artifactId>gulimall</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>gulimall</name>
<description>谷粒商城-聚合服务</description>
<packaging>pom</packaging>

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

</project>

在这里插入图片描述

在这里插入图片描述

修改 .gitignore

1
2
3
4
5
6
7
**/mvnw
**/mvnw.cmd
**/.mvn
**/target
.idea
**/.gitignore
**/*.iml

在这里插入图片描述

提交第一次代码

1
2
Ctrl + K:本地 -> 暂存区(网页端不会更新)
Ctrl + Shift + K:暂存区 -> 远程(网页端会更新)

在这里插入图片描述
在这里插入图片描述

创建 5 个数据库

创建数据库:

  1. gulimall_oms
  2. gulimall_pms
  3. gulimall_sms
  4. gulimall_ums
  5. gulimall_wms

我已经把这五个数据库的 SQL 汇总成一个 SQL文件,直接执行即可。
SQL文件在:gulimall_opsuw_ms.sql
在这里插入图片描述
在这里插入图片描述

修改容器自启动 –restart always

1
2
docker update redis01 --restart always
docker update mysql01 --restart always

导入 renren-fast

1、找一个目录右键Git Bash Here,执行下面两行命令

1
git clone https://gitee.com/renrenio/renren-fast.git

2、删除目录的 .git 文件
在这里插入图片描述

3、把下载好的renren-fast文件夹拖到我们项目根目录下
在这里插入图片描述

4、修改父 pom,添加 modules 标签,并刷新 maven

1
2
3
4
5
6
7
8
9
<modules>
<module>gulimall-coupon</module>
<module>gulimall-member</module>
<module>gulimall-order</module>
<module>gulimall-product</module>
<module>gulimall-ware</module>

<module>renren-fast</module>
</modules>

创建数据库 gulimall-admin

1、创建 DB
在这里插入图片描述

2、 导入 SQL 文件(renren-fast/db/mysql.sql)
在这里插入图片描述

修改 renren-fast 配置

1、修改 Redis,MySQL
在这里插入图片描述

在这里插入图片描述

2、此时,启动访问会报错,因为后台没有启动,也就是renren-fast-vue
在这里插入图片描述
在这里插入图片描述

安装 Node js

参考 Vue安装与简单使用—安装Node.js

创建 renren-fast-vue

1、导入项目https://gitee.com/renrenio/renren-fast-vue.git
在这里插入图片描述

2、安装依赖
在这里插入图片描述

3、启动renren-fast-vue
在这里插入图片描述

4、启动renren-fast
在这里插入图片描述

5、测试访问
前端点击“验证码”,后端就会打印日志信息
使用admin admin可以进行登录
在这里插入图片描述

导入 renren-generator

代码生成器~

1、打开Git Bash,执行git clone https://gitee.com/renrenio/renren-generator.git

2、进入克隆后的文件夹,删除.git目录

3、把renren-generator放入renren-fast后端根目录

4、修改父 pm.xml

1
2
3
4
5
6
7
8
9
10
<modules>
<module>gulimall-coupon</module>
<module>gulimall-member</module>
<module>gulimall-order</module>
<module>gulimall-product</module>
<module>gulimall-ware</module>

<module>renren-fast</module>
<module>renren-generator</module>
</modules>

在这里插入图片描述

5、generator.properties 若为乱码,记得修改一下。参考:出现错误:解决IDEA的properties文件\uxxxx中文乱码问题

创建 gulimall-common

1)、创建 maven 模块:gulimall-common

2)、gulimall-common 添加依赖

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
<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>
<!--commons-lang-->
<dependency>
<groupId>commons-lang</groupId>
<artifactId>commons-lang</artifactId>
<version>2.6</version>
</dependency>
<!--mysql 驱动-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.17</version>
</dependency>
<!--httpServletRequest-->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
<scope>provided</scope>
</dependency>
</dependencies>

3)、给“gulimall-common”创建目录,io.gitee.taopanfeng.common
把“renren-fast”中的文件复制到“gulimall-common”中,如下这样。
在这里插入图片描述

pms:product

1)、添加common模块依赖

1
2
3
4
5
<dependency>
<groupId>io.gitee.taopanfeng</groupId>
<artifactId>gulimall-common</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>

2)、修改“renren-generator”

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
### 1. 修改连接数据库 renren-generator/src/main/resources/application.yml
url: jdbc:mysql://192.168.1.1:3306/gulimall_pms?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai
username: root
password: 123456

### 2. 修改生成信息 renren-generator/src/main/resources/generator.properties
#包名
mainPath=io.gitee.taopanfeng
package=io.gitee.taopanfeng
moduleName=product
#作者(中文会乱码)
author=taopanfeng
#Email
email=1801957499@qq.com
#表前缀(类名不会包含表前缀)
tablePrefix=pms_

### 3. 修改生成模版 renren-generator/src/main/resources/template/Controller.java.vm
//import org.apache.shiro.authz.annotation.RequiresPermissions;
//@RequiresPermissions 各个方法上面

3)、运行“renren-generator”,访问:http://localhost/

4)、生成代码文件,把main直接拖到 product 中
在这里插入图片描述
在这里插入图片描述

测试一波

1)、给所依赖的common 模块添加依赖。(上面已经添加过了)

1
2
3
4
5
6
7
8
9
10
11
12
<!--mybatis-plus-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.2.0</version>
</dependency>
<!--mysql 驱动-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.17</version>
</dependency>

2)、product 主类添加@MapperScan注解,扫描 dao 包。(生成的 dao 包中的文件都有 @Mapper 注解了,可以不用写了。)

3)、product 添加application.yml文件,编写配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://192.168.1.1:3306/gulimall_pms?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai
username: root
password: 123456

# MapperScan
# sql映射文件位置
mybatis-plus:
mapper-locations: classpath:/mapper/**/*.xml
global-config:
db-config:
id-type: auto # 主键自增

4)、在 product test 测试类中

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
@Resource
BrandService brandService;

@Test
public void contextLoads() {
//BrandEntity brandEntity = new BrandEntity();
//brandEntity.setDescript("测试插入~");
//brandEntity.setName("华为");
//brandService.save(brandEntity);
//System.out.println("保存成功");


BrandEntity brandEntity = new BrandEntity();
brandEntity.setBrandId(1L);
brandEntity.setDescript("修改");
brandService.updateById(brandEntity);
}

在这里插入图片描述
在这里插入图片描述

sms:coupon

0)、修改“renren-generator”

1
2
3
4
5
6
### 1. 修改连接数据库 renren-generator/src/main/resources/application.yml
url: jdbc:mysql://192.168.1.1:3306/gulimall_sms?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai

### 2. 修改生成信息 renren-generator/src/main/resources/generator.properties
moduleName=coupon
tablePrefix=sms_

1)、添加common模块依赖

1
2
3
4
5
<dependency>
<groupId>io.gitee.taopanfeng</groupId>
<artifactId>gulimall-common</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>

2)、主类添加@MapperScan(“io.gitee.taopanfeng.coupon.dao”)(生成的 dao 包中的文件都有 @Mapper 注解了,可以不用写了。)

3)、编写配置文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://192.168.1.1:3306/gulimall_sms?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai
username: root
password: 123456

# MapperScan
# sql映射文件位置
mybatis-plus:
mapper-locations: classpath:/mapper/**/*.xml
global-config:
db-config:
id-type: auto # 主键自增

4)、测试访问:http://localhost:8080/coupon/coupon/list
在这里插入图片描述

ums:member

0)、修改“renren-generator”

1
2
3
4
5
6
### 1. 修改连接数据库 renren-generator/src/main/resources/application.yml
url: jdbc:mysql://192.168.1.1:3306/gulimall_ums?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai

### 2. 修改生成信息 renren-generator/src/main/resources/generator.properties
moduleName=member
tablePrefix=ums_

1)、添加common模块依赖

1
2
3
4
5
<dependency>
<groupId>io.gitee.taopanfeng</groupId>
<artifactId>gulimall-common</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>

2)、主类添加@MapperScan(“io.gitee.taopanfeng.member.dao”)(生成的 dao 包中的文件都有 @Mapper 注解了,可以不用写了。)

3)、编写配置文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://192.168.1.1:3306/gulimall_ums?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai
username: root
password: 123456

# MapperScan
# sql映射文件位置
mybatis-plus:
mapper-locations: classpath:/mapper/**/*.xml
global-config:
db-config:
id-type: auto # 主键自增

4)、测试访问:http://localhost:8080/member/growthchangehistory/list
在这里插入图片描述

oms:order

0)、修改“renren-generator”

1
2
3
4
5
6
### 1. 修改连接数据库 renren-generator/src/main/resources/application.yml
url: jdbc:mysql://192.168.1.1:3306/gulimall_oms?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai

### 2. 修改生成信息 renren-generator/src/main/resources/generator.properties
moduleName=order
tablePrefix=oms_

1)、添加common模块依赖

1
2
3
4
5
<dependency>
<groupId>io.gitee.taopanfeng</groupId>
<artifactId>gulimall-common</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>

2)、主类添加@MapperScan(“io.gitee.taopanfeng.order.dao”)(生成的 dao 包中的文件都有 @Mapper 注解了,可以不用写了。)

3)、编写配置文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://192.168.1.1:3306/gulimall_oms?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai
username: root
password: 123456

# MapperScan
# sql映射文件位置
mybatis-plus:
mapper-locations: classpath:/mapper/**/*.xml
global-config:
db-config:
id-type: auto # 主键自增

4)、测试访问:http://localhost:8080/order/order/list
在这里插入图片描述

wms:ware

0)、修改“renren-generator”

1
2
3
4
5
6
### 1. 修改连接数据库 renren-generator/src/main/resources/application.yml
url: jdbc:mysql://192.168.1.1:3306/gulimall_wms?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai

### 2. 修改生成信息 renren-generator/src/main/resources/generator.properties
moduleName=ware
tablePrefix=wms_

1)、添加common模块依赖

1
2
3
4
5
<dependency>
<groupId>io.gitee.taopanfeng</groupId>
<artifactId>gulimall-common</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>

2)、主类添加@MapperScan(“io.gitee.taopanfeng.ware.dao”)(生成的 dao 包中的文件都有 @Mapper 注解了,可以不用写了。)

3)、编写配置文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://192.168.1.1:3306/gulimall_wms?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai
username: root
password: 123456

# MapperScan
# sql映射文件位置
mybatis-plus:
mapper-locations: classpath:/mapper/**/*.xml
global-config:
db-config:
id-type: auto # 主键自增

4)、删除6个UndoLogxxx文件
在这里插入图片描述

5)、测试访问:http://localhost:8080/ware/purchase/list
在这里插入图片描述

修改端口号

1
2
3
4
5
coupon  7000
member 8000
order 9000
product 10000
ware 11000

统一版本管理

修改common模块:下面是依赖管理,相当于以后再dependencies里引spring cloud alibaba就不用写版本号, 全用dependencyManagement进行管理

1
2
3
4
5
6
7
8
9
10
11
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2.2.0.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>

Nacos 安装

启动 Nacos Server,参考:Docker 启动 Nacos

coupon 注册 Nacos

1)、在 common 模块中添加依赖

1
2
3
4
5
<!--nacos-discovery-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>

2)、在 coupon 主类添加 @EnableDiscoveryClient

3)、修改 coupon 模块配置(需要指定 Nacos 注册地址,还要指定服务名称)

1
2
3
4
5
6
7
spring:
application:
name: gulimall-coupon
cloud:
nacos:
discovery:
server-addr: 192.168.1.1:8848

4)、访问:Nacos 服务列表
在这里插入图片描述

member 注册 Nacos

1)、在 member 主类添加 @EnableDiscoveryClient

2)、修改 member 模块配置(需要指定 Nacos 注册地址,还要指定服务名称)

1
2
3
4
5
6
7
spring:
application:
name: gulimall-member
cloud:
nacos:
discovery:
server-addr: 192.168.1.1:8848

3)、访问:Nacos 服务列表
在这里插入图片描述

OpenFeign测试远程调用

可能会由于 SpringCloud 版本问题,造成远程调用失败~
解决方法参考:OpenFeign 启动失败…

spring-cloud-starter-openfeign 是一个声明式的HTTP客户端,他的目的就是让远程调用更加简单。给远程服务发的是HTTP请求。

会员服务想要远程调用优惠券服务,只需要给会员服务里引入openfeign依赖,他就有了远程调用其他服务的能力。

0)、确保SpringCloud版本正确,参考:OpenFeign 启动失败…

1)、CouponController 添加远程调用方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
/**
* 模拟 OpenFeign 远程调用
*
* @return 全系统的所有返回都返回R,R代表 Response,它继承 HashMap<String, Object>
* @author 陶攀峰
* @date 2021-01-07 10:46
*/
@RequestMapping("/member/list")
public R memberCoupons(){
// 模拟数据库查询,设置一个优惠卷
CouponEntity couponEntity = new CouponEntity();
couponEntity.setCouponName("满100-10");

return R.ok().put("coupons",Arrays.asList(couponEntity));
}

2)、member 模块添加 OpenFeign 依赖(项目创建时我们已经添加了)

1
2
3
4
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

3)、修改 member 主类添加 @EnableFeignClients(“io.gitee.taopanfeng.member.feign”)

4)、member 模块中,创建包“feign”,创建一个接口
提示:如果 member 主类 @EnableFeignClients 不指定包名,那么 @FeignClient(“gulimall-coupon”) 就要配合 @Component 一起使用。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
/**
* 告诉spring cloud这个接口是一个feign远程客户端,要调用coupon服务("gulimall-coupon"),
* 再去调用coupon服务/coupon/coupon/member/list对应的方法
* @author 陶攀峰
* @date 2021-01-07 10:45
*/
@FeignClient("gulimall-coupon")
public interface CouponFeignService {


/**
* 注意写全,优惠券类上还有映射。
* 注意我们这个地方不是控制层,所以这个请求映射请求的不是我们服务器上的东西,而是nacos注册中心的
* @author 陶攀峰
* @date 2021-01-07 10:45
*/
@RequestMapping("/coupon/coupon/member/list")
R memberCoupons();
}

5)、修改 MemberController,测试远程调用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
@Resource
CouponFeignService couponFeignService;

@RequestMapping("/coupons")
public R test(){
MemberEntity memberEntity = new MemberEntity();
memberEntity.setNickname("会员昵称张三");

//假设张三去数据库查了后返回了张三的优惠券信息
R memberCoupons = couponFeignService.memberCoupons();

//打印会员和优惠券信息
return R.ok().put("member",memberEntity).put("coupons",memberCoupons.get("coupons"));
}

6)、开启 Nacos Server,启动 coupon 7000,member 8000
访问:http://127.0.0.1:8000/member/member/coupons

7)、OpenFeign 调用流程
在这里插入图片描述

8)、注意点

1
2
1. @FeignClient("gulimall-coupon") 要调用哪个服务
2. @RequestMapping("/coupon/coupon/member/list") 要写全,包括类上的路径

9)、关闭 coupon 7000提供者,此时再访问会报错;再启动 coupon 7000提供者,访问再次成功~!

Nacos 配置中心

》》》测试读取本地配置《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《
1)、coupon 模块 application.yml 添加

1
2
3
4
coupon:
user:
name: 大牛
age: 18

2)、CouponController 中添加

1
2
3
4
5
6
7
8
@Value("${coupon.user.name}")
private String name;
@Value("${coupon.user.age}")
private Integer age;
@RequestMapping("/testNacosConfig")
public R testNacosConfig(){
return R.ok().put("name",name).put("age",age);
}

3)、测试访问:http://127.0.0.1:7000/coupon/coupon/testNacosConfig
在这里插入图片描述

》》》测试读取配置中心《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《
0)、common 模块添加依赖

1
2
3
4
5
<!--服务 配置中心-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>

1)、coupon 模块添加 bootstrap.yml(注意:是 bootstrap 而不是 application)【bootstrap 用于配置中心】

1
2
3
4
5
6
7
spring:
application:
name: gulimall-coupon
cloud:
nacos:
config:
server-addr: 192.168.1.1:8848

2)、启动 coupon 7000,查看控制台“ dataId=gulimall-coupon.properties, group=DEFAULT_GROUP, cnt=1”,
也就是说,默认类型为应用名.properties,group=DEFAULT_GROUP

3)、创建 Nacos 配置
在这里插入图片描述

4)、重启应用,再次测试访问:http://127.0.0.1:7000/coupon/coupon/testNacosConfig
》会发现,配置中心的会覆盖我们本地原有的配置。
在这里插入图片描述

5)、如果想一直刷新,给所用到的 Controller 加上 @RefreshScope 注解即可。
》无需重启应用,配置中心修改后,应用即刷新。

Namespace,Group

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
1)、命名空间:配置隔离;
默认:public(保留空间);默认新增的所有配置都在public空间。
1、开发,测试,生产:利用命名空间来做环境隔离。
注意:在bootstrap.yml中,需要指定使用哪个命名空间下的配置,
spring.cloud.nacos.config.namespace=9de62e44-cd2a-4a82-bf5c-95878bd5e871
2、每一个微服务之间互相隔离配置,每一个微服务都创建自己的命名空间,只加载自己命名空间下的所有配置

2)、配置集:所有的配置的集合

3)、配置集ID:类似文件名。
Data ID:类似文件名

4)、配置分组:
默认所有的配置集都属于:DEFAULT_GROUP;
1111,618,1212

例如,项目中的使用:每个微服务创建自己的命名空间,使用配置分组区分环境,dev,test,prod

1)、创建命名空间
在这里插入图片描述

2)、创建组
在这里插入图片描述

3)、修改 coupon 模块 bootstrap.yml

1
2
3
4
5
6
7
8
9
spring:
application:
name: gulimall-coupon
cloud:
nacos:
config:
server-addr: 192.168.1.1:8848
namespace: 800ea1d2-0720-4c77-a6ec-780cacca6a69
group: test

4)、再次测试访问:http://127.0.0.1:7000/coupon/coupon/testNacosConfig
在这里插入图片描述

Nacos 多配置集

在这里插入图片描述
在这里插入图片描述

Gateway 介绍

发送请求需要知道商品服务的地址,如果商品服务器有3台耗服务器,1号掉线后,还得改,所以需要网关动态地管理,他能从注册中心中实时地感知某个服务上线还是下线。

请求也要加上询问权限,看用户有没有权限访问这个请求,也需要网关。

所以我们使用spring cloud的gateway组件做网关功能。

网关是请求浏览的入口,常用功能包括路由转发,权限校验,限流控制等。springcloud gateway取到了zuul网关。

spring-cloud-gateway 官网
spring-cloud-gateway 2.2.x 文档

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# Spring Cloud Gateway功能:

* 建立在Spring Framework 5,Project Reactor和Spring Boot 2.0之上

* 能够匹配任何请求属性上的路由。

* 谓词和过滤器特定于路由。

* 断路器集成。

* Spring Cloud DiscoveryClient集成

* 易于编写的谓词和过滤器

* 请求速率限制

* 路径改写

三大核心概念:
Route: 发一个请求给网关,网关要将请求路由到指定的服务。路由有id,目的地uri,断言的集合,匹配了断言就能到达指定位置,
Predicate断言: 就是java里的断言函数,匹配请求里的任何信息,包括请求头等
Filter: 过滤器请求和响应都可以被修改。

工作流程:“客户端发请求给服务端。中间有网关。先交给映射器,如果能处理就交给handler处理,然后交给一系列filer,然后给指定的服务,再返回回来给客户端。”
在这里插入图片描述

Gateway 使用

1)、创建模块 gulimall-gateway

2)、添加依赖

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>

<!--服务 注册发现-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!--服务 配置中心-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>

3)、gateway 主类上添加注解 @EnableDiscoveryClient

4)、添加 application.yml 配置

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
server:
port: 88

spring:
application:
name: gulimall-gateway
cloud:
nacos:
discovery:
server-addr: 192.168.1.1:8848
gateway:
routes:
- id: baidu_route
uri: https://www.baidu.com/
predicates:
- Query=url,baidu
- id: qq_route
uri: https://www.qq.com/
predicates:
- Query=url,qq

# id 表示:唯一标识,自定义
# uri:目标地址
# predicates:断言规则,全符合才可以
# - Query=url,qq:参数名 url=qq 时,才可以

5)、创建命名空间 gateway,并在gateway 命名空间下创建配置

1
2
3
4
5
6
7
8
DATA ID:gulimall-gateway.yml
GROUP:DEFAULT_GROUP
类型:yaml

添加如下内容:
spring:
application:
name: gulimall-gateway

6)、添加 bootstrap.yml 配置

1
2
3
4
5
6
7
8
9
10
11
spring:
application:
name: gulimall-gateway
cloud:
nacos:
config:
server-addr: 192.168.1.1:8848
# gateway 的命名空间 ID
namespace: ecf6bd54-9c16-416d-881c-626c710c3182
# 需创建 DATA ID:gulimall-gateway.yml
file-extension: yml

7)、启动之后,访问:http://localhost:88/?url=baiduhttp://localhost:88/?url=qq
在这里插入图片描述

项目版本问题

0)、具体可参考:修改所有 pom.xml

1)、在父pom中添加“SpringBoot,SpringCloud,SpringCloud-Alibaba”版本,这样子模块就不用写版本了。

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
<!-- 统一管理jar包版本 -->
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>

<spring-boot.version>2.2.2.RELEASE</spring-boot.version>
<spring-cloud.version>Hoxton.SR1</spring-cloud.version>
<spring-cloud-alibaba.version>2.1.0.RELEASE</spring-cloud-alibaba.version>
</properties>

<!-- 子模块继承之后,提供作用:锁定版本+子module不用写groupId和version -->
<dependencyManagement>
<dependencies>
<!--spring boot 2.2.2-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>${spring-boot.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!--spring cloud Hoxton.SR1-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!--spring cloud alibaba 2.1.0.RELEASE-->
<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>

2)、所有的子模块,继承父模块(如下代码)。还要删除“SpringBoot,SpringCloud,SpringCloud-Alibaba”版本。

1
2
3
4
5
<parent>
<artifactId>gulimall</artifactId>
<groupId>io.gitee.taopanfeng</groupId>
<version>0.0.1-SNAPSHOT</version>
</parent>

项目架构图

在这里插入图片描述

前端 2021-01-08 15:28:20

前后端对比

在这里插入图片描述

ES6

参考:ES6 再学习

Vue

参考:Vue 再学习

我的坚持不下去~

2021-01-06 16:30:20 不记录了,坚持不下去,先做一遍再说

2021-01-06 17:43:54 还是坚持下来了,哇,真麻烦,记录。

2021-01-26 17:30:55 我是真的不想跟着做这个 vue-demo 了,太折磨了。。。

2021-02-26 16:38:32 我不打算做这个项目了,但是我把这个项目具体哪些技术尽可能写一个 demo,具体怎么使用