Nacos 核心原理解读+高性能微服务系统实战 Study Notes
Kierke

慕课网课程《Nacos 核心原理解读+高性能微服务系统实战》学习笔记

前言

  • Nacos的相关概念内容可以参考Nacos官方文档,这篇学习笔记只标注记录重要的点,以便知识整体梳理



Reference




Eureka VS Nacos

Eureka发展史

  • Eureka的引入
    • Eureka 2012年左右被引入国内
    • Eureka是Netflix开发的服务发现框架,本身是一个基于REST的服务,主要用于定位运行在AWS城中的中间层服务,以达到负载均衡和中间层服务故障转移的目的
    • Springcloud将它集成在其子项目spring-cloud-netflix中,以实现Springcloud的服务发现功能
  • Eureka的盛行
    • 从2013年开始,被得到广泛使用
    • 到2015年,几乎国内的互联网大厂均在使用Eureka
  • Eureka的陨落
    • 2018年,Nacos第一个版本正式对外发布
    • Eureka只能提供服务注册、发现,不能提供配置管理。使用范围逐渐缩小


Nacos的崛起

  • 2019年,Nacos第一个成熟版本正式对外发布(相比Eureka,Nacos服务注册、发现效率高,并且提供统一配置管理。内存占用空间少
  • 2020年,Nacos逐渐被国内互联网大厂使用
  • 2021年,Eureka已经被国内互联网大厂停止使用,均移步Nacos



Nacos主要版本介绍

Nacos 1.4.X版本(低版本的稳定版本)特性

  • 支持SpringBoot版本到 2.6.6
  • 解决并完善Spring权限认证相关问题
  • 重置JRaft协议集群无Leader操作
  • 减少 DistroProtocol初始化中的内存成本以避免OutOfMemoryError
  • 增加NamingProxy.serversFromEndpoint的内存可见性
  • 修复ServerListManager的迭代器并发问题


Nacos 2.1.X版本(最新版本的稳定版本)特性

  • 支持批量注册服务
  • 暂时移除离开 nacos 服务器节点API
  • 添加默认模糊搜索功能
  • 将TRACE 事件添加到服务器
  • 在历史列表中添加版本数据比较
  • 增强默认身份验证插件性能



Nacos的安装

Nacos(Linux环境)

1
2
3
4
5
6
wget -P /usr/local/src/ https://github.com/alibaba/nacos/releases/download/1.4.4/nacos-server-1.4.4.tar.gz

tar -zxvf /usr/local/src/nacos-server-1.4.4.tar.gz -C /usr/local

# 单机方式启动Nacos
/usr/local/nacos/bin/startup.sh -m standalone



Nacos基础核心特性

服务注册

服务注册定义

  • 将服务通过一定的技术手段,使其生成在或存在于某种统一的管理平台或云平台的过程

Nacos实现服务注册思路剖析

  • 用户发出服务注册请求
  • Nacos接收到该服务注册请求
  • Nacos基于请求构造服务元数据(一部分从请求读取,一部分Nacos添加)
  • Nacos携带元数据和请求向云平台发起注册
  • Nacos云平台持久化服务数据(包括服务元数据和请求数据)到数据库或本地
  • Nacos返回服务注册结果(向用户返回也向云平台返回)


服务发现

服务发现定义

  • 将存在于统一服务平台或云平台中服务列表中的服务,通过一定的对外暴露手段,将服务列表进行对外暴露的过程

Nacos实现服务发现思路

  • Nacos云平台自我检测服务列表
  • Nacos内部对外暴露服务列表
  • Nacos启动服务间通信机制(可能是心跳检查,可能是gRPC通信)
  • Nacos启动服务间健康检查机制
  • Nacos维护服务元数据


配置发布与获取

什么是配置发布

  • 将一个或多个服务所需的配置参数通过一定的技术手段,进行统一发布,使其生效或不生效的过程

配置获取

  • 通过一定的技术手段,从统一的配置管理中心获取一个或多个服务配置参数,并进行自我校验的过程

Nacos实现配置发布与获取思路

  • 配置发布

    • 用户发起配置发布请求
    • Nacos配置监听程序捕获该请求
    • Nacos对该请求进行解析
  • 获取

    • Nacos识别配置文件格式、参数
    • Nacos与具体服务建立通信
    • Nacos更新具体服务配置参数
1
2
3
4
5
# Nacos 配置发布
curl -X POST "http://127.0.0.1:8848/nacos/v1/cs/configs?datald=nacos.cfgdatald&group=test&content=HelloWorld"

# Nacos 配置获取
curl -X GET "http://127.0.0.1:8848/nacos/v1/cs/configs?datald=nacos.cfgdatald&group=test"



从Eureka过渡到Nacos

Eureka Trans Nacos 过渡思路拆解

  • 从大方向入手考虑
    • 以项目整体为角度,思考项目本身是否可以过渡到 Nacos?(项目技术架构是否支持 Nacos)
    • 如果使用 Nacos 会为项目本身带来什么优势?
    • 在更换 Nacos 时,如何保障项目正常运行?
  • 从小方向进行演进
    • 确定更换 Nacos 时的最小粒度节点(确定更换 Nacos 时所花费的人力与时间成本)
    • 确定需要更换 Nacos 的服务范围,通常是项目整体
    • 确定配置文件是否可以平稳迁移,若需改动配置,难易度如何
  • 从运维方向确保平稳过渡
    • 保障演进为 Nacos 后的过渡工作(考虑 Eureka 是否需要与 Nacos 平行运行一段时间?)
    • 监测演进为 Nacos 后的项目整体性能指标是否符合预期?
    • 制定演进为 Nacos 后的项目整体运维方案


Eureka Trans Nacos 演进思路拆解

  • 确定项目整体架构形式
    • 确定是采用新的架构还是继续延用旧的项目架构?
    • 确定 Nacos 所需治理的微服务范围
  • Nacos 针对性技术选型
    • 确定 Nacos 的演进方式,是SDK,还是 Server
    • 确定 Nacos 的版本范围,包括大版本和小版本
    • 评估旧项目的配置文件,确定需要迁移到 Nacos 的配置项
  • Nacos 演进过程
    • 整体思路:将旧项目进行拷贝,在拷贝后的旧项目环境中进行Nacos 的演进,确保演进没问题后,根据项目整体情况进行决策,是平行运行还是直接替掉旧项目



基于Nacos的在线教育平台实战

在线教育平台项目需求分析

  • 在线教育平台整体采用基于Nacos的微服务架构方式,由用户模块、在线学习模块、技能测评模块,以及后台管理模块组成。
image


项目前后端技术选型(架构解析)

需要清楚各个技术选型的原因

确定下技术选型后需要跟技术负责人确认,并通过技术评审、评估

需要清楚,现有的需求,如果有变更(新增、作废、更新、升级),当前的前后端技术选型和架构是否能满足新需求,以及能否清楚所带来的影响(包括性能影响、资源影响、人力影响等等)

  • 项目后端技术选型
    • 后端核心服务框架:Spring Boot、Spring(要专注于业务代码编写,而不是专注于项目配置;Spring Boot内置了很多实现,提供了很多便利开发条件)
    • 传统微服务框架:Spring Cloud Alibaba、Spring(节约人力、物力成本、运维成本,适应主流技术发展)
    • 微服务治理核心框架:Nacos、Eureka
    • 数据持久化层:MySQL、Oracle
  • 项目前端技术选型
    • 前端核心处理框架:Vue 3.X、Angular(后者解决很多问题,用起来太过笨重)
    • 静态资源库选择:Element-UI、Ant
    • 展示层模板:Vue Admin、Bootstrap


项目后端框架搭建

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
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
<?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.0.7.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.oep</groupId>
<artifactId>oep</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>pom</packaging>
<name>oep</name>
<description>在线教育平台父工程</description>
<modules>
<module>oep-backend-service</module>
<module>oep-documents-service</module>
<module>oep-question-service</module>
<module>oep-skill-service</module>
<module>oep-video-service</module>
</modules>

<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
<mysql-connector-java.version>8.0.21</mysql-connector-java.version>
<agate.kernel.version>1.0.0.220401_RELEASE</agate.kernel.version>
<docker.img.version>latest</docker.img.version>
<!--+++++++++++++++++++++++++++++新加依赖+++++++++++++++++++++++++++++-->
<mybatis-plus.version>3.3.0</mybatis-plus.version>
<swagger.ui>2.9.2</swagger.ui>
</properties>

<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>
<!--新加依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<!-- 动态数据源 -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>dynamic-datasource-spring-boot-starter</artifactId>
<version>2.5.6</version>
</dependency>
<!-- mybatis-plus -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>${mybatis-plus.version}</version>
</dependency>
<!-- 代码生成器 -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-generator</artifactId>
<version>${mybatis-plus.version}</version>
</dependency>
<!-- freemaker引擎 -->
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
<version>2.3.29</version>
</dependency>
<!-- sql 打印 -->
<dependency>
<groupId>p6spy</groupId>
<artifactId>p6spy</artifactId>
<version>3.8.5</version>
</dependency>
<!-- commons -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.6</version>
</dependency>
<!-- mysql -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>${mysql-connector-java.version}</version>
</dependency>
<!-- &lt;!&ndash; orcle &ndash;&gt;-->
<!-- <dependency>-->
<!-- <groupId>com.oracle.database.jdbc</groupId>-->
<!-- <artifactId>ojdbc8</artifactId>-->
<!-- <version>12.2.0.1</version>-->
<!-- </dependency>-->

<!-- aop依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
<!-- shiro-spring -->
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-spring</artifactId>
<version>1.4.1</version>
</dependency>
<!-- spring cache -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-cache</artifactId>
</dependency>
<!-- redis -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
</dependency>
<!-- ip2region -->
<dependency>
<groupId>org.lionsoul</groupId>
<artifactId>ip2region</artifactId>
<version>1.7.2</version>
</dependency>
<!-- jwt -->
<dependency>
<groupId>com.auth0</groupId>
<artifactId>java-jwt</artifactId>
<version>3.8.2</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<!-- quartz -->
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
</dependency>
<!-- Excel工具 -->
<dependency>
<groupId>com.wuwenze</groupId>
<artifactId>ExcelKit</artifactId>
<version>2.0.72</version>
</dependency>
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>23.0</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>${swagger.ui}</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>${swagger.ui}</version>
</dependency>
<dependency>
<groupId>com.github.xiaoymin</groupId>
<artifactId>swagger-bootstrap-ui</artifactId>
<version>1.9.6</version>
</dependency>
<dependency>
<groupId>org.jetbrains</groupId>
<artifactId>annotations</artifactId>
<version>15.0</version>
</dependency>
<!-- webSocket所需依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-websocket</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.66</version>
</dependency>
<dependency>
<groupId>jakarta.validation</groupId>
<artifactId>jakarta.validation-api</artifactId>
<version>2.0.2</version>
</dependency>
<dependency>
<groupId>xml-apis</groupId>
<artifactId>xml-apis</artifactId>
<version>1.4.01</version>
</dependency>
<!--<dependency>-->
<!--<groupId>org.activiti</groupId>-->
<!--<artifactId>activiti-spring-boot-starter</artifactId>-->
<!--<version>7.1.0.M2</version>-->
<!--<exclusions>-->
<!--<exclusion>-->
<!--<groupId>org.mybatis</groupId>-->
<!--<artifactId>mybatis</artifactId>-->
<!--</exclusion>-->
<!--</exclusions>-->
<!--</dependency>-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<version>2.0.3.RELEASE</version>
<scope>test</scope>
</dependency>

<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.4.4</version>
</dependency>

<!--kaptcha验证码-->
<dependency>
<groupId>com.github.penggle</groupId>
<artifactId>kaptcha</artifactId>
<version>2.3.2</version>
</dependency>

<!-- excel导入导出 -->
<dependency>
<groupId>com.github.stupdit1t</groupId>
<artifactId>poi-excel</artifactId>
<version>1.8.1</version>
</dependency>

<dependency>
<groupId>cn.afterturn</groupId>
<artifactId>easypoi-spring-boot-starter</artifactId>
<version>4.2.0</version>
</dependency>

<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>3.1.2</version>
</dependency>

<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>4.1.0</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-scratchpad</artifactId>
<version>4.1.0</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>4.1.0</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml-schemas</artifactId>
<version>4.1.0</version>
</dependency>
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itextpdf</artifactId>
<version>5.5.13</version>
</dependency>
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itext-asian</artifactId>
<version>5.2.0</version>
</dependency>
<dependency>
<groupId>dom4j</groupId>
<artifactId>dom4j</artifactId>
<version>1.6.1</version>
</dependency>
<dependency>
<groupId>com.alibaba.boot</groupId>
<artifactId>nacos-discovery-spring-boot-starter</artifactId>
<version>0.2.4</version>
</dependency>
<!-- <dependency>-->
<!-- <groupId>com.alibaba.cloud</groupId>-->
<!-- <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>-->
<!-- <version>2.0.3.RELEASE</version>-->
<!-- </dependency>-->
</dependencies>

<dependencyManagement>
<dependencies>

</dependencies>
</dependencyManagement>

<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>

</project>

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

spring:
application:
name: oep-backend
datasource:
dynamic:
p6spy: true
hikari:
connection-timeout: 3000
max-lifetime: 1800000
max-pool-size: 15
min-idle: 5
connection-test-query: select 1 from dual
pool-name: FebsHikariCP
primary: primary
datasource:
primary:
username: root
password: root
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://127.0.0.1:3306/onlineeduimooc?useUnicode=true&characterEncoding=UTF-8&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&useSSL=false&serverTimezone=Asia/Shanghai
proxy-target-class: true
messages:
encoding: UTF-8


nacos:
discovery:
server-addr: 192.168.58.220:8848
mybatis-plus:
type-aliases-package: com.oep.backend.domain
mapper-locations: classpath:mapper/*/*.xml
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
jdbc-type-for-null: null
global-config:
banner: false


项目前端框架搭建

image
  • 最后根据提示执行命令
  • 启动、观察、验证


项目前后端架构适应性测试

  • 什么是适应性测试
    • 适应性测试,在信息系统中,一般指为了测试系统中间数据是否可正常流转、系统各架构、各中间件是否正常协同工作的过程


用户模块

功能概述 & 实现思路

  • 用户登录功能:在用户登录时,用户可以选择登录方式,该平台支持传统登录与QQ邮箱登录两种方式,传统登录则通过输入账号、密码、验证码进行登录。
image
  • 用户注册功能:在用户注册时,用户可以选择注册方式,该平台支持传统注册与QQ邮箱注册两种方式,传统注册则通过输入用户注册数据进行注册
image
  • 用户个人中心功能:在用户个人中心,用户可以修改密码、维护个人信息、查看我的学习情况、查看我的技能情况、查看我的测评情况,可以更全面了解用户本身的技能掌握情况
image

image

数据库表结构设计(用户模块)

1
2
create database onlineeduimooc;
use onlineeduimooc;
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
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
/*
Navicat Premium Data Transfer

Source Server : My
Source Server Type : MySQL
Source Server Version : 50734
Source Host : localhost:3306
Source Schema : onlineeduimooc

Target Server Type : MySQL
Target Server Version : 50734
File Encoding : 65001

Date: 27/04/2023 09:15:10
*/

SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------
-- Table structure for edu_document
-- ----------------------------
DROP TABLE IF EXISTS `edu_document`;
CREATE TABLE `edu_document` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`document_type` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '文章类型',
`document_level` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '文章等级:1-初级,2-中级,3-高级',
`document_stars` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '文章推荐指数星际:1-一星,2-二星,3-三星',
`document_up_user` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '文章维护用户',
`document_content` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL COMMENT '文章内容',
`create_time` timestamp(0) NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP(0) COMMENT '创建时间',
`update_time` datetime(0) NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP(0) COMMENT '更新时间',
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 2 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_bin COMMENT = '文章信息表' ROW_FORMAT = Dynamic;

-- ----------------------------
-- Records of edu_document
-- ----------------------------
INSERT INTO `edu_document` VALUES (1, '测试文章类型', '中级', '3', NULL, '测试文章内容222', '2023-02-17 08:35:18', '2023-02-17 08:35:18');

-- ----------------------------
-- Table structure for edu_question
-- ----------------------------
DROP TABLE IF EXISTS `edu_question`;
CREATE TABLE `edu_question` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`question_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '题库名称',
`question_type` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '题库类型:1-单选,2-多选,3-论述',
`question_up_user` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '题库维护管理员',
`question_level` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '题库等级:1-简单,2-中等,3-困难',
`create_time` timestamp(0) NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP(0) COMMENT '创建时间',
`update_time` datetime(0) NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP(0) COMMENT '更新时间',
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 6 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_bin COMMENT = '题库信息表' ROW_FORMAT = Dynamic;

-- ----------------------------
-- Records of edu_question
-- ----------------------------
INSERT INTO `edu_question` VALUES (1, '测试题库名称', '1', NULL, NULL, '2023-01-31 10:09:40', NULL);
INSERT INTO `edu_question` VALUES (2, '测试题库名称2', '2', NULL, NULL, '2023-01-31 10:09:50', NULL);
INSERT INTO `edu_question` VALUES (3, '测试题库名称3', '3', NULL, NULL, '2023-01-31 10:09:57', NULL);
INSERT INTO `edu_question` VALUES (4, '测试题库名称4', '1', NULL, NULL, '2023-01-31 10:10:06', NULL);
INSERT INTO `edu_question` VALUES (5, '测试题库名称5', '1', NULL, NULL, '2023-01-31 10:10:14', NULL);

-- ----------------------------
-- Table structure for edu_question_content
-- ----------------------------
DROP TABLE IF EXISTS `edu_question_content`;
CREATE TABLE `edu_question_content` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`question_id` int(11) NULL DEFAULT NULL COMMENT '题库Id',
`pretext_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '题目名称',
`pretext_answer` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '题目答案',
`create_time` timestamp(0) NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP(0) COMMENT '创建时间',
`update_time` datetime(0) NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP(0) COMMENT '更新时间',
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 2 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_bin COMMENT = '题库内容表' ROW_FORMAT = Dynamic;

-- ----------------------------
-- Records of edu_question_content
-- ----------------------------
INSERT INTO `edu_question_content` VALUES (1, 1, NULL, '123', '2023-02-01 09:52:28', NULL);

-- ----------------------------
-- Table structure for edu_report
-- ----------------------------
DROP TABLE IF EXISTS `edu_report`;
CREATE TABLE `edu_report` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`user_id` int(11) NULL DEFAULT NULL COMMENT '用户Id',
`report_title` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '测评标题',
`report_content` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '测评内容',
`report_time` datetime(0) NULL DEFAULT NULL COMMENT '测评报告生成时间',
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 2 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_bin COMMENT = '用户测评报告信息表' ROW_FORMAT = Dynamic;

-- ----------------------------
-- Records of edu_report
-- ----------------------------
INSERT INTO `edu_report` VALUES (1, 3, '测试测评报告', '准确率100%', '2023-02-15 08:26:56');

-- ----------------------------
-- Table structure for edu_user
-- ----------------------------
DROP TABLE IF EXISTS `edu_user`;
CREATE TABLE `edu_user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`username` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '用户名',
`password` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '密码',
`phone` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '手机',
`sex` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '性别',
`email` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '邮箱',
`address` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '地址',
`create_time` timestamp(0) NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP(0) COMMENT '创建时间',
`update_time` datetime(0) NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP(0) COMMENT '更新时间',
`user_role` int(11) NULL DEFAULT NULL COMMENT '1-普通用户,2-管理员',
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 5 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_bin COMMENT = '用户信息表' ROW_FORMAT = Dynamic;

-- ----------------------------
-- Records of edu_user
-- ----------------------------
INSERT INTO `edu_user` VALUES (3, 'testCommonRegister', '123456', '13222333232', '男', '244007461@qq.com', '银河系', '2023-02-15 21:40:20', '2023-02-15 21:40:20', NULL);
INSERT INTO `edu_user` VALUES (4, 'testCommonRegister', '123456', '13677652728', '男', '244007461@qq.com', '地球', '2023-02-15 21:29:42', NULL, NULL);

-- ----------------------------
-- Table structure for edu_user_document
-- ----------------------------
DROP TABLE IF EXISTS `edu_user_document`;
CREATE TABLE `edu_user_document` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`user_id` int(11) NULL DEFAULT NULL COMMENT '用户Id',
`document_id` int(11) NULL DEFAULT NULL COMMENT '文章Id',
`document_user_start_time` datetime(0) NULL DEFAULT NULL COMMENT '用户开始学习时间',
`document_user_end_time` datetime(0) NULL DEFAULT NULL COMMENT '用户结束学习时间',
`document_user_total_time` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '用户学习文章总时间',
`create_time` timestamp(0) NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP(0) COMMENT '创建时间',
`update_time` datetime(0) NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP(0) COMMENT '更新时间',
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_bin COMMENT = '用户文章学习表' ROW_FORMAT = Dynamic;

-- ----------------------------
-- Table structure for edu_user_question
-- ----------------------------
DROP TABLE IF EXISTS `edu_user_question`;
CREATE TABLE `edu_user_question` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`question_id` int(11) NULL DEFAULT NULL COMMENT '题库Id',
`pretext_id` int(11) NULL DEFAULT NULL COMMENT '题目Id',
`user_id` int(11) NULL DEFAULT NULL COMMENT '用户Id',
`user_answer` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '用户答案',
`user_question_start_time` datetime(0) NULL DEFAULT NULL COMMENT '用户开始作答时间',
`user_question_end_time` datetime(0) NULL DEFAULT NULL COMMENT '用户结束作答时间',
`user_question_total_time` varchar(0) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '用户题库作答学习时间',
`create_time` timestamp(0) NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP(0) COMMENT '创建时间',
`update_time` datetime(0) NULL DEFAULT NULL COMMENT '更新时间',
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 6 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_bin COMMENT = '用户题库学习表' ROW_FORMAT = Dynamic;

-- ----------------------------
-- Records of edu_user_question
-- ----------------------------
INSERT INTO `edu_user_question` VALUES (1, 1, 1, 1, '123', NULL, NULL, NULL, '2023-02-01 09:54:07', NULL);
INSERT INTO `edu_user_question` VALUES (2, 4, 1, 1, '123', NULL, NULL, NULL, '2023-02-01 09:54:08', NULL);
INSERT INTO `edu_user_question` VALUES (3, 5, 1, 1, '123', NULL, NULL, NULL, '2023-02-01 09:54:09', NULL);
INSERT INTO `edu_user_question` VALUES (4, 2, 1, 1, '123', NULL, NULL, NULL, '2023-02-01 09:54:09', NULL);
INSERT INTO `edu_user_question` VALUES (5, 3, 1, 1, '123', NULL, NULL, NULL, '2023-02-01 09:54:10', NULL);

-- ----------------------------
-- Table structure for edu_user_video
-- ----------------------------
DROP TABLE IF EXISTS `edu_user_video`;
CREATE TABLE `edu_user_video` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`video_id` int(11) NULL DEFAULT NULL COMMENT '视频Id',
`user_id` int(11) NULL DEFAULT NULL COMMENT '用户Id',
`video_user_start_time` datetime(0) NULL DEFAULT NULL COMMENT '用户开始学习时间',
`video_user_end_time` datetime(0) NULL DEFAULT NULL COMMENT '用户结束学习时间',
`video_user_time` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '用户视频学习总时间',
`create_time` timestamp(0) NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP(0) COMMENT '创建时间',
`update_time` datetime(0) NULL DEFAULT NULL COMMENT '更新时间',
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 4 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_bin COMMENT = '用户视频学习表' ROW_FORMAT = Dynamic;

-- ----------------------------
-- Records of edu_user_video
-- ----------------------------
INSERT INTO `edu_user_video` VALUES (1, 1, 1, NULL, NULL, '1', '2023-01-31 10:31:07', NULL);
INSERT INTO `edu_user_video` VALUES (2, 2, 1, NULL, NULL, '1', '2023-01-31 10:31:12', NULL);
INSERT INTO `edu_user_video` VALUES (3, 3, 1, NULL, NULL, '2', '2023-01-31 10:31:20', NULL);

-- ----------------------------
-- Table structure for edu_video
-- ----------------------------
DROP TABLE IF EXISTS `edu_video`;
CREATE TABLE `edu_video` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`video_src` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '视频地址',
`video_up_user` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '视频up主',
`video_type` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '视频类型',
`video_timeline` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '视频时长',
`create_time` timestamp(0) NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP(0) COMMENT '创建时间',
`update_time` datetime(0) NULL DEFAULT NULL COMMENT '更新时间',
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_bin COMMENT = '视频信息表' ROW_FORMAT = Dynamic;

SET FOREIGN_KEY_CHECKS = 1;
  • 用户信息表:edu_user
  • 用户文章学习表:edu_user_document
  • 用户题库学习表:edu_user_question
  • 用户视频学习表:edu_user_video
  • 用户测评报告信息表:edu_report



Reference




Remark

  1. Nacos如何在ap和cp中切换
  2. nacos整合springboot和整合springcloud需要再学习一下
  3. 枚举类
  4. jwt类的代码可以学习一下
1
2
3
4
5
<font color=red></font>
![]()
<img src="" title="图片名称" alt="图片无法正常加载展示!" width="100%" height="100%" >
<center><img src="" width="70%"></center>
****