开发者学堂课程【微服务+全栈在线教育实战项目演练(SpringCloud Alibaba+SpringBoot):课程管理-删除小节删除视频(服务调用)】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/667/detail/11416
课程管理-删除小节删除视频(服务调用)
目录:
一、 基本概念
二、 前提条件:把互相调用服务在 nacos 进行注册
一、 基本概念
l Feign 是 Netflix 开发的声明式、模板化的 HTTP 客户端,Feign 可以帮助我们更快捷、优雅地调用 HTTP API.
l Feign支持多种注解,例如Feign自带的注解或者 JAX-RS 注解等。
l SpringCloud对Feign 进行了增强,使 Feign 支持了 SpringMVC 注解,并整合了Ribbon和Eureka,从而让 Feign 的使用更加方便。
l SpringCloud Feign是基于 Netflixfeign 实现,整合了 SpringCloud Ribbon 和SpringCloud Hystrix,除了提供这两者的强大功能外,还提供了一种声明式的 Web 服务客户端定义的方式
l SpringCloud Feign 帮助我们定义和实现依赖服务接口的定义。在SpringCloudfeign 的实现下,只需要创建一个接口并用注解方式配置它,即可完成服务提供方的接口绑定,简化了在使用 SpringCloudRibbon 时自行封装服务调用客户端的开发量。
Netflix 是一个公司开发的组件,而 spring cloud 中的组件都是它开发的,后来使用 Nacos 作为替换。
在做服务调用的时候,通过一个模块调用另一个模块。还写到 Feign 支持了SpringMVC 注解,让 Feign 的使用更加方便。
二、 前提条件:把互相调用服务在 nacos 进行注册
(1) 引入依赖在 service 模块
<!--服务调用-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
找到 service,打开,放入 openfeign
引入依赖,就会开始下载,多等待一会,就能下载成功。
在课件中,有很多组件,这些代码都在一个地方,在调用端的启动类,因为service-edu 要调用 service-vod ,所以调用段是 service-edu ,或者是我们的消费者,service-vod 是被调用端,或者是生产者,所以我们的代码要写在调用端中,就是在 service-edu 中,就是调用端。
(2)、在调用端 service-edu 服务启动类添加注解
使用服务发现,注册之后需要找到服务,进行操作。需要加这个注解,@EnableFeignClients,这是我们的第二部分。
在我们的调用端service-edu,找到启动类,加上注解,
@SpringBootApplication
@EnableDiscoveryClient t //nacos注册
加一个服务注解
@EnableFeignClients
这个必须要加,这样才能做到服务调用,
@ComponentScan(basePackages = {"com. atguigu"}) public class EduApplication {
(3)、在调用端创建一个 interface 接口,使用注解指定调用服务名称,定义调用的方法路径
需要强调,调用代码是一个固定结构,都需要满足。
在调用端建立一个 interface,然后在上面加注解 @Component,还有一个@FeignclIent("service-vod"),就是加上要调用的名字,也就是说,通过 service-vdu调用service-vod,把这个加到注解上,这是我们要写到的,然后在 interface中加上要调接口的地址,比如说是 vod 的方法,这一条一定要写上,这是一个固定的过程。
来到它的启动类上,重新启动,在 edu 中,先加一个 interface,先写一个包,client,
在这里创建一个 interface
创建之后,在这个 interface 中先加第一个注解,@component,加完之后再加第二个注解@FeignClient,加上它要调用的服务的名字,服务的名字就是列表中的名字,即 service-vod,把他加入进去,名字必须要写正确,而且名字必须是配置中的名字,因为他会在注册中心中注册进去,尽量不要写错,建议复制粘贴。
@FeignClient("service-vod")
@Component
public interface VodClient {
完成之后,在 interface 里面,我们要定义调用的方法路径,给大家说明应该怎么做。因为我们现在是 edu 要调用 vod,所以我们先把 vod 找到,
要调用的是这个方法:
//根据视频 id 删除阿里云视频
@DeleteMapping("/eduvod/video /removeAlyVideo/ {id}")
public R removeAlyVideo(@PathVariable String id) {
最简单的办法就是我们直接复制粘贴就可以,所以我们直接复制粘贴,
//定义调用的方法路径
//根据视频 id 删除阿里云视频
@DeleteMapping("removeAlyVideo/ {id}")
public R removeAlyVideo(@PathVariable String id)
在复制过来之后,我们要改一个地方,就是把他的路径改为完全路径,之前是removeAlyVideo,我们再加上/eduvod/video部分,把路径写得更完全,就是把他们都给加上,成为/eduvod/video /removeAlyVideo。
在 interface 中,第一我们要调用这个方法的路径,因为我们最终调的就是这个方法,public R removeAlyVideo(@PathVariable String id),所以我们要把它方法里的参数定义也写过去,然后把路径写的完全点,把它们都写出来,这样的话就可以了,这就是我们的第三步。
所以我们应该知道这是一个固定的过程,后面再有方法就可以直接加进去,/eduvod/video这些不要写错,这就是一些说明。
这里边还有一些细节,需要特别注意:
创建 client 包
@FeignClient 注解用于指定从哪个服务中调用功能,名称与被调用的服务名保持一致
@GetMapping 注解用于对被调用的微服务进行地址映射。
@PathVariable 注解一定要指定参数名称,否则出错
@Component 注解防止,在其他位置注入 CodClient 时 idea 报错
//定义调用的方法路径
//根据视频 id 删除阿里云视频
PathVariabler 的注解就是取 id 的值,而这个值必须指定一个名称,比如说叫一个id,如果不写的话就会有问题,名称一样就可以了,这是我们调用中一个特别重要的方法,因为他要给你找名称中的那个参数,进行传递,这样的话,我们的第三步就算完成了。
总结如下:
@FeignClient("service-vod""
@Component
public interface VodClient
//为定义调用的方法路径
//根据视频id删除阿里云视频
//@Path Variable注解一定要指定参数名称,否则出错
@DeleteMapping("leduvodivideoiremoveAlyVideol{id}") public R removeAlyVideo(@PathVariable(""id"") String id):
(4)、实现代码删除小节删除阿里云视频
先找到我们的方法位置,因为我们删除小节是在 service-edu 中,那我们就找到方法:
videoService.removeById(id)
return R. ok():
删除小节删除视频,做个实践。
我们可以把它写在 service 中,使用 control 进行编写,因为我们刚才创建了一个interface,所以我们可以把 interface 注入到 control 中,可以使用这个方法,我们可以做一个注入:
//注入 vodClient
@Autowired
private VodClient vodClient
把它注入之后,我们就可以调用里面的方法,就我们刚才定义的方法,里面传入一个视频的 id,
vodClient.removeAlyVideo("视频id")
videoService.removeById(id);
return R.ok();
我们可以把定义的放入我们的方法,就能实现我们调用 vod 的一个方法,这个过程他的底层是怎么调到的,对此进行一个说明,我们要注意,这是一个 interface 接口,而 interface 接口对应的一般是一个实现类,比如说我们的 service,有这个interface 实现类,我们可以发现,上面的只有一个 interface,它的实现类是什么?
我们可以理解为它的实现类将会于它怎么做。当我们去调用这个接口的时候,他就会通过你的名字远程调用你的 vod,把 vod 中的话给你调过来,这就相当于给我们做实现类,vodClient 主要写接口,就是远程调用,是一种说法,通过 edu 根据服务名字调用 vod 中的地址方法,把值就给他传过来,这是他本身的一个过程,所以她也可以理解为远程调用的方式,相当于我们实现类的一个过程,就是服务名字通过注册中心做的调用,所以这个我们需要知道,我么们的写法就这样来做,写完之后,我们要将方法做一个完善,
如下:
//删除小节
//TODO 后面这个方法需要完善:删除小节时候,同时把阿里云里面视频删除@DeleteMapping (" {id}")
public R deleteVideo(@PathVariable String id) {
vodClient.removeAlyVideo("视频id");
videoService. removeById(id);
return R. ok();
现在它的原始方法是删除小节,也就是说,上面的 id 就是删除小节的 id,但现在("视频id");这里不能传 id,因为他不是视频 id,我们要根据视频 id 才能删除视频,所以我们需要根据小节 id 得到视频 id,得到之后,再调用方法才能做删除,
过程如下:
//删除小节,删除对应的阿里云视频
@DeleteMapping("{id}")
public R deleteVideo(@PathVariable String id){
//根据小节id获取视频id,调用方法实现视频删除
先看一下表 eduvod,查到小节 id,对象中就有视频 id,那我们将id得到再调用就可以得到。
先查询,根据小节 id 查,在 control 调用 service,得到 video 对象,再得到视频id,将视频 id 传过来,
EduVideo eduVideo = videoService.getById(id);
String videoSourceId =eduVideo.getVideoSourceId();
//判断小节里面是否有视频 id
这样的话,我们这个视频就算完成了,
if(!StringUtils.isEmpty(videoSourceId)){
就是传到你的方法中,做一个调用,加一个注释
//根据视频 id,远程调用实现视频删除,
vodClient.removeAlyVideo(VideoSourceid);
这就是我们基本的一个代码,但是它有一个小问题,我们可以看表,因为视频id中可能没有值,如果没有视频,那我们就不需要删除,有视频我们才需要删除,没有视频删除的话会出现问题,我们现在需要做一个判断,如果 videoSourceId 的值不为空,那我们就要删除视频,调用以上代码进行删除;等于空,那我们就不需要删除,这个需要进行一个判断。最后再去删除小节。
//删除小节
videoService.removeBvId(id):
return R.ok();
//修改小节 TODO
这就是我们最终的代码,就算完成了。
上面的注释就可以删除了,//TODO 后面这个方法需要完善:删除小节时候,同时把阿里云里面视频删除,
在这里,有一个细节问题需要注意,要注意删除的顺序,是先删除视频,然后删除小节,所以我们不能弄乱顺序,先删除小节,再删除视频,这样的话就不正确了,如果我们把小节删除之后,这里数据就会消失,当你根据小节 id 查找视频 id 时,就查不到了,所以我们要先删除视频,再删除小节,所以一定要注意顺序,
因为我们需要查询视频 id,这里的细节大家需要注意,所以,我们的代码就完成了。
通过 spring cloud 中的 nacos 组件,做到远程调用,就是一个模块调用另一个模块,这个过程就叫远程调用,通过这个方法,我们就做到了删除视频删除小节的功能。
这样,我们就写完这样一段基本代码了,最后,我们再看一遍这样的一个过程,最后,做一个最终测试,看看最终的效果。先启用 nacos,访问进入界面,
做完之后,把我们要互相调用的服务在注册中心进行注册,加入以来,加入配置,加入启动类,最终都注册过后,我们就能看到这些服务,注册之后,我们可以进行一个调用,通过 edu 调用 vod,在调用端实现,因为是 edu 调用 vod,所以 edu 是调用端,所以先添加一个依赖,
lependency>
<groupId org. springframework.cloud</groupId
<artifactId spring-cloud-starter-openfeign</artifactId </dependency>
再在启动类上面加上一个注解,为了做到服务调用过程,
@EnableFeignClients
再次创建一个 interface,指定要调用的服务的名字,包括地址
service-vod
eduvod/video/removeAlyVideo/ {id}
把方法从 vod 中复制过来,然后加入地址就可以了,这就是我们的第三步,写完之后我们开始调用,先把 vod 注入进来
//注入vodClient
@Autowired
private VodClient vodclient;
再做到远程调用,有接口,判断时间类,就是远程调用过程,最后,在里边根据小节 id,得到视频 id,把他删掉,但在过程中要注意先删除视频,再删除小节,因为数据已经没有了,这个顺序要注意,这样的话,我们就完成了完整的流程,完成之后,将效果试一下,看一下最终的结果是什么样的。