谷粒学苑_第十天

news2024/10/6 10:28:46

第十天

视频删除

后端

相关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=''
        })
       
      },

微服务

是一种架构风格

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

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

创建映射文件:

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.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>

service_edu配置

application

spring:
  cloud:
    nacos:
      discovery:
        server-addr: 192.168.199.100:8848 #服务地址

启动类注解

@EnableDiscoveryClient

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

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

在这里插入图片描述

Feign

服务调用用的

依赖:

<!--        服务调用-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </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<EduVideo> wrapperVod=new QueryWrapper<>();
    wrapperVod.eq("course_id",courseId);
    wrapperVod.select("video_source_id");
    List<EduVideo> eduVideoList = baseMapper.selectList(wrapperVod);

    List<String> videoIds = eduVideoList.stream().map(EduVideo::getVideoSourceId).collect(Collectors.toList());

    vodClient.deleteBatch(videoIds);

    QueryWrapper<EduVideo> wrapper=new QueryWrapper<>();
    wrapper.eq("course_id",courseId);
    baseMapper.delete(wrapper);
    //TODO 删除对应视频的文件
}

丝袜哥测试

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

Hystrix

是熔断器

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

熔断器前置知识

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();
}

断点调试

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/37377.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

parallelStream/ForkJoinPool 详解

parallelStream parallelStream是一种并行流, 意为处理任务时并行处理。 parallelStream底层使用的是ForkJoinPool。ForkJoinPool是一种工作窃取算法线程池&#xff0c;和分治法的概念一致&#xff0c;可以充分利用多 CPU 的优势&#xff0c;把一个任务拆分成多个"小任务…

云计算盛宴即将揭幕,re:Invent创新方向提前剧透

作为数字时代广大企业不可或缺的IT基础设施&#xff0c;云计算已经当仁不让地成为了数字经济的技术底座&#xff0c;同时也成为了当前全球备受关注和最热门的产业之一。作为云计算技术的开创者和领导者&#xff0c;亚马逊云科技自从2006年推出全球首个云计算服务以来&#xff0…

OpenCV图像特征提取学习三,LBP图像特征检测算法

一、LBP特征的概述 LBP指局部二值模式&#xff0c;英文全称&#xff1a;Local Binary Pattern&#xff0c;是一种用来描述图像局部特征的&#xff0c;LBP特征具有灰度不变性和旋转不变性等显著优点。同时是一种描述图像特征像素点与各个像素点之间的灰度关系的局部特征的非参数…

NestJS学习:控制器

参考 控制器 控制器负责处理传入的请求和向客户端返回响应。 控制器的目的是接收应用的特定请求。路由机制控制哪个控制器接收哪些请求。通常&#xff0c;每个控制器有多个路由&#xff0c;不同的路由可以执行不同的操作。 控制器 上一篇文章已经介绍了路由的创建&#xff0c…

Redis缓存何以一枝独秀?以及热门面试题中Redis的核心特性

​Redis的各种数据类型 作为缓存组件&#xff0c;Redis的数据结构整体而言就是key-value类型的键值对&#xff0c;但是Redis对于value类型的支持还是比较丰富的&#xff0c;提供了5种不同的数据结构&#xff0c;可以满足大部分场景的使用诉求。 ​对几种类型的结构特点与使用注…

3天3定制大屏,反向PUA

摘要 本次分享一段无讨价还价余地的单人3天定制化大屏全过程&#xff08;强调说拖拽屏的请绕道,和你想的不一样&#xff09;,要动效、要地图、要流光。天坑的心理博弈到最终解决的过程及技术思路。 前因 没啥征兆突然接到说&#xff0c;要在下周完成2个大屏的定制开发,起初没提…

C51 - 定时器

Contents1> 概述(STC89C51RC/RD)2> 作用: CPU的 "闹钟"3> 工作原理 (16位计数器)[TL0 TH0]: 数据寄存器TF: 定时器<溢出>标志位4> 程序设计1> 概述(STC89C51RC/RD) STC89C51RC/RD 定时器数量: 3个; T0模式:工作模式 模式0: 13位计数器; 模式1: …

理解循环神经网络

理解循环神经网络 之前有一篇文章已经初步介绍过RNN的原理(https://forchenxi.github.io/2021/04/23/nlp-rnn/)&#xff0c;里面其实已经介绍的比较清晰易懂了&#xff0c;这篇文章再来回顾和拓展一下. 首先要知道RNN是一个带有内部环的神经网络&#xff0c;上面的这篇文章中…

港科夜闻|香港科大(广州)校长倪明选教授出席江门双碳实验室第一届理事会一次会议...

关注并星标每周阅读港科夜闻建立新视野 开启新思维1、香港科大(广州)校长倪明选教授出席江门双碳实验室第一届理事会一次会议。11月21日下午&#xff0c;江门双碳实验室召开第一届理事会一次会议&#xff0c;审议通过有关文件&#xff0c;完善实验室组织架构&#xff0c;谋划下…

Python之条件语句逻辑运算符

目录 一、逻辑运算符 1.基本运算符 2.比较运算符 3.赋值运算符 二、 if条件语句 三、循环语句 一、逻辑运算符 1.基本运算符 2.比较运算符 3.赋值运算符 # 条件语句逻辑运算符 print((5 / 2)) print((5 // 2)) print((3 ** 2)) #3的2次方# 递增 # a1 # a1 # print(a) # a,b…

主流的深度学习推理架构有哪些(NCNNN)

AI 技术在具体落地应用方面&#xff0c;和其他软件技术一样&#xff0c;也需要具体的部署和实施。部署对于不同的平台设备上的部署方法和不同的架构工具。目前在人工智能的落地部署方面&#xff0c;各大平台机构都退出了自家的部署平台。 目前市场上应用最广泛的部署工具主要有…

用DIV+CSS技术设计的网上书城网页与实现制作(大一Web课程设计)

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…

Java项目:JSP中华传统美食网站平台管理系统

作者主页&#xff1a;源码空间站2022 简介&#xff1a;Java领域优质创作者、Java项目、学习资料、技术互助 文末获取源码 作者主页&#xff1a;夜未央5788 简介&#xff1a;Java领域优质创作者、Java项目、学习资料、技术互助 文末获取源码 项目介绍 本项目分为前台与后台&…

【网页设计】基于HTML+CSS+JavaScript学生网上报到系统响应式网站

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…

计算机网络---万维网(WWW)

&#xff08;一&#xff09;WWW的概念与组成结构 万维网&#xff08;World Wide Web&#xff0c;WWW)是一个分布式、联机式的信息存储空间&#xff0c;在这个空间中:一样有用的事物称为一样“资源”&#xff0c;并由一个全域“统一资源定位符”(URL&#xff09;标识。这些资源通…

Scala的简单语法介绍

文章目录变量声明语句块if语句for循环while、do while数组Map映射tuple元组变量声明 //在Scala中val用于定义常量&#xff0c;var用于定义变量 var var_i 1 var_i 1val val_i 1 val_i 1 val_i 2运行结果如下&#xff1a; 可以看到&#xff0c;常量是初始复制就确定了&am…

Hello Erupt

前言 本系列将直接以Erupt的分布式方案为路线进行更新。本文的定位是Erupt的HelloWorld。目标&#xff0c;跑起来&#xff0c;让我们看看它是什么样的。 运行起来 准备一个数据库 第一步还是先运行起来。由于最近接触的公司项目都是在使用mysql的驱动&#xff0c;这里我也就…

python+人脸识别+opencv实现真实人脸驱动的阿凡达(上)

目录一、前言二、技术路线三、主要技术点分析(1) 人脸识别模块特征点的漂移(2) 柔性运动与刚性运动的处理setp1 基于人脸特征点的三角剖分setp2 基于三角映射的仿射变换(3) 正脸转侧脸的处理四、小结一、前言 我们在此前的名叫pythonopencv实现人脸微整形博文里已经简单地实现…

Java GUI图形编程 使用awt和swing 制作简易计算器的工具包含源码和讲解 / java练习项目

系列文章目录 提示&#xff1a;阅读本章之前&#xff0c;请先阅读目录 文章目录系列文章目录前言一、常规配置1. 设置窗口大小2. 获取当前屏幕的尺寸3. 窗口居中4. 设置窗口名称5. 添加监听器&#xff0c;关闭窗口6. 设置窗口可见性7. 设置文本框不可编辑8. 设置文本框提示9. 设…

OpenGL原理与实践——核心模式(六):光照贴图、光源分类以及多光源场景主要源码实现

本章主要以代码为主&#xff0c;理论理解即可。详细分析代码 目录 光照贴图 光源分类 平行光 点光源 shader——点光源 聚光灯 聚光灯边缘优化——光强递减 源码解析 main 全局变量、句柄 main函数主体逻辑 createModel() createTexture(const char* _filename) …