毕设:基于Vue+Socket+Redis的分布式高并发防疫健康管理系统

毕设:基于Vue+Socket+Redis的分布式高并发防疫健康管理系统

  • 一、 摘要
  • 二、系统说明
    • BS架构
    • 前后端分离
    • 系统部署图
    • 前端:PC、移动端分离
    • 角色权限层级划分图
  • 四、系统使用的相关技术介绍
  • 五、难点介绍(代码原理分析)
    • 服务器请求分发
    • 自定义框架的IOC
    • 自定义框架的AOP
    • Log日志
    • 系统安全
  • 六、系统优点
    • 拓展性强
    • 高负载量
    • 现实意义
  • 总结
    • 系统建设遇到的困难
    • 系统优化点
  • SpringCloud版本
    • 架构图
    • 后端分布式部署架构图


毕设:基于Vue+Socket+Redis的分布式高并发防疫健康管理系统_第1张图片

一、 摘要

摘要: 疫情期间,校园疫情上报线上压力大,使用频繁。像校园疫情上报该类型并发量较高,访问频繁的系统需要进行快速响应。传统的系统并发量低,无法在这种情况下满足用户的使用需求。
本系统采用BS架构,客户端维护简单。系统采用前后端分离,前端PC和移动端分离,后端分布式部署,既可以提高访问速度又能提升系统稳定性,在遇到个别服务器出现异常情况下,仍然可以保证用户正常使用。
Nginx做前端请求的分发服务器,可以根据用户访问的设备类型将重定向至PC端或移动端服务器,前端PC服务器或移动端服务器需要请求后端服务器的时候,将统一访问Nginx负载均衡服务器。负载均衡服务器再分发任务到以Redis作为缓存的分布式部署的后端服务器实现服务器完全的响应。应用本系统,能够快速响应并发多用户的请求,是解决高校疫情防控问题的有效方式之一。

关键词:前后端分离;分布式;Redis;BS架构;Java;Vue

Distributed high-concurrent epidemic prevention and health management system based on Vue + Socket + Redis
Abstract: During the epidemic period, campus epidemic reporting is under great pressure and used frequently.For example, campus epidemic reporting systems with a high amount of concurrency and frequent visits require rapid response.The traditional system has low concurrency and cannot meet the needs of users in this case.
This system adopts the BS architecture, and the client maintenance is simple.The system adopts front and rear end separation, front-end PC and mobile end separation, back-end distributed deployment, can not only improve the access speed and improve the stability of the system, in the case of individual server abnormal, can still ensure the normal use of users.
Nginx is the distribution server for the front-end request, which can redirect to the PC or mobile server according to the type of device that the user visits. When the front-end PC server or the mobile-end server needs the back-end server, the Nginx load balancing server.Load balancing server redistribution tasks to a distributed deployment with Redis as a cache.The application of this system can quickly respond to concurrent multi-user requests, which is one of the effective ways to solve the problem of epidemic prevention and control in universities.
Keywords: Front and rear end separation; distributed; Redis; BS architecture; Java; Vue

`

二、系统说明

BS架构

毕设:基于Vue+Socket+Redis的分布式高并发防疫健康管理系统_第2张图片

该系统采用BS架构,即浏览器----服务器架构

BS的优点
优点:

  • 分布性强,客户端零维护。只要有网络、浏览器,可以随时随地进行查询、浏览等业务处理。
  • 业务扩展简单方便,通过增加网页即可增加服务器功能。
  • 维护简单方便,只需要改变网页,即可实现所有用户的同步更新。
  • 开发简单,共享性强。

前后端分离

毕设:基于Vue+Socket+Redis的分布式高并发防疫健康管理系统_第3张图片
前后端分离的优点

  • 彻底解放前端。前端不再需要向后台提供模板或是后台在前端HTML中嵌入后台代。
  • 提高工作效率,分工更加明确。前端只关注前端的事,后台只关心后台的活,两者开发可以同时进行,在后台还没有时间提供接口的时候,前端可以先将数据写死或者调用本地的JSON文件即可,页面的增加和路由的修改也不必再去麻烦后台,开发更加灵活。
  • 局部性能提升。通过前端路由的配置,我们可以实现页面的按需加载,无需一开始加载首页便加载网站的所有的资源,服务器也不再需要解析前端页面,在页面交互及用户体验上有所提升。
  • 降低维护成本。通过目前主流的前端MVC框架,我们可以非常快速的定位及发现问题的所在,客户端的问题不再需要后台人员参与及调试,代码重构及可维护性增强。
  • 实现高内聚低耦合,减少后端(应用)服务器的并发/负载压力。
  • 即使后端服务暂时超时或者宕机了,前端页面也会正常访问,但无法提供数据。
  • 可以使后台能更好的追求高并发、高可用、高性能,使前端能更好的追求页面表现、速度流畅、兼容性、用户体验等。

前后端采用HTTP请求建立通信,前端使用Ajax通信技术,后端采用原生的socket请求封装为HTTP请求进行通信

系统部署图

毕设:基于Vue+Socket+Redis的分布式高并发防疫健康管理系统_第4张图片

该系统由七大部分构成:

移动端服务器

PC端服务器

Spring后端服务器

自定义框架服务器

MySQL数据库

Redis中间件

Nginx服务器

前端:PC、移动端分离

毕设:基于Vue+Socket+Redis的分布式高并发防疫健康管理系统_第5张图片
该系统前端服务器分为移动端服务器和PC端服务器,功能一致,独立部署,互不影响。当用在浏览器访问服务器地址时,会请求Nginx服务器,Nginx服务器根据用户的设备类型进行请求分发,分配到PC服务器或者移动端服务器。

角色权限层级划分图

毕设:基于Vue+Socket+Redis的分布式高并发防疫健康管理系统_第6张图片

该系统中进行了三种角色划分,并且自上而下分为管理员,教师,学生。
(1) 系统内角色有三种,分别是管理员,教师,学生。
(2) 所有除管理员以外的角色都有参与完善个人信息,疫情上报的功能。
(3) 管理员可以查看所有教师,学生的疫情上报统计情况。可以给教师分配或者取消分配的班级。
(4) 教师可以查看自己分配班级的疫情上报详细情况和统计信息。

四、系统使用的相关技术介绍

毕设:基于Vue+Socket+Redis的分布式高并发防疫健康管理系统_第7张图片

五、难点介绍(代码原理分析)

该项目的主要难点在于该系统未使用Tomcat等开源服务器做后端服务器,项目底层的服务器逻辑处理均由自己开发实现。
自定义的框架服务器的业务代码和使用Spring框架编写的服务器业务几乎代码完全一致。自定义的框架是模拟Spring框架的一套框架,模拟Spring框架实现了Spring中的IOC、AOP功能模块。

服务器请求分发

在该项目中,后端服务器包含了Spring框架的服务器和自定义框架的服务器,均未使用开源的Tomcat服务器。所有的后端服务器的请求的响应均使用的是自定义的请求响应服务器。
该系统中请求响应解析的基本原理过程如下:
(1) 接收到请求,获取请求数据
(2) 解析请求类型,解析请求数据
(3) 根据请求类型,使用反射机制加载并实例化,找到到对应的Controller类对象和方法
(4) 执行对应的方法,并执行其业务
(5) 检测执行结果,并且返回结果到前端
下面是反射执行对应类的核心代码
毕设:基于Vue+Socket+Redis的分布式高并发防疫健康管理系统_第8张图片

自定义框架的IOC

二零二二年三月二十六日,根据据网络安全网站 Cyber Kendra 报道,Spring Cloud
Function官方测试用例曝光远程注入漏洞,黑客可利用这个漏洞触发远程命令执行恶意代码。该远程代码执行漏洞,远程嵌入恶意代码等情况,该漏洞已经被证实。Spring中存在的漏洞,结合jdk9及以上新版本的特性,如果成功利用此漏洞甚至可能导致用户权限提升,可能任意命令执行后门等危害。

由此可见该项目中去使用自定义框架,去模拟Spring实现相关的功能具有非常重要的意义,对今后的系统建设过程中的安全也非常有参考价值。
(1) IOC是什么
IOC就是依赖注入,控制反转。就是把对象的创建过程交给IOC容器(实际项目中是一个Map)去完成,开发者不需要考虑这个对象是怎么创建的。只需要在使用的时候根据该对象的唯一 id获取该对象,直接来进行使用。这样的使用过程减少了开发者的创建对象的过程可以使程序间降低无核心,提高可用性和重复使用性。
(2) IOC的优点
IOC的优点就是把对象的创建过程交给了应用程序去完成,如果是开发者直接去创建对象会产生非常多的对象保存在内存中。会降低系统的运行效率。并且这种方式降低了类与类之间的耦合。使用IOC容器获取Bean也对开发者来说使用起来更容易。并且在开发者测试、调试代码的时候更加容易。
(3) IOC的基本原理
IOC的基本原理是反射在该系统中 本系统中IOC的实现过程大致如下,首先扫描所有的系统的class文件,然后找出class文件的包名和类名,然后根据包名和类名反射来生成该类的对象,然后将该对象放进 IOC容器中。当需要使用该对象的时候只需要在该容器中获取可得。
在自定义的框架中 IOC的注入是通过注解的方式来进行配置的。 Spring框架中的依赖度是通过产品文件来进行配置。
IOC的核心源码:
在这里插入图片描述

(4) 该项目中如何运用了IOC
后端Spring框架使用的是配置文件的方式进行注入对象,这里不做过多的讲解。
自定义框架中使用的是注解的形式来进行依赖注入。
其基本原理如下:
扫描系统中所有的class文件,并且找到对应的包名和类名
根据包名和类名生成类对象
将生成的类对象放入到IOC容器中,实际为一个Map对象
系统加载类完成,连接Redis缓存
启动socker服务,等待请求
接收到请求,解析请求类型
根据请求类型,找到对应的对象,从IOC容器中获取
获取类对象,执行对应方法,返回结果

在实际的开发过程中,IOC实际还存在继承、循环依赖的问题,通过三层缓存的办法来进行解决。

自定义框架的AOP

(1) AOP是什么
AOP面向切面编程,简单来讲就是通过预编译的方式和运行期动态代理实现运过程中在执行该方法前后去执行额外的代码块。
(2) AOP的优点
AOP的出现,将代码与代码之间的耦合度进行了完全的降低,使我们可以在任意代码块之前,之后进行其他的业务操作。不但提高了程序的可用性,还降低了程序间的耦合性。
(3) AOP的基本原理
AOP的原理使动态代理。在该系统中使用了cglib动态代理,cglib动态代理就是根据当前类增强后生成该类的子类,并且在父类的基础上添加额外的功能。在系统获取该类进行执行方法的时候,会执行代理类也就是子类。动态代理的优势在于可以很方便的对代理类的函数进行统一的处理,而不用修改每个代理类中的方法。
(4) 该项目中如何运用了IOC
实现动态代理有两种方式JDK动态代理和CGLIB动态代理,两者的简单区别就是JDK动态代理的类必须实现了接口,而CGLIB不需要实现接口,但是CGLIB会加大系统开销,所以在Spring中两者都使用。
该框架只使用了CGLIB的动态代理,CGLIB代理的原理实际上是继承了该类,如果类需要代理,其方法必须是public修饰,否则子类无法实现正常代理。CGLIB是通过字节码技术创建这个类的子类,实现动态代理。根本原理是新建了一个class文件,是继承了被代理类,实现了对被代理类的增强
AOP核心代码如下:

毕设:基于Vue+Socket+Redis的分布式高并发防疫健康管理系统_第9张图片

Log日志

(1) 自定义系统运行日志的意义
Log4j是一款Java开源的优秀的日志框架,但是在二零二二年十一月二十四日阿里云团队发现了该日志框架一个严重漏洞。利用该漏洞可以执行远程的任意代码块。对中国的绝大部分有Java开发的企业,甚至全世界绝大多数的企业都有巨大的影响。甚至有部分公司因此遭遇勒索病毒。
由上可见,日系日志工具在系统建设中使用频繁,是开发者在构建系统过程中对系统是否正常运行的重要参照。并且,可以记录系统的运行状态,数据,逻辑判断等等。所以构建一个高效、安全的系统日志工具,十分有必要。
(2) 实际效果
Spring后端系统中和自定义框架中的日志工具有所不同。Spring后端系统的日志基本信息中仅包含日志类型(信息、警告、错误)和输出时间。自定义框架的系统则会根据当前类对象显示具体类路和其他日志信息。如图为实际的服务器运行日志:
毕设:基于Vue+Socket+Redis的分布式高并发防疫健康管理系统_第10张图片

服务器实际运行日志
(3) 原理
该项目中的日志原理较为简单,即创建或者打开以当前日期命名的txt文件。然后追加记录即可。核心代码如下:
毕设:基于Vue+Socket+Redis的分布式高并发防疫健康管理系统_第11张图片

系统安全

邮箱令牌认证
该项目的安全认证方式采用第三方邮箱令牌验证,即为用户注册时,需要使用一个邮箱绑定到当前的账户。
具体过程如下:
(1) 填写邮箱和其他基本信息后,点击获取令牌
(2) 系统查看当前填写信息是否符合要求,符合要求,用系统绑定的QQ邮箱账户对填写的邮箱账号发送邮件,其中包含令牌信息(时效为3分钟)。
(3) 用户邮箱接收到令牌后,在系统注册界面填写点击提交,填写的令牌和系统发送的一致,注册成功,否则失败。
MD5加密
该系统中对所有用户的密码进行了MD5加密。并且存储的也是加密后的密码。当系统校验当前用户的密码时,会首先对用户输入的密码进行加密,再使用加密后的密码和系统中存储的密码进行比对。
MD5加密可以防止敏感数据被篡改,在传输过程中如果一旦被串改,那么计算出的MD5值和原始值一定不同。并且计算MD5速度快,加密速度快,不需要密钥也是他的优点。
防止SQL注入
SQL注入是指软件系统对用户输入数据的数据没有进行任何的合法性检验或者过滤。攻击者可以在应用程序的查询语句中输入特殊字符或者额外的语句,导致原有的SQL语义发生转变,应用程序执行后,可能会导致在管理员不知情的情况下实现非法操作。可能导致当前用户越权登录系统,篡改系统相关内容甚至窃取重要信息。
该系统的解决方案是事先将未编译的SQL语句传入PreparedStatement对象中,要传入的参数使用?代替,那么该SQL语句会进行预编译,当前的SQL语句被编译后采用填入用户所输入的相关字符,即使用户输入的字符含有非法字符,也不会因为用户输入的非法字符导致语义发生转变,导致系统异常。而且使用PreparedStatement预编译可以提升执行性能。
具体SQL语句如下:
毕设:基于Vue+Socket+Redis的分布式高并发防疫健康管理系统_第12张图片

六、系统优点

拓展性强

系统的拓展性主要体现在以下几个方面:
(1) 前后端分离
前后端分离部署,理论上前端服务器可以没有限制地增加。只需要增加一个专门的前端负载均衡服务器,将访问前端的请求均匀地分配给各个前端服务器即可实现。无需开发,只需要修改个别的服务器配置即可。
(2) 后端服务器分布式部署
访问后端服务器,首先经过Nginx负载均衡服务器转发,重定向到后端服务器。后端服务器理论上无增加限制。每次增加了新的后端服务器,只需要在Nginx负载均衡服务器中添加新的服务器地址即可完成。无需开发,调试简单,配置方便。
传统的服务器拓展技术通常是提升服务器的物理处理器的性能或者服务器的磁盘容量。以及内存大小。这种方式受限于硬件技术。采用集群化的分布式部署可以将两台甚至多台的服务器部署到同一个集中环境中,可以将多台服务器的性能进行累加,所以在原理上是没有瓶颈限制。理论上可以无限提升服务器的性能。并且集群化的服务器的抗压能力更强,出现系统故障率更低,某个节点出现故障,只需要单独替换即可,不影响其他系统的正常工作。并且集群服务器还可以跟随系统的实际运行状态进行增加或者减少。可以根据用户的实际使用情况进行个性化调整。
(3) ShardedJedis
在选择连接Redis的客户端的时候,选用的ShardedJedis连接。即分布式Redis操作客户端。当系统访问量提高,单机Redis无法支持系统正常响应的时候,可以对ShardedJedis的集群中添加Redis服务器,只需要修改后端服务器的配置文件即可,重启服务器即可生效。

高负载量

系统的响应时间受多种因素的影响,包括网络带宽,操作系统状态,计算机硬件,甚至气温,天气的影响。
以下测试数据基于本地进行测试不考虑带宽,操作系统win10专业版、CPU 8代i7-8750u。
(1) 前端
如下图所示,前端系统进行了PC和手机端的分离部署,在系统载荷上有天然的优势。在本地测试不考虑网络带宽的情况下,完整加载前端页面仅需要680ms。
毕设:基于Vue+Socket+Redis的分布式高并发防疫健康管理系统_第13张图片

(2) 后端
如下图所示,仅仅使用Spring后端服务器,在1400个并发量的测试下,系统的异常率为1.79。并且系统的平均响应时间为531ms。最快响应时间为17ms,最慢响应时间2561ms。在系统运行响应时间的范围之内。

毕设:基于Vue+Socket+Redis的分布式高并发防疫健康管理系统_第14张图片

如下图所示,自定义框架后端服务器,在1400个并发量的测试下,系统的异常率为0.57。并且系统的平均响应时间为795ms。最快响应时间为28ms,最慢响应时间3108ms。在系统运行响应时间的范围之内。
毕设:基于Vue+Socket+Redis的分布式高并发防疫健康管理系统_第15张图片

如下图所示,Nginx作为负载均衡服务器,后端服务器为一台Spring框架服务器和一台自定义框架服务器集群部署后,在1400并发量的测试下,系统的异常率为0。并且系统的平均响应时间为692ms。最快响应时间为16ms,最慢响应时间6275ms。在系统运行响应时间的范围之内。出现个别的响应时间较长的原因是Nginx会判断当前集群服务器的负载量再去分发任务,导致个别请求响应时间较长。
并且该数据是基于一台电脑同时启动两台后端服务器,一台Nginx服务器,一条Redis服务器的情况下,在同一电脑再启动Jemeter测试工具测试所得。结果和预期差距较大。若服务器和测试机器不在同一机器运行,系统的平均响应时间将会更短,最大响应时间则有可能变大。
毕设:基于Vue+Socket+Redis的分布式高并发防疫健康管理系统_第16张图片

现实意义

(1) 易管理性
可使用集群管理的软件或者其他设备来管理集群系统的所有服务器资源和应用程序。并且集群技术将可以自动在集群中做到负荷均衡,最大程度上利用系统资源,提高系统响应速度,而这个过程不需要人工干预。
(2) 彻底解放前端
前端系统建设的时候,无需考虑当前页面的数据问题,只需要根据前后端约定的接口规范进行开发即可。能最大程度上解放前端页面因为后端数据的限制而造成的约束。
(3) 提高工作效率,分工更加明确
前端只关注前端的前台界面的相关内容,后台只关心后台的数据获取和推送,前后端可以同时进行。传统的前后端系统同时开发进度慢,并且开发效率低,前后端同时考虑也对开发者技术有一定的要求。
(4) 降低维护成本
前后端分离系统,当系统出现问题,我们需要首先观察是前端问题还是后端问题。知道了是前端还是后端的问题,只需要专门交给对应人员去寻找问题。只需要去关注前端或者后端不需要在前后端反复的寻找错误,这样开发效率将会更高,维护成本更低。
(5) 高内聚低耦合
减少后端(应用)服务器的并发/负载压力。
(6) 稳定性
即使后端服务没有响应或者甚至宕机了,前端页面这时候也可以正常访问。虽然无法正常展示数据,但是前台可以给用户相应的提示,提高用户使用体验。
(7) 个性化
可以根据使使用群体的数量来合理的购买相应的服务器硬件设备。不必造成资源的过度浪费。如果用户追求高并发高容量,高性能的需求也可以得到满足。

总结

系统建设遇到的困难

(1) 请求解析
因为该系统是前后端分离的系统,所以在前后端通信的时候需要发送请求。前后端通信均采用post请求,在进行请求解析的时候需要注意请求头以及请求参数的解析。在对请求进行解析的时候,出现了请求解析失败,请求头无法获取的情况。
(2) 跨域
前后端分离会出现跨域的问题。前端向后端发送请求的时候,前端可能会出现无法收到后端返回值的问题。所以需要对前端系统进行特殊的配置。
(3) 页面美化
由于本人倾向于后端开发,所以前端系统开发的时候有很多的界面美化问题和页面优化的问题。该项目均采用的是 element ui组件去进行前端页面的优化。
(4) 自定义框架的继承、循环依赖
后端的自定义框架系统中,IOC模块在进行系统建设的时候出现了继承失败和循环依赖的问题。其中循环依赖的问题尤为突出,该系统采用的是模拟spring的三层缓冲的办法来解决类与类之间产生的循环依赖的问题。
(5) 正式上线
在对项目进行实际线上部署的时候出现了自定义框架系统无法正确读取系统配置文件,无法正确读取系统相关class文件的问题。需要去手动调整系统相关配置文件到指定目录才能保证系统正常运行。在进行自定义框架系统初始化的时候,开发和项目实际部署是有区别的,是由于开发的时候自定义框架系统会读取编译器生成的class文件,但是实际部署的时候是通过打成jar包再去部署的。所以生产环境和测试环境的代码是有细微区别的。在部署生产环境的时候,自定义框架系统初始化文件需要从jar包中循环解析。
(6) 测试
在系统上线,部署到阿里云服务器完全启动后去测试系统性能,发现系统性能非常低。原因是由于资金有限,购买的云服务器性能非常低,带宽小,无法真正展示前后端分离系统、集群系统的性能。所以采用的是本地部署进行性能测试,但是在实际测试中发现由于计算机数量只有一台,所以当所有的服务器都启动在本地再进行系统性能测试,效果还是不够理想。是因为系统启动了多个服务器和需要占用系统资源较多的测试软件,系统负载较大,所以仍然无法得出确切的实际的系统性能。

系统优化点

由于毕业设计时间有限,在此次毕业设计中只能尽可能展示该项目的核心内容。该项目中以下的部分有待提高和改进:
前端优化点
(1) 系统界面样式单一,系统交互性较差
(2) Vue项目组件化程度低,可重用性不高
(3) 异常处理机制不够完善,出现前端系统未知异常可能出现页面无法正常响应
后端优化点
(1) 自定义服务器请求解析适配其他前后端分离系统需要改造
(2) 数据库表结构设计较为混乱,创建较多视图增加数据库服务器压力
(3) 数据库暂不支持集群部署,可能导致系统集群部署后数据库无法集群部署成为系统瓶颈,系统性能无法进一步提升
(4) 目前的分布式系统由于业务单一,一致性问题不突出,系统暂未考虑。当系统业务拓展后,需要引入分布式锁来解决一致性问题。如果需要则需要引入Redisson解决该问题。
(5) 该系统未考虑事务处理的问题。
总结语
本次毕业设计目的是设计并建设一个前后端分离的、后端系统分布式部署的系统。在总体设计阶段,前期的技术基础准备了较长时间,沉淀了一定的技术基础,应用工具较为熟悉。所以,系统建设过程中遇到的技术难题其实在早期的Demo测试中基本都得到了解决。
从技术层面来讲,该项目也是目前为止,本人参与整个系统构思和建设最为繁杂,庞大的项目。从前端的每个页面的搭建以及Vue框架的使用,包括页面之间的跳转,Vue路由的转发定向、Ajax通信等都该项目中都得到了大量的应用。同时,在前端的建设过程中也会遇到了很多问题,也使自己加深了对Vue框架的认知和理解。后端自定义框架的系统建设过程更是让我深入地了解了Spring框架的底层原理及其具体的实现过程。所以,对我今后去开发其他的框架是有非常重要的意义。

总之,这次毕业设计既是学校对我们大学四年毕业的要求,也是我们对自己大学所学的总结。虽然大学结束了,但这也是一个开始。在计算机领域,大学生涯所学仅仅是一个开始,今后作为开发者,要学习的东西还有很多。我们只有对自己有了更高的要求,才能作为动力不断取得新的成绩!

SpringCloud版本

架构图

毕设:基于Vue+Socket+Redis的分布式高并发防疫健康管理系统_第17张图片

后端分布式部署架构图

毕设:基于Vue+Socket+Redis的分布式高并发防疫健康管理系统_第18张图片

你可能感兴趣的:(spring,vue,Java,vue.js,redis)