|
@@ -2,11 +2,19 @@
|
|
|
|
|
|
项目流程图:https://kdocs.cn/join/ggtrrmn?f=101
|
|
|
|
|
|
-#### 1. 采用腾讯内容安全对文本,图片,音视频进行审核,确保内容安全前提下通过Kafka异步进行发布专辑/声音到索引库库ElasticSearch
|
|
|
+- MySQL
|
|
|
+- Redis
|
|
|
+- JVM
|
|
|
+- JUC
|
|
|
+- RabbitMQ
|
|
|
+- 框架
|
|
|
+- 项目
|
|
|
+
|
|
|
+#### 1. 采用腾讯内容安全对文本,图片,音视频进行审核,确保内容安全前提下通过MQ异步进行发布专辑到ElasticSearch索引库
|
|
|
|
|
|
**业务背景**:
|
|
|
|
|
|
-数据表:专辑表、专辑统计信息表、分类(1,2,3分类)、专辑标签关系表、标签表、标签值表、声音表、声音统计信息表。【金山文档 | WPS云文档】 3、数据表结构
|
|
|
+数据表:专辑表、专辑统计信息表、分类(1,2,3分类)、专辑标签关系表、标签表、标签值表、声音表、声音统计信息表。 3、数据表结构
|
|
|
|
|
|
内容创作者**/**听书运营人员 新增保存专辑,需要填写专辑相关信息:1.专辑标题 2.上传专辑封面(上传到MInIO) 3.专辑简介(PC端有富文本编辑器) 4.所属分类 5.专辑标签 6.专辑付费类型等(付费类型、价格类型,折扣) 点击提交保存专辑,对专辑中文本,图片调用**腾讯云内容安全接口**进行内容安全审核。审核通过后才能保存/发布专辑。 专辑被编辑前要求将专辑先下架,编辑内容后再次进行审核,审核通过后才能进行再次上架处理。
|
|
|
|
|
@@ -14,28 +22,27 @@
|
|
|
|
|
|
- 内容安全方案(腾讯云)
|
|
|
|
|
|
- - 问题:<a href="https://console.cloud.tencent.com/api/explorer?Product=tms&Version=2020-12-29&Action=TextModeration">文本(请求参数内容文本Base64编码)</a>,图片(使用Hutool工具类Base64编码)可以同步审核,立即获取审核结果,但是音频审核只提供异步审核,保存声音业务中,上传音频文件,得到音频文件详情,发起审核任务(得到审核任务ID,关联声音记录-更新声音表审核任务ID),但审核结果不确定审核结束时间。采用分布式定时任务框架**xxl-job、powerJob**开启定时任务(避免超过查询审核结果腾讯QPS,限制每次查询声音数量),检查处于待审核状态声音对应审核任务结果,根据审核任务结果更新声音审核状态,在门户专辑详情页面,只有经过审核声音才能出现在声音列表中。
|
|
|
-
|
|
|
-- RabbitMQ异步进行发布专辑
|
|
|
+ - 问题:<a href="https://console.cloud.tencent.com/api/explorer?Product=tms&Version=2020-12-29&Action=TextModeration">文本(请求参数内容文本Base64编码)</a>,图片(使用Hutool工具类Base64编码)文本图片相对于音视频较小,采用同步审核,立即获取审核结果,但是音频审核只提供异步审核,保存声音业务中,上传音频文件,得到音频文件详情,发起审核任务(得到审核任务ID,关联声音记录-更新声音表审核任务ID),但审核结果不确定审核结束时间。采用分布式定时任务框架**xxl-job、powerJob**开启定时任务(避免超过查询审核结果腾讯QPS,限制每次查询声音数量),检查处于待审核状态声音对应审核任务结果,根据审核任务结果更新声音审核状态,在门户前端专辑详情页面,只有经过审核声音才能出现在声音列表中。通过审核后采用RabbitMQ发布专辑到索引库
|
|
|
|
|
|
+ - RabbitMQ异步进行发布专辑
|
|
|
- 生产者(专辑服务)
|
|
|
|
|
|
- 当内容经过审核,使用**RabbitTemplate**对象发送上架消息(审核通过**专辑ID**)到专辑交换机
|
|
|
|
|
|
- 消费者(搜索服务)
|
|
|
|
|
|
- - 监听上架话题,获取专辑ID,封装专辑对应各项数据-专辑索引对象(1.专辑信息、2.分类信息、 3.主播信息 、 4.统计信息 对应是4个OpenFeign接口调用,**采用线程池+异步任务**),将索引库对象存入专辑索引库、将专辑标题存入提词索引库(搜索自动联想功能)、将专辑ID存入布隆过滤器(初始化)
|
|
|
+ - 监听专辑上架队列,获取专辑ID,封装专辑对应各项数据-专辑索引对象(1.专辑信息、2.分类信息、 3.主播信息 、 4.统计信息 对应是4个OpenFeign接口调用,**采用线程池+异步任务**),将索引库对象存入专辑索引库、将专辑标题存入提词索引库(搜索自动联想功能)、将专辑ID存入布隆过滤器(前提:初始化完成)
|
|
|
|
|
|
- 问题:确保消息可靠(不丢失)、幂等性(ES新增文档处理)
|
|
|
|
|
|
- 分析业务是否需要可靠
|
|
|
- - 分析消费者端是否需要进行幂等性处理
|
|
|
-
|
|
|
+ - 分析消费者端是否需要进行幂等性处理
|
|
|
+
|
|
|
- 腾讯云点播
|
|
|
|
|
|
- 优势:云点播(Video on Demand,VOD)面向音视频、图片等媒体,提供制作上传、存储、**转码**、媒体处理、**媒体 AI**、**加速分发播放**、**版权保护**等一体化高品质媒体服务。
|
|
|
|
|
|
- - 问题:声音源文件防盗 结论:无法百分比确保被盗
|
|
|
+ - 问题:声音源文件防盗 结论:无法百分比确保安全
|
|
|
|
|
|
- 启用防盗链:登录 [云点播控制台](https://console.cloud.tencent.com/vod/app-manage),
|
|
|
|
|
@@ -43,13 +50,13 @@
|
|
|
|
|
|
2. 进入**访问控制**菜单栏,开启 “Referer 防盗链”,“防盗链类型”选择“**白名单**”,文本框中输入允许播放视频的站点域名列表,单击**确定。**
|
|
|
|
|
|
- 3. 打开 “Key 防盗链”,输入或随机生成防盗链 Key,单击**确定**。
|
|
|
+ 3. 如果是视频,开启 “Key 防盗链”,输入或随机生成防盗链 Key,单击**确定**。
|
|
|
|
|
|
此时,已为域名开启了 Referer 防盗链和 Key 防盗链.
|
|
|
|
|
|
-
|
|
|
+
|
|
|
|
|
|
-#### 2. 采用自定义Token机制实现单点登录(基于微信登录),令牌自动续期,自定义注解验证认证状态
|
|
|
+#### 2. 采用自定义Token机制实现单点登录,令牌自动续期,自定义注解验证认证状态
|
|
|
|
|
|
微服务架构下**会话保持**,传统/单体项目cookie+session(会话)服务端通过Session对象存放用户信息,写会SessionID到Cookie中(JsessionID)Cookie自动提交,服务端根据JsessionID查询服务端Session对象(默认30分钟),包含用户信息。Session未查到到说明用户已退出系统。
|
|
|
|
|
@@ -60,13 +67,13 @@
|
|
|
|
|
|
**背景:**
|
|
|
|
|
|
-客户端端有PC端,APP端,小程序等。单点登录是**有状态登录**(服务端存储用户信息),并且有多种登录方式,所以结合了**策略模式**+**工厂模式**,定义了抽象策略类,并提供了具体策略实现包括:
|
|
|
+客户端有PC端,APP端,小程序等。单点登录是**有状态登录**(服务端Redis存储用户信息),并且有多种登录方式:账户密码、手机验证码、第三方社交账户(微信,微博,QQ等),消灭传统编码方式采用大量if elseif分之判断。所以采用**策略模式**+**工厂模式**,定义了抽象策略类,并提供了具体策略实现包括:
|
|
|
|
|
|
1. 账户登录:用户名和密码 听书后台验证账户合法性
|
|
|
|
|
|
2. 手机验证码:短信(阿里云短信服务-判断删除采用lua脚本) 听书后台验证手机号合法性
|
|
|
|
|
|
-3. 微信登录:openId(只要获取到OpenID账户合法)
|
|
|
+3. 微信登录:openId(关键:只要获取到OpenID账户合法)
|
|
|
|
|
|
> 小程序端
|
|
|
>
|
|
@@ -77,10 +84,10 @@
|
|
|
> 1. 策略模式+工厂模式
|
|
|
>
|
|
|
> ```
|
|
|
- > 1.获取不同社交账户唯一标识策略接口 定义一个方法:获取不同平台上对应账户OpenID
|
|
|
- > 2.提供不同社交平台对应策略实现类(其中IOC容器BeanID=前端登录类型) 全部 实现策略接口获取账户OpenID方法
|
|
|
- > 3.提供工厂,采用自动注入 通过Map<String, 策略接口> 将策略接口下包含实现类对象注入Map中其中Key:BeanID,Value:实现类对象
|
|
|
- > 4.工厂中提供根据类型返回对应策略实现类对象-在不同策略实现类中完成不同验证账户合法逻辑
|
|
|
+ > 1.获取不同社交账户唯一标识策略接口 定义一个方法:获取不同社交平台上对应账户OpenID
|
|
|
+ > 2.提供不同社交平台对应策略实现类(关键:其中IOC容器策略实现类对象BeanID=前端登录类型) 全部 实现策略接口获取账户OpenID方法
|
|
|
+ > 3.提供工厂,采用自动注入,将策略策略下所有实现类注入Map<String, 策略接口> Map中其中Key:BeanID,Value:策略实现类对象
|
|
|
+ > 4.工厂中提供根据登录类型(策略类型)返回对应策略实现类对象-在不同策略实现类中完成不同验证账户合法逻辑
|
|
|
> ```
|
|
|
>
|
|
|
> 2. 以微信为例,调用微信服务端根据前端提交code获取微信服务端账户唯一标识:WXOpenid获取成功:代表账户验证通过
|
|
@@ -94,7 +101,7 @@
|
|
|
> 1. 保存用户信息 关联社交登录类型及OPenID
|
|
|
> 2. 隐式初始化账户(消费余额账户)
|
|
|
> 1. 话术1:采用OpenFeign同步调用账户服务 确保分布式事务一致性-Seata
|
|
|
- > 2. 话术2:采用Kafka异步初始化账户 确保消息可靠
|
|
|
+ > 2. 话术2:采用RabbitMQ异步初始化账户 确保消息可靠
|
|
|
>
|
|
|
> 6. 查询到基于用户信息产生Token
|
|
|
>
|
|
@@ -135,11 +142,11 @@
|
|
|
|
|
|
|
|
|
|
|
|
-**校验用户登录状态**:采用网关过滤器、SpringMVC拦截器、AOP切面
|
|
|
+**校验用户登录状态**:可以采用方案:方式一:采用网关过滤器 方式二:SpringMVC拦截器 方式三:AOP切面
|
|
|
|
|
|
- 自定义认证注解:控制接口方法是否登录访问
|
|
|
|
|
|
-- 切面:环绕通知作用到自定义注解(对注解修饰方法所在类进行增强,产生代理对象(JDK,CGLIB动态代理))
|
|
|
+- 切面:环绕通知作用到自定义注解(对注解修饰方法所在类进行增强,产生代理对象(JDK动态代理存在接口,产生实现类代理对象,CGLIB动态代理存在普通类产生子类代理对象))
|
|
|
- 获取请求对象,获取请求头:token
|
|
|
- 根据token查询Redis中用户信息
|
|
|
- 如果目标方法注解要求必须登录,且用户信息为空(token不合法,过期)抛出异常前端引导用户登录
|