接口
void deleteVideoById(String videoId);
实现
@Override
public void deleteVideoById(String videoId) {
try {
DefaultAcsClient client = InitVodClient.initVodClient(ConstantVodUtils.KEY_ID, ConstantVodUtils.KEY_SECRET);
DeleteVideoRequest request = new DeleteVideoRequest();
request.setVideoIds(videoId);
client.getAcsResponse(request);
} catch (Exception e) {
e.printStackTrace();
throw new CustomException(20001, "删除小节视频失败");
}
}
/**
* 删除小节视频
* @param videoId
* @return
*/
@DeleteMapping("/{videoId}")
public R deleteVideoById(@PathVariable("videoId") String videoId) {
vodService.deleteVideoById(videoId);
return R.ok();
}
在src/api/edu/video.js
中添加如下api:
/**
* 删除小节视频
*/
deleteAliYunVideo(id){
return request({
url: `/eduvod/video/${id}`,
method: 'delete'
})
},
在views/edu/course/chapter.vue
中添加如下方法:
//移除视频的方法
handleVodRemove(file, fileList){
videoApi.deleteAliYunVideo(this.video.videoSourceId)
.then(response => {
this.$message({
type: 'success',
message: '小节视频删除成功'
})
//把文件列表清空
this.fileList = []
//清空data中视频的id和name,防止添加到数据库
this.video.videoSourceId = ''
this.video.videoOriginalName = ''
})
},
//移除视频之前调用的方法
beforeVodRemove(file, fileList){
return this.$confirm(`确定移除 ${file.name}?`)
},
在views/edu/course/chapter.vue
中修改如下方法:
//打开修改小节弹窗
openEditVideo(id){
//根据id从服务器获取小节信息
videoApi.getVideoById(id)
.then(response => {
this.video = response.data.video
//回显添加的视频
if (this.video.videoOriginalName != '')
this.fileList = [{'name': this.video.videoOriginalName}]
})
//显示修改弹窗
this.dialogVideoFormVisible = true
},
微服务最早由Martin Fowler与James Lewis于2014年共同提出,微服务架构风格是一种使用一套小服务来开发单个应用的方式途径,每个服务运行在自己的进程中,并使用轻量级机制通信,通常是HTTP API或者RPC
这些服务基于业务能力构建,并能够通过自动化部署机制来独立部署,这些服务使用不同的编程语言实现,以及不同数据存储技术,并保持最低限度的集中式管理。
(1)单体架构所有的模块全都耦合在一块,代码量大,维护困难。
微服务每个模块就相当于一个单独的项目,代码量明显减少,遇到问题也相对来说比较好解决。
(2)单体架构所有的模块都共用一个数据库,存储方式比较单一。
微服务每个模块都可以使用不同的存储方式(比如有的用redis,有的用mysql等),数据库也是单个模块对应自己的数据库。
(3)单体架构所有的模块开发所使用的技术一样。
微服务每个模块都可以使用不同的开发技术,开发模式更灵活。
Spring Cloud是一系列框架的集合。
Spring Cloud里面有很多框架(技术),使用Spring Cloud里面这些框架可以实现微服务操作
Spring Cloud依赖于SpringBoot技术
Spring Boot 是 Spring 的一套快速配置脚手架,可以基于Spring Boot 快速开发单个微服务,Spring Cloud是一个基于Spring Boot实现的开发工具;
Spring Boot专注于快速、方便集成的单个微服务个体,Spring Cloud关注全局的服务治理框架;
Spring Boot使用了默认大于配置的理念,很多集成方案已经帮你选择好了,能不配置就不配置,Spring Cloud很大的一部分是基于Spring Boot来实现,必须基于Spring Boot开发。
可以单独使用Spring Boot开发项目,但是Spring Cloud离不开 Spring Boot。
服务发现——Netflix Eureka (Nacos)
服务调用——Netflix Feign
熔断器——Netflix Hystrix
服务网关——Spring Cloud GateWay
分布式配置——Spring Cloud Config (Nacos)
消息总线 —— Spring Cloud Bus (Nacos)
**1)**Nacos 是阿里巴巴推出来的一个新开源项目,是一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据及流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。
**2)**常见的注册中心:
Eureka(原生,2.0遇到性能瓶颈,停止维护)
Zookeeper(支持,专业的独立产品。例如:dubbo)
Consul(原生,GO语言开发)
Nacos
**3)**Nacos是以服务为主要服务对象的中间件,Nacos支持所有主流的服务发现、配置和管理。
Nacos主要提供以下四大功能:
(1)下载地址和版本
下载地址:https://github.com/alibaba/nacos/releases
下载版本:nacos-server-1.1.4.tar.gz或nacos-server-1.1.4.zip,解压任意目录即可
(2)启动nacos服务
- Linux/Unix/Mac
启动命令(standalone代表着单机模式运行,非集群模式)
启动命令:sh startup.sh -m standalone
- Windows
启动命令:cmd startup.cmd 或者双击startup.cmd运行文件。
访问:http://localhost:8848/nacos
用户名密码:nacos/nacos
把service-edu微服务注册到注册中心中,service-vod步骤相同
在service的pom文件中配置Nacos客户端的pom依赖
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discoveryartifactId>
dependency>
在service_edu中配置application.properties,在客户端微服务中添加注册Nacos服务的配置信息
# nacos服务地址
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
3、添加Nacos客户端注解
在客户端微服务启动类中添加注解
@EnableDiscoveryClient
启动注册中心
启动已注册的微服务,可以在Nacos服务列表中看到被注册的微服务
Feign是Netflix开发的声明式、模板化的HTTP客户端, Feign可以帮助我们更快捷、优雅地调用HTTP API。
Spring Cloud Feign是基于Netflix feign实现,助我们定义和实现依赖服务接口的定义。在Spring Cloud feign的实现下,只需要创建一个接口并用注解方式配置它,即可完成服务提供方的接口绑定,简化了在使用Spring Cloud Ribbon时自行封装服务调用客户端的开发量。
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-openfeignartifactId>
dependency>
在service_edu模块的启动类中添加如下注解
@EnableFeignClients
在service_edu创建client包,并在其创建如下接口
其中
@FeignClient注解用于指定从哪个服务中调用功能 ,名称与被调用的服务名保持一致。
@GetMapping注解用于对被调用的微服务进行地址映射。
@PathVariable注解一定要指定参数名称,否则出错
@Component注解防止,在其他位置注入VodClient时idea报错
@Component
@FeignClient("service-vod")
public interface VodClient {
//定义调用方法的路径
//删除小节视频
@DeleteMapping("/eduvod/video/{videoId}")
public R deleteVideoById(@PathVariable("videoId") String videoId);
}
在调用端的service_edu的VideoServiceImpl中调用client中的方法
@Autowired
private VodClient vodClient;
/**
* 根据课程id删除该课程的小节
* @param courseId
*/
//TODO 删除小节时,删除对应的视频
@Override
public void removeVideoByCourseId(String courseId) {
//根据小节id获取到视频id
EduVideo video = this.getById(courseId);
String videoId = video.getVideoSourceId();
//再根据视频ID删除小节
if(!StringUtils.isEmpty(videoId))
vodClient.deleteVideoById(videoId);
baseMapper.deleteById(id);
}
重新启动模块
提示删除成功,再次进入视频删除成功,数据库记录删除成功