源码网址:https://github.com/PAcee1/xcEduService,原型是腾讯课堂。
## 项目工程目录介绍
- xc-framework-common:公共类存放,比如exception处理类,intercept拦截器等
- xc-framework-model:存放实体
- xc-framework-parent:所有工程父工程,依赖管理
- xc-framework-utils:Utils类
- xc-govern-center:注册中心
- xc-govern-gateway:Zuul网关
- xc-service-api:Api接口,生成Swagger
- xc-service-base-filesystem:文件上传到FDFS
- xc-service-learning:学习中心,获取视频播放路径,添加学生课程等
- xc-service-manage-cms:CMS管理
- xc-service-manage-cms-client:CMS的RabbitMQ客户端,用来页面发布页面预览
- xc-service-manage-course:课程管理
- xc-service-manage-media:媒资管理
- xc-service-manage-media-processor:视频处理工程
- xc-service-manage-order:订单管理
- xc-service-search:ElasticSearch搜索
- xc-service-ucenter:用户中心
- xc-service-ucenter-auth:SpringSecurity认证授权
- xc-resources:存放配置文件,不在Maven管理中,只是一个文件夹
这里关注的是服务,主要有下面几个
(1)CMS管理(xc-service-manage-cms,xc-service-manage-cms-client):页面增删改查,页面预览,页面发布
前端请求cms执行页面发布。
cms执行静态化程序生成html文件。(xc-service-manage-cms)
cms将html文件存储到GridFS中。
cms向MQ发送页面发布消息。
MQ将页面发布消息通知给Cms Client。(xc-service-manage-cms-client)
Cms Client从GridFS中下载html文件。
Cms Client将html保存到所在服务器指定目录。
(2)课程管理(xc-service-manage-course ):课程增删改查,课程计划增删改查,课程营销信息,课程图片上传删除,课程发布,课程预览
课程发布时候,把相关信息加入Elasticsearch。
另外,通过注解@FeignClient,使用本地Java API的方式调用上面CMS管理的Restful接口
@FeignClient(value = XcServiceList.XC_SERVICE_MANAGE_CMS)
public interface CmsPageClient {
// 根据id查询页面,Feign远程调用
@GetMapping("/cms/page/get/{id}")
CmsPage findCmsPageById(@PathVariable("id") String id);
// 保存课程到CMSPage
@PostMapping("/cms/page/save")
CmsPageResult saveCmsPage(@RequestBody CmsPage cmsPage);
// 一键发布课程
@PostMapping("/cms/page/publishPageQuick")
CmsPublishPageResult publishPageQuick(@RequestBody CmsPage cmsPage);
}
(3)课程搜索(xc-service-search): ES查询
(3.1)根据 名字,培训计划,描述和一些条件过滤搜索课程。
(3.2)根据课程id获得视频地址
(4)媒资管理(xc-service-manage-media):
每个教学机构都可以在媒资系统管理自己的教学资源,包括:视频、教案等文件。目前媒资管理的主要管理对象是课程录播视频,包括:媒资文件的查询、视频上传、视频删除、视频处理等。
媒资查询:教学机构查询自己所拥有的媒体文件。
视频上传:将用户线下录制的教学视频上传到媒资系统。
视频处理:视频上传成功,系统自动对视频进行编码处理。
视频删除:如果该视频已不再使用,可以从媒资系统删除。
媒资与课程id关联后 ,同时通过logtash 将关联信息导入到ES。
xc-service-manage-media 视频处理发送方,xc-service-manage-media-processor 视频处理接收方 (avi转m3u8,mp4)
视频处理进程的任务是接收视频处理消息进行视频处理,业务流程如下:
1. 监听MQ,接收视频处理消息。
2. 进行视频处理。
3. 向数据库写入视频处理结果
(5)学习中心(xc-service-learning):视频播放,课程计划查询,动态获取视频地址
根据课程id获得视频地址 ,实际调用的(3.2)的接口
@FeignClient(value = XcServiceList.XC_SERVICE_SEARCH,path = "/search/course")
public interface CourseSearchClient {
@GetMapping("/getmedia/{teachplanId}")
public TeachplanMediaPub getmedia(@PathVariable("teachplanId") String teachplanId);
}
(6)认证中心(xc-service-ucenter-auth):登录,登出,查询JWT用户信息,权限校验管理,
执行流程:
用户登录,请求认证服务 认证服务认证通过,生成jwt令牌,将jwt令牌及相关信息写入Redis,并且将身份令牌写入cookie 用户访问资源页面,带着cookie到网关 网关从cookie获取token,并查询Redis校验token,如果token不存在则拒绝访问,否则放行 。
用户退出,请求认证服务,清除redis中的token,并且删除cookie中的token 使用redis存储用户的身份令牌有以下作用:
实现用户退出注销功能,服务端清除令牌后,即使客户端请求携带token也是无效的。 由于jwt令牌过长,不宜存储在cookie中,所以将jwt令牌存储在redis,由客户端请求服务端获取并在客户端存 储。
(7)Zuul网关路由(xc-govern-gateway):
LoginFilter extends ZuulFilter{
public Object run() throws ZuulException {
// 从Cookie取jti令牌
// 不存在拒绝访问
// 从Redis取过期时间
// 不存在拒绝访问
// 从请求头取令牌
// 验证出错拒绝访问
}
}
(8)订单服务(xc-service-manage-order):
支付成功后自动添加选课(演示基于MQ的分布式事务)
定时任务处理选课任务,发送消息前当前任务表添加记录,历史表添加一个操作记录。
收到消息后当前任务表删除任务记录,同时历史表添加一个操作记录
综上所述,这里涉及的服务间通信方式是MQ或FeignClient。