断断续续两个多月研究了一下这个开源项目ruoyi-vue,是前后端分离版的,也写了一点xmind笔记。下面再具体的回忆一下后端的实现的细节,最后再将自己总结的xmind文件上传。
ps:使用目录结构总结,也方便读者和自己总结。
登录功能
流程图如上
- 验证验证码
- 数据库读取用户
- 校验密码
- 生成Token
小节
这种方案,可以作为单点登录SSO的实现方式,统一一个认证中心,分配Token,再统一认证。
数据权限
这一功能,可以参考我的一篇独立博客。这是ruoyi-vue的核心功能,他可以根据用户的不同,划分不同的数据权限,实现方面来说就是一张dept_role之间映射表来根据部门决定用户有什么权限,然后通过AOP将拼接的SQL添加到mapper中。
ps:后续添加一个RBAC模型的介绍,对于理解这个数据权限挺重要的。
异步任务
使用异步任务,可以大大减轻系统的压力,不至于任务一下打到数据库上,官方评测mysql的QPS大概在4k左右,顶不住很大的压力,所以可以适当添加异步任务削峰(这个主要还是得添加mq)。
在ruo-vue中简单使用了异步任务,他是使用了一个线程池ScheduledThreadPool,延时执行了给定的数据库日志任务。
本地限流
限流,意思是在某个时间段内,访问的次数只能在规定的数量内,本质上还是为了保护接口不被打挂。在ruo-vue中提供了两个实现。我们可以来看看。
- 使用@RateLimiter注解即可,使用很简单。
- 实现是使用AOP对方法访问进行计数。根据访问方法的全限定类名+方法名为key,数量为value,进行判断,超过了指定的数量,即触发Exception返回。由于这里步骤较多(自增value,判断value是否超过count)所以使用了Lua脚本保证原子性同时又减少网络开销。
- 可以有两种模式,一种是全局,一种是IP。默认是全局只同居类名+方法名,而IP会加上IP前缀,粒度小一些。
- 使用@RepeatSubmit注解,在规定的时间内不能提交第二次,可以理解为限流+脚本防刷。
- 实现时使用拦截器进行拦截,判断拦截的方法是否有这个注解,有的话,进行判断。
- 判断逻辑也是根据redis中获取上次访问的参数(这里较简单就没有使用Lua脚本),如果相同,拦截,否则正常。
XSS脚本过滤
XSS是一种利用系统漏洞,将一些含有脚本内容的字符串提交到系统后,系统将其识别为代码后执行,对系统进行破坏的行为。 使用@Xss注解,即可过滤掉参数中的脚本。实现逻辑是自定义实现一个Validated验证,然后外部调用使用@Validated启动,会使用正则表达式清除带有<>的字符。
系统也不只是为了某个特定的参数,也有一个全局的xss过滤,实现逻辑是通过包装一个RequestWrapper,每次getParameter都会启动清除<>的逻辑。
多数据源
使用@DataSource注解再指定想要使用哪个数据源即可,默认是配置了Slave和Master两个类型,但是只有一个Master数据源,如果想使用Slave就在配置文件中添加一个数据源。
实现上,是使用了AOP对添加了@DataSource注解的方法或类进行设置,使用的是ThreadLocal和每个线程绑定数据源名称。
在启动系统时,会向IOC容器中,添加一个数据源的Bean,默认是使用的Master名称的数据源,若配置了Slave数据源,则会加载Slave的Bean然后添加到数据源管理中。供系统切换。(实现了一个AbstractRoutingDataSource的方法,返回我们设置的数据源名称即可就可以让数据源容器自动切换)。
业务逻辑
系统的业务逻辑,都在ruoyi-system模块中,里面大多是CRUD的逻辑,但是添加了很多的判断,这点是值得我们学习的,在结尾处我会将业务逻辑放在一个大的.xmind文件中,可以自行下载,点开ruoyi-admin下的system中(我是从controller开始分析的)。
下面再介绍一下各个模块的作用:
-
多数操作都使用了redis,避免每次都查询数据库(这里默认情况下,在admin更新了某个用户的数据权限后不是实时更新的,因为用户信息被缓存到了redis中。想改变也容易,自行更新即可)。
-
比较重要的是ruoyi-framework这个模块,几乎所有的注解实现都是在这里实现的(包括数据权限@DataScope),所以研究这个项目一定得看看framework这个模块。
-
system-common这个模块是工具类。
代码生成器和定时任务不是系统的核心,如果要在自己系统集成的话可以在已有的基础上进行添加,非常快速。
架构设计
- admin:
- framework
- common
- gen
- quartz
- common
- framework
- system
- system
- common
admin提供总控功能,将请求分发到各模块
common提供工具
framework提供核心内容
system提供跟系统相关内容
总结
总的来说,学习了两个月,还是学习到了一些业务逻辑以及编码方式,例如在使用
- AOP对业务功能增强方面
- 设计模式
- 的抽象类加子类实现的模板方法
- 拦截器Wrapper包装的装饰器模式
- MVC模式serive是如何解耦的
- 全局异常加国际化的继承处理
- 常见的逻辑:比如登录JWT,验证,注册,缓存redis的使用,数据过滤,以及上述的一些功能。
ps:后续我们还可以继续搭建一下cloud版本的内容。
xmind文件总结
链接:pan.baidu.com/s/1tXqnAXkA… 提取码:1234