????????首先我们模拟一个基于微服务架构的在线教育项目,旨在搭建一个面向成年人的非学历职业技能培训平台。
????????作为一个B2C(Business to Customer,企业对客户)类型的教育相关项目,需要具有两个端:
????????并且需要·基于RabbitMQ实现微服务之间的异步调用。
今天我们针对用户端的课表相关模块进行业务功能流程梳理。
? ? ? ? 一般来说课表更加强调的是:某位用户对某个课程的拥有,和用户之间有一个多对多的关系,而反映这个关系的中间表就是用户课程表,当然这个中间表中除了记录多对多关系意外,还应该具有很多其它的字段,比如:有效期限、学习进度等等。
????????首先,我们进行基础环境的准备工作。先用Mysql将课程数据导入到本地DataBase中。接着使用MyBatisPlus逆向工程根据数据库表来生成对应的三层架构及实体类。
????????接下来用户完成课程购买后,我们添加课表的监听器,交易服务中用户下单完成后,会投递消息到mq,在此处接收消息,参数校验无误后,调用service接口及其serviceImpl实现类中的保存方法。
????????在实现类中的保存方法编写时,先将用户购买的课程遍历保存成课表,再调用课程微服务去根据课程id查询课程信息(主键集合)。创建课程对象,根据查询到的课程信息,进行对应字段的赋值。这里推荐用stream流进行结果的收集成一张新课程List。最后调用批量保存功能saveBatch进行保存。
????????在这个项目中,查询课表涉及到了两个微服务,课表微服务和课程微服务。
????????首先,当浏览器查询的请求发过来后,从课程表中查询,设置分页条件(分页需要的参数),设置业务条件(登录用户Id和课程id,并且以最后一次学习时间倒序排列),执行查询
????????由于返回结果不是课表的实体类而是一个vo,vo里包含课程的一些信息,于是我使用feign远程调用课程微服务,为了提高性能,我将feign远程调用写在循环之外,为了方便使用课程的信息,我将远程调用的结果(list)通过stream流转成了map(键是课程的id,值是课程对象)。
????????最后组装结果,发返回数据。
????????在这个项目中,查询最近用户学习章节使用了两个微服务,三张表,分别是课程微服务的课程表和章节目录表,以及课表微服务的课表。
????????首先,当浏览器查询的请求发过来后,从课程表中查询,设置业务条件(登录用户Id,并且以最后一次学习时间倒序排列),执行查询,虽然最近学习章节只会查询一个结果,但由于返回结果vo中需要该用户课表的数量,为了提高性能,少从数据库查一次数量,所以这里查询该用户的所有课,取第一个。
????????然后调用而课程表对应的feign接口和章节目录表对应的feign接口,补充数据。
????????最后返回结果。