• 谷粒学苑_第十天


    第十天

    视频删除

    后端

    相关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,"删除视频失败");
            }
    
        }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    前端

    video.js添加

    , 
      //删除视频
      deleteAliyunVideo(id){
        return request({
          
            url: 'http://localhost:8003/eduvod/video/'+id,
            method:'delete'
        })
      }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    //视频操作
          //上传成功的方法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=''
            })
           
          },
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39

    微服务

    是一种架构风格

    有多个服务,每个服务独立运行,不会相互影响,多个服务独立运行,服务占用独立进程

    springcloud

    是微服务的一种,本身并不是技术/框架,是很多技术/框架的集合

    需要基于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

    点击后面的详细文档

    这里就是对应的两个版本:

    在这里插入图片描述

    Nacos

    类似于中介,将所有服务注册到注册中心,有服务需要某些功能可以调用其他服务来实现

    常见的注册中心

    Eureka:早期服务注册是用的Eureka,但是遇到性能瓶颈,不再维护

    Zookeeper:可以配合dubbo

    Consul:是用go开发的(禁止(中国)使用?)

    Nacos实现原理

    (有调用动作的是消费者,被调用的是生产者)

    (生产者消费者身份是相对的,看谁调用谁)

    主要功能的原理

    在这里插入图片描述

    还有心跳机制(连接确认)

    自我保护机制(确保不出现雪崩)

    动态dns(灵活优化网络)

    Docker安装Nacos

    官网文档

    //或者看我这个

    快速上手Nacos(Docker)

    拉取镜像:

    docker pull nacos/nacos-server
    
    • 1

    创建映射文件:

    mkdir -p /root/nacos/init.d /root/nacos/logs
    touch /root/nacos/init.d/custom.properties
    
    • 1
    • 2

    写入一些内容

    vim /root/nacos/init.d/custom.properties
    
    • 1

    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
    
    • 1

    运行容器:

    docker start nacos
    
    • 1

    访问地址:

    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>
    
    • 1
    • 2
    • 3
    • 4
    • 5

    service_edu配置

    application

    spring:
      cloud:
        nacos:
          discovery:
            server-addr: 192.168.199.100:8848 #服务地址
    
    • 1
    • 2
    • 3
    • 4
    • 5

    启动类注解

    @EnableDiscoveryClient
    
    • 1

    启动成功并发现
    在这里插入图片描述

    同理把vod也加上依赖注解配置

    在这里插入图片描述

    Feign

    服务调用用的

    依赖:

    
            <dependency>
                <groupId>org.springframework.cloudgroupId>
                <artifactId>spring-cloud-starter-openfeignartifactId>
            dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5

    调用端(service_edu)注解:

    开启feign客户端

    @EnableFeignClients
    
    • 1

    调用端接口:

    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);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    实现调用

    在EduVideoController的deleteVideo调用注入vodClient

    @Autowired
    private VodClient vodClient;
    
    • 1
    • 2

    出现错误:

    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();
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    然后实现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,"视频删除失败");
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    在VodClient添加接口方法:

    //删除多个视频的方法
    @DeleteMapping("eduvod/video/delete-batch")
    public R deleteBatch(@RequestParam("videoIdList") List videoIdList);
    
    • 1
    • 2
    • 3

    在 EduVideoServiceImpl写好调用方法

    //先注入

        //注入
        @Autowired
        VodClient vodClient;
    
    • 1
    • 2
    • 3

    改成:

    @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 删除对应视频的文件
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    丝袜哥测试

    略,前端有bug先不修了,学完再看

    Hystrix

    是熔断器

    熔断器是一定时间呢请求无回复,然后

    熔断器前置知识

    springcloud在接口调用上的经历:

    接口化请求调用

    Feign----按照服务名进行调用---->Hystrix----调不到断开连接---->Ribbon----负载均衡—>Http Client

    Hystrix提供延迟容错功能

    使用

    在service_edu

    依赖:

    Nacos自动引入了ribbon openfeign自动引入hystrix

    配置:

    feign:
      hystrix:
        enabled: true
    
    • 1
    • 2
    • 3

    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("删除多个视频错误");
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    修改注解

    @FeignClient(name="service-vod",fallback = VodClientImpl.class)//被调用的服务的名字,熔断器的实现类
    
    • 1

    补充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();
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    断点调试

  • 相关阅读:
    超详细的格式化输出(format的基本玩法)
    「动态规划」如何求乘积最大子数组?
    英伟达开源 3400 亿参数模型;苹果 iOS 18 紧急 SOS 新增实时视频功能丨 RTE 开发者日报 Vol.225
    .net core-利用PdfSharpCore和SkiaSharp.QrCode 添加PDF二维码页眉
    SpringSecurity实战-第6-8章
    vue-cli查看相关版本以及更新配置
    亚马逊第三大卖家国家巴基斯坦电商营商环境如何?且看跨境电商数字身份验证服务商ADVANCE.AI要参解析
    Python:实现modular exponential模指数算法(附完整源码)
    关系数据库如何工作
    Redis数据持久化
  • 原文地址:https://blog.csdn.net/m0_52070517/article/details/128050624