项目介绍
云学习网络课堂系统 Cloud Online Learning System
公司自己研发语言云学习网络课堂系统, 能够提供多语种语言培训等相关课程[英语等级培训,雅思培训,BEC商务英语培训]。
本项目分为三个端: 客户端, 机构端, 运营端。采用B2B2C的业务模式。机构端可以在平台入驻,发布课程,我们公司作为运营方对机构端发布的课程进行审核,审核通过即发布成功。
本项目是前后端分离的架构, 后端采用SpringBoot、Spring Cloud进行开发, 数据库使用MySQL和Redis,RabbitMQ和MinIO分布式文件系统。
我在这个项目负责 机构端:内容管理、媒资管理、权限管理的设计与开发。 内容管理: 如果培训机构要发布一门课程,需要填写课程基本信息,营销信息,师资信息提供给运营方审核,一般24小时通过,这里采用了分布式事务进行开发,就是课程发布需要将课程信息存入数据库,并且存入redis缓存,同时要将课程文件存入分布式文件系统。 媒资管理Media Asset Management: 媒体资源查询, 视频的处理上传; 文件上传; 文件删除 客户端: 选课管理、权限管理、订单支付模块。 选课管理: 课程分为免费和收费,免费课程用户点击添加课程后可直接插入我的课程表,如果是付费课程,则需经过订单支付微服务,支付成功后更新订单状态,通过消息队列通知选课服务添加课程到我的课程表。 订单支付: 选课以后生成二维码,用户进行扫码支付,支付完成以后生成支付订单。
稳定性治理Ensure the Stability
保证服务高可用【high availability】 服务可能使用很多中间件,所以在项目启动以后可能会出现故障,所以要保证服务依旧可用
权限管理:详见Spring Security
Spring Security
我这个项目使用Spring Security进行用户登录授权认证,用户认证就是判断改用户是否合法,用户授权就是判断用户是否有权限进行某个操作。
我具体实现的流程是这样:
Spring Security 本质就是过滤器链,
登陆的时候,通过一个AuthenticationManager类调用我们通过自定义UserDetailService里面的loadUserByUsername来查询数据库比对用户返回UserDetails,然后生成jwt Token存入redis并且响应给前端。
我们配置了一个jwt token过滤器,用户访问接口的时候会使用redis校验token的合法性, 同时这个过滤器来获取用户的授权信息,通过SecurityContextHolder上下文封装到authentication
Spring Security中会使用默认的FilterSecurityInterceptor 获取authentication来进行权限校验。在项目开发中我们会依据Role-based Access Control角色权限控制模型来设计数据库,这个模型的好处在于给不同的用户提供不同的角色,不同的角色会有不同的Authority, 在Controller层@PreAuthorize注解会根据数据库中Authority来判断是否符合接口的Authority。
还可以说: 跨域问题; CRSF (Cross-Site Request Forgery)
高并发解决超卖问题
因为并发量高,每个线程都要去查是否有库存,然后再进行减库存的操作。
这样会导致,查完库存会有库存,减库存的时候就没有库存,要保证原子操作。