学成在线项目流程图
2024-06-22 13:12:08 0 举报
登录查看完整内容
学成在线项目流程图是一个清晰展示项目开发流程的视觉工具,旨在帮助团队理解和跟踪项目的各个阶段。这个流程图可能包括多个环节,如图纸设计、前端开发、后端开发、测试和部署等。每个环节都可能涉及不同类型的文件,如图纸可能包括.jpg或.png格式的设计稿,前端开发可能涉及.html、.css、.js等文件,后端开发可能涉及.php、.net或.py等文件。此外,这个流程图也可能包含一些修饰语,如“已完成”、“进行中”或“待办”,以表明项目的当前状态。总的来说,学成在线项目流程图是一个多功能的工具,可以帮助团队更好地协作和沟通,确保项目按计划进行。
作者其他创作
大纲/内容
Redisson实现分布式锁
...
JSR303校验框架依赖spring-boot-starter-validation异常处理需要的依赖spring-webspring-boot-starter-log4j2swagger依赖
异常枚举类CommonError
Minio
xxl-job执行器Bean
定时调度扫描消息表获取任务
bootstarp.ymlnacos注册服务swagger配置端口63040
实现分布式锁的方案有很多,常用的如下:1、基于数据库实现分布锁利用数据库主键唯一性的特点,或利用数据库唯一索引、行级锁的特点,比如:多个线程同时向数据库插入主键相同的同一条记录,谁插入成功谁就获取锁,多个线程同时去更新相同的记录,谁更新成功谁就抢到锁。2、基于redis实现锁redis提供了分布式锁的实现方案,比如:SETNX、set nx、redisson等。拿SETNX举例说明,SETNX命令的工作过程是去set一个不存在的key,多个线程去设置同一个key只会有一个线程设置成功,设置成功的的线程拿到锁。3、使用zookeeper实现zookeeper是一个分布式协调服务,主要解决分布式程序之间的同步的问题。zookeeper的结构类似的文件目录,多线程向zookeeper创建一个子目录(节点)只会有一个创建成功,利用此特点可以实现分布式锁,谁创建该结点成功谁就获得锁。
降级在@FeignClient注解中指定fallbackFactory@FeignClient (value = \"media-api\
bootstarp.yml从nacos中获取mysql地址,只获取配置不用注册服务
处理完成上传文件
mapper
1、xxl-job的工作原理是什么? xxl-job是什么怎么工作?XXL-JOB分布式任务调度服务由调用中心和执行器组成,调用中心负责按任务调度策略向执行器下发任务,执行器负责接收任务执行任务。1)首先部署并启动xxl-job调度中心。(一个java工程)2)首先在微服务添加xxl-job依赖,在微服务中配置执行器3)启动微服务,执行器向调度中心上报自己。4)在微服务中写一个任务方法并用xxl-job的注解去标记执行任务的方法名称。5)在调度中心配置任务调度策略,调度策略就是每隔多长时间执行还是在每天或每月的固定时间去执行,比如每天0点执行,或每隔1小时执行一次等。6)在调度中心启动任务。7)调度中心根据任务调度策略,到达时间就开始下发任务给执行器。8)执行器收到任务就开始执行任务。
媒资管理MySQL每个图片视频的信息机构、上传人、md5、文件路径等文件上传成功后再添加到表里业务方法要加事物注解
视频上传
调度中心
字典-微服务的IP:端口
项目介绍
课程发布的执行流程
model模型类模块
Elasticsearch存储、计算、搜索数据
Redis缓存
Minio客户端MinioClient - Bean
文件处理任务2
分布式事务同时成功,或者同时失败
成功返回结果
什么情况Spring事务会失效1)在方法中捕获异常没有抛出去2)非事务方法调用事务方法3)事务方法内部调用事务方法4)@Transactional标记的方法不是public5)抛出的异常与rollbackFor指定的异常不匹配,默认rollbackFor指定的异常为RuntimeException6)数据库表不支持事务,比如MySQL的MyISAM7)Spring的传播行为导致事务失效,比如: PROPAGATION_NEVER、PROPAGATION_NOT_SUPPORTEDPROPAGATION_REQUIRED --支持当前事务,如果当前没有事务,就新建一个事务。这是最常见的选择。PROPAGATION_SUPPORTS --支持当前事务,如果当前没有事务,就以非事务方式执行。 PROPAGATION_MANDATORY --支持当前事务,如果当前没有事务,就抛出异常。PROPAGATION_REQUIRES_NEW --新建事务,如果当前存在事务,把当前事务挂起。PROPAGATION_NOT_SUPPORTED --以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。PROPAGATION_NEVER --以非事务方式执行,如果当前存在事务,则抛出异常。PROPAGATION_NESTED --如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则与PROPAGATION_REQUIRED类似的操作。
mapper接口xml映射sql
降级处理
Feign
媒资DB
api接口模块
分片广播
微服务system前端模块数据字典
上传
熔断后的处理方法
Message SDK
配置中心
pom.xml文件
断点续传 - 把块文件合并1. 定义分块文件的目录,File chunkFolder = new File(\"分块文件目录\")2. 定义要合并的文件,File morgeFile = new File(\"合并文件的路径.mp4\")3. 取出所有的分块文件 File[] files = chunkFolder.listFiles();4. 对数组中的分块文件排序然后再合并,顺序错误会出错5. 把数组转成list,因为要用Collertions的工具类List<file> filesList = Arrays.asList(files)span style=\"font-size: inherit;\
视频id与执行器总数取模,与当前执行器分片序号一致执行任务。取任务的时候用乐观锁来取,防止任务被重复执行,保证幂等性
bootstarp.ymlnacos注册服务swagger配置端口63110
XXL-JOB任务调度中心
熔断是当下游服务异常时一种保护系统的手段降级是熔断后上游服务处理熔断的方法。
路由到其它微服务Feign调用
Kibana可视化工具
媒资服务
注册中心
分片广播,如何保证任务不重复执行调度中心创建任务的时候下面有高级配置 - 调度过期策略 - 忽略。过期了就算没执行也不去执行。阻塞处理策略 - 丢弃。意思是还没处理完又来了,就把后来的任务丢弃。
执行器
依赖
继承
api接口模块GET POST PUT DELETE
课程索引信息
响应用户的统一类型RestErrorResponse里面就一个String类型的属性
Minio-server
视频信息表
xxl - job任务调度中心
用户上传视频源文件到Minio服务器
Fallback
从数据库取出的任务
Nacos
发出请求
执行器 0
媒资-微服务的IP:端口
MybatisPlus拦截器
返回异常信息
service接口serviceImpl
①本地事务存储课程发布表存储消息表
bootstrap.yml配置文件
generator代码生成器
搜索服务
Elasticsearch
文件处理任务1
po类自动生成
发布课成功程后1. 把预发布表的数据写入课程发布表2. 然后向消息表写数据 就是用SDK包里对消息表增删改查的方法写消息而已
添加sdk依赖(封装了消息表的增删改查)用本地消息sdk表+任务调度完成分布式事务控制AP模式课程发布的最终一致性
内容管理服务
统一的nacos配置
桶mediafiles
bootstarp.ymlnacos注册服务swagger配置
Nginx缓存前端静态页面
任务调度服务
视频上传成功后记录文件分块信息文件合并处理记录待处理视频信息
parent模块依赖版本管理通用依赖
定义全局异常处理器加注解@ControllerAdvice方法返回RestErrorResponse方法要加注解@ResponseBody @ExceptionHandler(XueChengPlusException.class) @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
#{} 是占位符,SQL语句中的,入参前面要加@param注解value=占位符${} 是拼接字符串@PathVariable 接url中的参数@RequestParam 就是把请求中的指定名称的参数传递给控制器中的形参赋值@RequestBody 就是把请求中的json字符串参数传递给控制器中的形参赋值@ResponseBody 把对象转成json字符串返回前端@RestControler 可以响应json@Controller 可以响应页面@RequestMapping(\"/open\") 设置当前接口类的根路径
自定义异常类继承RunTimeException自定义方法入参是CommonError枚举类抛出异常信息
视频待处理表
Freemarker依赖org.springframework.bootspring-boot-starter-freemarker
图片上传
po类
MinIo分布式文件服务器先创建bucket桶,然后往桶里添加文件,可以是目录的存放例如:2023/03/29/1.avi 这样存放
在视频任务处理表Mapper自定义个Mapper修改任务状态的语句,返回影响的行数,谁修改了谁就处理这个任务,防止任务被重复执行(Mysql乐观锁)
统一异常处理1.对异常信息进行处理⒉取出异常具体信息3.以固定格式返回json数据
前端用户
service业务模块
课程-微服务的IP:端口
bootstrap.yml配置文件获取数据库ip端口
取出待处理视频任务记录视频处理结果
2.2
Redis
bootstarp.yml1. 配置nacos地址和端口2. 读取nacos配置端口63010读取路由配置、读取服务列表
文件信息表
执行器的名字Appname要在nacos中配置地址的时候一起配置执行器运行模式选择Bean,Jobhandle填方法上面的@XXL-JOB注解的value启动任务即可
freemaker模板引擎技术返回html静态页面@Contorller
总项目模块(聚合模块)
执行器执行任务的时候用乐观锁来执行先把数据库任务执行字段改成处理中才能执行,不然就是别的执行器已经在处理了。
service接口impl实现类
dto类
视频处理调度
2.1
调度中心如何把任务下发给多个人调度中心创建任务的时候下面有高级配置 - 路由span style=\"font-size: inherit;\
任务幂等性如何保证?它描述了一次和多次请求某一个资源对于资源本身应该具有同样的结果。幂等性是为了解决重复提交问题,比如:恶意刷单,重复支付等。解决幂等性常用的方案:1)数据库约束,比如:唯一索引,主键。同一个主键不可能两次都插入成功。2)乐观锁,常用于数据库,更新数据时根据乐观锁状态去更新。3) 唯一序列号,请求前生成唯一的序列号,携带序列号去请求,执行时在redis记录该序列号表示以该序列号的请求执行过了,如果相同的序列号再次来执行说明是重复执行。这里我们在数据库视频处理表中添加处理状态字段,视频处理完成更新状态为完成,执行视频处理前判断状态是否完成,如果完成则不再处理。
base基础模块
jobhandle包
课程静态化1. 生成静态化页面2. 上传到Minio服务器
使用FreeMarkerTemplateUtils的方法(静态页面模板,页面数据),就能生成静态页面
Beats数据抓取
视频转码流程图
Sawgger 接口文档1. POM加swagger依赖2. 在启动类上面加@EnableSwagger2Doc注解3. bootstrap.yml文件配置接口类所在的包路径4. 浏览器访问 http://localhost:63050/media/swagger-ui.html
Fegin调用其它微服务完成消息表的任务
数据库
熔断
Fegin
sdk消息表
负载均衡到网关
注意!!!使用Fegin调用的时候,要创建span style=\
2.3
下载待处理文件
1. 先查数据库是否存在,不存在直接上传,再查Minio是否存在,不存在直接上传2. 上传之前先查Minio是否有分块,有的话接着上传,没有的话直接上传分块3. 上传完分块开始合并4. 合并完后校验MD5值5. 保存文件信息到数据库6. 清理分块文件
Feign依赖
Utils定义了一个工具类Utils,抽取了很多公用的方法,例如给地址获取到扩展名给文件获取到md5值
全局时间格式统一管理
JSR303校验接口入参加@Validated(ValidationGroups.Update.class)
分布式事务
feginClient
1. 检查文件是否存在2. 检查分块是否存在3. 上传视频4. 视频上传成功后 (1) 更新文件的数据库信息、 (2) 并向数据库添加待处理视频任务
Search
解决幂等性常见方案1)数据库约束:比如:唯一索引,主键。2)乐观锁:常用于数据库,更新数据时根据乐观锁状态去更新。3)唯一序列号(Token):操作传递一个唯一序列号,操作时判断与该序列号相等则执行。基于以上分析,这里我们在数据库视频处理表中添加处理状态字段,视频处理完成更新状态为完成,执行视频处理前判断状态是否完成,如果完成则不再处理。
内容管理模块
持久层 - MybatisPlus
内容管理MySQL
cortraller
1. parent模块添加minio接口依赖2. service添加minio和okhttp依赖3. 登录到minio服务器创建桶,然后设置桶的访问权限是public4. 创建MinioClient对象,给它minio服务地址ip、用户名、密码(minio服务器地址ip、用户名、密码用@Value注解从nacos中注入)5. 创建minio上传文件的对象uploadObjectArgs,指定上传桶的名字、文件的路径、上传到服务器的文件名、媒体文件类型(媒体文件类型可以引用simplemagic依赖,ContentInfoUtil.findExtensionMatcht(\".mp4\")快速获取)。6. 调用MinioClient对象的uploadObject方法,把uploadObjectArgs对象放进去7. 删除操作就是调用MinioClient对象的removeObject方法,把removeObjectArgs对象放进去(Args对象指定哪个桶和文件名即可)8.查询文件,就是从minio中下载文件调用MinioClient对象的getObject方法,把getObjectArgs对象放进去(Args对象指定哪个桶和文件名即可.2020/03/29/1.avispan style=\"font-size: inherit;\
Utils工具类封装每个模块的通用工具类例如返回md5值之类
分片广播,如何保证不重复查询任务每个执行器有序号,从0开始每个任务也有序号拿任务的序号除以执行器的总数取模即可,余数是几就几号执行器执行
处理完成保存视频信息
2.4
设置熔断
Swagger接口文档JSR303校验接口bootstarp.yml配置文件
http-client代替PostmanGET等请求用法
媒资管理模块
②
异常抛出
熔断项目使用Hystrix框架实现熔断、降级处理,在Nacos中feign-dev.yaml中配置
传输类的属性加JSR303校验的注解
注册发现
异常捕获处理
依赖base模块
启动类
下发任务1. 创建一个任务类,指定是Spring的Bean (加@Component注解)2. 写个方法,要加@Xxljob注解,value = 任务名称,方法里写任务逻辑3. 后台调度中心 - 任务管理 - 新增任务。jobHandler指定任务名称4. 启动任务。后台调度中心 选择任务 操作 - 启动
Jenkins pipekine上传git - 自动编译 - 打包 - 发布docker镜像 - 拉取镜像 - 自动部署
Nginxwww.51xuecheng.cn/api缓存网页CSS样式请求都转发到网关
读取配置
自动生成
网关
①
课程缓存信息
数据库地址密码
分页模型
在MySQL中有两张表记录了需要执行的任务然后封装了操作表的CRUD方法配合XXL-JOB完成分布式任务调度
LogStash数据抓取
执行器 1
Redis依赖
微服务媒资管理模块
压力测试 - Jmeter软件
数据字典MySQL
config分页拦截器
任务调度中心把Minio中的视频文件都转成mp4格式
课程静态页面
课程发布表
Fegin使用Fegin调用Redis、Elatsicserch、Minio服务器,写入数据。1. 导入Fegin依赖2. 创建个接口,接口要加@FeginClient(value = \"media-api\
断点续传 - 将文件拆分块1. 定义源文件路径,File sourceFile = new File(\"上传文件路径.mp4\")2. 定义存储分开的文件夹 File chunkFolder = new File(\"存储分开的目录\")3. 定义块的大小为5M, int chunkSize = 1024*1024*54. 定义块的个数,int chunkSize = (int) Math.ceil(sourceFle.lenth() *1.0 / chunkSize ) 向上取整然后强转为int5. 使用流从源文件读取,然后写入分块文件 RandomAccessiFile raf_r = new RandomAccessiFilespan style=\"font-size: inherit;\
桶video
config
课程发布
generator代码生成模块MybatisPlus
微服务业务模块
微服务网关getway根据路由规则拦截例如/content开头的资源转到下其它微服务
0 条评论
回复 删除
下一页