2-1 说一下生成课表的业务流程
当点击马上学习或者报名的时候,先去数据库查询课程是否存在或者是否在有效期内,如果判断通过,就成功。
接下来就要保存对应的课表,在上述操作中涉及两个微服务,下单过程trade微服务调用了learning微服务,跨微服务调用,有两种方式,1.同步的feign,2.异步的mq。选取的原则是看是否需要返回值。
这里交易完成后,是trade交易微服务调用learning微服务。trade微服务不需要返回结果,只有查询才需要返回结果,所以这里使用异步的mq比较合适。
也就是说只要下单成功就投递一条消息到mq中,learning微服务监听mq,拿到投递到mq中的消息,把课程保存到课表中。即有两部分代码,一部分是在交易微服务中投递消息,一部分是在学习微服务中消费消息。
请求消息已经发过来了,我们要做的是接收,作为MQ的消费者,不是要写一个Controller,而是要写一个listener监听器,监听器需要写在学习微服务中(learning),因为是要在learning微服务中监听MQ保存课程到课表。
生成课表就是监听MQ的消息队列,接收到投递过来的消息后,对数据库进行一个新增操作,在这业务里,涉及到RabbitMQ,课表微服务及课程微服务。
首先,在课表微服务中实现监听RabbitMQ队列的功能,指定交换机名称和监听的队列。
然后,在我们接收到消息后,调用课表的业务层进行新增课表。
在新增课表时,需要调用课程微服务,根据课程ID获取课程的详细信息,并将我们需要的信息封装到实体类中,最后写入到数据库中。
2-2 说一下查询课表的业务流程
查询课表的业务使用到了课表微服务和课程微服务,根据课程ID查询出课程细腻,封装后进行返回。
首先,在课程微服务中根据当前用户ID进行分页查询,获取我们需要返回的结果。
然后,通过stream流把查询到的所有课程ID收集起来,通过调用课程微服务,获取课程信息的集合。
接下来,将获取到的信息集合转为map对象,并对分页查询的结果进行遍历,从map对象中获取课程信息封装到VO对象中,并对列表中的数据进行替换。
最后返回封装好的list集合。
2-3 说一下查询最近学习章节的业务流程
在我们的项目中,查询最近学习的章节使用了两个微服务、三张表,分别是 课程微服务 的 课程表 和 章节目录表 以及 课表微服务 的 课表。
首先,当浏览器查询的请求发过来后,从课程表中查询,设置业务条件(登录用户id,并且以最后一次学习时间倒序排列),执行查询。
虽然最近学习章节只会查询一个结果,但是由于返回结果VO中需要该用户课表的数量,为了提高性能,少从数据库查一次数量,所以这里查询该用户的所有课程,取第一个。
然后调用 课程表 对应的feign接口和 章节目录表 对应的feign接口,补充数据。
最后返回结果。
这就是我在项目中查询最近学习章节的业务流程。