今天我们继续模拟一个基于微服务架构的在线教育项目进行业务流程梳理。
3-1 你们的项目是如何进行参数校验的
我们在项目中是使用Spring的Validation,这是一套基于注解的权限校验框架,常用的注解有以下这些:
空值相关:
@Null 可以标注在任意类型元素上,被标注的元素必须为null
@NotNull 可以标注在任意类型元素上,被标注的元素必须不能为null,但是可以为空串
@NotBlank 可以标注在字符串类型上,被标注的元素不能为null,也不能为空串
@NotEmpty 可以标注在字符串、集合、数组、map类型上 被标注的元素值不为null,也不能为空集合或者空串
数值相关:
@Min(value) 被标注的元素必须是一个数字,其值必须大于等于指定的最小值,对null无效
@Max(value) 被标注的元素必须是一个数字,其值必须小于等于指定的最大值,对null无效
@Range(min=,max=) 被标注的字符串的大小必须在指定的范围内,对null无效
@Size(min=,max) 可以标注在字符串、数组、集合、map上,用于控制数组等长度
@Length(min=,max=) 可以标注在字符串上,被标注的字符串的大小必须在指定的范围内
要使这些注解生效,需要使用一个支持Bean Validation的验证器。我们使用的验证器是Spring框架中的验证支持,具体就是在类上打上@Validated这个注解来开启验证功能,
当校验对象中含有对象类型的属性时,需要在对象属性上使用@Valid开启级联校验
有的属性在不同的需求下会有不同的校验规则,比如:新增时id需要为null,修改时id不能为null,此时就要开启分组校验
3-2 详细说一下你们的问答系统用到了几张表,表中的主要字段有哪些,表关系是什么
我们在项目中的问答系统涉及到2个微服务,三张表,分别是用户微服务的用户表,学习微服务的问题表和回答表。
用户表中主要包含:用户id,用户名和用户图片等。
问题表主要包含:问题id,问题内容,问题描述,提问人的id,最后一个回复人的id,问题回答数量,以及一些业务相关的字段。
回答表主要包含:回答id,问题id,评论id,回答人的id,回答的内容,回复的目标用户id,回复的目标回复id,回答次数,以及一些业务相关的字段。
这三张表的关系为:一个用户可以提多个问题,也可以回答多个问题,和对一个问题回答多次,一个问题可以有多个回答,一个回答也可以有多个回答及评论。
3-3 你们为什么用Mongo, 而不用MySQL存储问题和评论
我在项目中之所以用Mongo存储问题和评论,是因为Mongo有以下特点。
1.MongoDB是非关系数据库当中功能最丰富,最像关系(MySQL)数据库的产品
2.它支持的数据结构非常松散,是类似JSON的BSON格式,因此可以存储比较复杂的数据类型。同时其面向集合存储,并且易于存储对象类型的数据支持动态查询,及支持索引支持复制和故障恢复
总之Mongo适合存储海量数据;且Mongo存储的多为价值较低的数据;
问题和评论量比较多,且价值相对不高,完美契合Mongo,因此我在项目中使用Mongo存储问题和评论。