相关sdk在阿里云视频点播文档的服务端SDK–>Java SDK–>媒资管理–>删除视频
复制前面的InitObject到utils里
删除的方法
@DeleteMapping("{id}")
public R removeAliyunVideo(@PathVariable String id){
try{
DefaultAcsClient defaultAcsClient = InitVodCilent.initVodClient(ConstantVodUtils.ACCESS_KEY_ID,ConstantVodUtils.ACCESS_KEY_SECRET);
//创建一个删除视频request对象
DeleteVideoRequest deleteVideoRequest = new DeleteVideoRequest();
//设置id
deleteVideoRequest.setVideoIds(id);
//获取结果
DeleteVideoResponse acsResponse = defaultAcsClient.getAcsResponse(deleteVideoRequest);
return R.ok();
//初始化对象
}catch (Exception e){
throw new GuliException(20001,"删除视频失败");
}
}
video.js添加
,
//删除视频
deleteAliyunVideo(id){
return request({
url: 'http://localhost:8003/eduvod/video/'+id,
method:'delete'
})
}
//视频操作
//上传成功的方法List
handleVodUploadSuccess(response,file,fileList){
console.log(response.data.videoId)
this.video.videoSourceId=response.data.videoId
this.video.videoOriginalName=file.name
},
//上传前
handleUploadExceed(files, fileList){
this.$message.warning('如果要重新上传,请先删除已有视频')
},
//删除上传
beforeVodRemove(file,fileList){
return this.$confirm(`确认删除 ${file.name}?`);
},
//点击确认调用的方法
handleVodRemove(){
console.log("删除api")
videoapi.deleteAliyunVideo(this.video.videoSourceId)
.then(response=>{
//提示信息
this.message({
type: 'success',
message: '视频删除成功'
});
//文件列表清空
this.fileList= []
this.video.videoSourceId=''
this.video.videoOriginalName=''
})
},
是一种架构风格
有多个服务,每个服务独立运行,不会相互影响,多个服务独立运行,服务占用独立进程
是微服务的一种,本身并不是技术/框架,是很多技术/框架的集合
需要基于springboot来实现
服务发现 Netfix Eureka( Nacos )
服务调用 Netfix Feign
熔断器 Netfix Hystrix
服务网关 Spring Cloud GateWay
分布式配置 Spring Cloud Config ( Nacos )
消息总线 Spring Cloud Bus ( Nacos )
springcloud的版本与springboot版本要一一对应
需要在官网查询
https://spring.io/projects/spring-cloud#overview
前面的名字是按照伦敦地铁站的名字,后面没写的了就直接用的年份时间版本
GA:稳定版
SNAPSHOT:快照版,随时更新
M:里程碑版
SR:正式版
CURRENT:当前推荐版
最好别选SNAPSHOT
点击后面的详细文档
这里就是对应的两个版本:
类似于中介,将所有服务注册到注册中心,有服务需要某些功能可以调用其他服务来实现
Eureka:早期服务注册是用的Eureka,但是遇到性能瓶颈,不再维护
Zookeeper:可以配合dubbo
Consul:是用go开发的(禁止(中国)使用?)
(有调用动作的是消费者,被调用的是生产者)
(生产者消费者身份是相对的,看谁调用谁)
主要功能的原理
还有心跳机制(连接确认)
自我保护机制(确保不出现雪崩)
动态dns(灵活优化网络)
//或者看我这个
快速上手Nacos(Docker)
拉取镜像:
docker pull nacos/nacos-server
创建映射文件:
mkdir -p /root/nacos/init.d /root/nacos/logs
touch /root/nacos/init.d/custom.properties
写入一些内容
vim /root/nacos/init.d/custom.properties
management.endpoints.web.exposure.include=*
然后 保存并退出vim
生成容器:
docker run -d -p 8848:8848 -e MODE=standalone -e PREFER_HOST_MODE=hostname -v /root/nacos/init.d/custom.properties:/home/nacos/init.d/custom.properties -v /root/nacos/logs:/home/nacos/logs --restart always --name nacos nacos/nacos-server
运行容器:
docker start nacos
访问地址:
http://服务器ip:8848/nacos/#/login
用户名: nacos
密码: nacos
引入nacos依赖:
service_edu与service的pom.xml里
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discoveryartifactId>
dependency>
service_edu配置
application
spring:
cloud:
nacos:
discovery:
server-addr: 192.168.199.100:8848 #服务地址
启动类注解
@EnableDiscoveryClient
启动成功并发现
同理把vod也加上依赖注解配置
服务调用用的
依赖:
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-openfeignartifactId>
dependency>
调用端(service_edu)注解:
开启feign客户端
@EnableFeignClients
调用端接口:
service_edu创建一个client.VodClient
package com.lkw.eduservice.client;
import com.lkw.commonutils.R;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.PathVariable;
@FeignClient("service-vod")//被调用的服务的名字
@Component
public interface VodClient {
//定义方法路径
//把service_vod的方法完完全全的复制来,路径改成完全路径
@DeleteMapping("eduvod/video/{id}")
public R removeAliyunVideo(@PathVariable("id") String id);
}
实现调用
在EduVideoController的deleteVideo调用注入vodClient
@Autowired
private VodClient vodClient;
出现错误:
no server available
是因为有nacos依赖的模块都要配置与添加服务注册
可能刚刚的oss还没加nacos配置或注解
传输多个id可以用List
先写好vodservice的Controller
//删除多个视频的方法
@DeleteMapping("delete-batch")
public R deleteBatch(@RequestParam("videoIdList") List videoIdList) {
vodService.removeMoreAlyVideo(videoIdList);
return R.ok();
}
然后实现service接口的实现类
@Override
public void removeMoreAlyVideo(List videoIdList) {
try {
DefaultAcsClient defaultAcsClient = InitVodCilent.initVodClient(ConstantVodUtils.ACCESS_KEY_ID,ConstantVodUtils.ACCESS_KEY_SECRET);
//创建一个删除视频request对象
DeleteVideoRequest deleteVideoRequest = new DeleteVideoRequest();
//遍历用逗号拼接
String videoIds = StringUtils.join(videoIdList.toArray(), ",");//数组加分隔符拼接成字符串//或者听说String.join(",",list)也行
//设置id
deleteVideoRequest.setVideoIds(videoIds);
//获取结果
DeleteVideoResponse acsResponse = defaultAcsClient.getAcsResponse(deleteVideoRequest);
}catch(ClientException e){
throw new GuliException(20001,"视频删除失败");
}
}
在VodClient添加接口方法:
//删除多个视频的方法
@DeleteMapping("eduvod/video/delete-batch")
public R deleteBatch(@RequestParam("videoIdList") List videoIdList);
在 EduVideoServiceImpl写好调用方法
//先注入
//注入
@Autowired
VodClient vodClient;
改成:
@Override
public void removeVideoByCourseId(String courseId) {
//根据课程id查询课程所有视频id
QueryWrapper wrapperVod=new QueryWrapper<>();
wrapperVod.eq("course_id",courseId);
wrapperVod.select("video_source_id");
List eduVideoList = baseMapper.selectList(wrapperVod);
List videoIds = eduVideoList.stream().map(EduVideo::getVideoSourceId).collect(Collectors.toList());
vodClient.deleteBatch(videoIds);
QueryWrapper wrapper=new QueryWrapper<>();
wrapper.eq("course_id",courseId);
baseMapper.delete(wrapper);
//TODO 删除对应视频的文件
}
略,前端有bug先不修了,学完再看
是熔断器
熔断器是一定时间呢请求无回复,然后
springcloud在接口调用上的经历:
接口化请求调用
Feign----按照服务名进行调用---->Hystrix----调不到断开连接---->Ribbon----负载均衡—>Http Client
Hystrix提供延迟容错功能
在service_edu
依赖:
Nacos自动引入了ribbon openfeign自动引入hystrix
配置:
feign:
hystrix:
enabled: true
yml里好像不能配置超时时间
创建熔断器实现类:
package com.lkw.eduservice.client.impl;
import com.lkw.commonutils.R;
import com.lkw.eduservice.client.VodClient;
import org.springframework.stereotype.Component;
import java.util.List;
@Component
public class VodClientImpl implements VodClient {
@Override
public R removeAliyunVideo(String id) {
return R.error().message("删除视频错误");
}
@Override
public R deleteBatch(List videoIdList) {
return R.error().message("删除多个视频错误");
}
}
修改注解
@FeignClient(name="service-vod",fallback = VodClientImpl.class)//被调用的服务的名字,熔断器的实现类
补充eduvideoController
//刪除小节
//删除小节同时把小节中的视频删除
@DeleteMapping("{id}")
public R deleteVideo(@PathVariable String id) {
System.out.println(id);
//根据小节id查询出视频id,进行删除
EduVideo eduVideobyId = eduVideoService.getById(id);
String videoSourceId = eduVideobyId.getVideoSourceId();
//判断是否有视频,有就删除
if (!StringUtils.isEmpty(videoSourceId)) {
//远程调用vod删除视频
R r = vodClient.removeVideo(videoSourceId);
if(r.getCode()==20001)
throw new GuliException(20001,"删除视频失败");
}
//删除小节
eduVideoService.removeById(id);
return R.ok();
}
略