1、Feign基本概念
Feign是Netflix开发的声明式、模板化的HTTP客户端, Feign可以帮助我们更快捷、优雅地调用
HTTP API。
Feign支持多种注解,例如Feign自带的注解或者JAX-RS注解等。
Spring Cloud对Feign进行了增强,使Feign支持了Spring MVC注解,并整合了Ribbon和Eureka,
从而让Feign的使用更加方便。
Spring Cloud Feign是基于Netflix feign实现,整合了Spring Cloud Ribbon和Spring Cloud
Hystrix,除了提供这两者的强大功能外,还提供了一种声明式的Web服务客户端定义的方式。
Spring Cloud Feign帮助我们定义和实现依赖服务接口的定义。在Spring Cloud feign的实现下,只
需要创建一个接口并用注解方式配置它,即可完成服务提供方的接口绑定,简化了在使用Spring
Cloud Ribbon时自行封装服务调用客户端的开发量。
2、实现服务调用
1、需求
删除课时的同时删除云端视频
2、在service模块添加pom依赖
<!--服务调用-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
3、在调用端的启动类添加注解
@EnableFeignClients
4、创建包和接口
@FeignClient注解用于指定从哪个服务中调用功能 ,名称与被调用的服务名保持一致。
@GetMapping注解用于对被调用的微服务进行地址映射
@PathVariable注解一定要指定参数名称,否则出错
@Component注解防止,在其他位置注入CodClient时idea报错
调用的是VodController中的这个方法:
创建client包, VodClient接口
package com.nanjing.eduservice.client;
import com.nanjing.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;
/**
* @author yimo
* @version 1.0
* @date 2022/4/12 14:27
*/
@FeignClient("service-vod")
@Component
public interface VodClient {
/**
* 定义调用的方法路径
* 根据视频id删除阿里云视频
* @PathVariable 注解一定要指定参数名称,否则会报错
* @param id
* @return
*/
@DeleteMapping("/eduvod/video/removeAliyVideo/{id}")//注意:这里的访问路径是全路径
public R removeAliyVideo(@PathVariable("id") String id);
}
EduVideoController
package com.nanjing.eduservice.controller;
import com.nanjing.commonutils.R;
import com.nanjing.eduservice.client.VodClient;
import io.swagger.annotations.ApiOperation;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.PathVariable;
/**
* @author yimo
* @version 1.0
* @date 2022/4/12 15:18
*/
public class EduVideoController {
//注入vodClient
@Autowired
private VodClient vodClient;
@ApiOperation(value = "删除小节")
@DeleteMapping("deleteVideo/{id}")
public R deleteVideo(@PathVariable String id){
//根据小节id获取视频id,调用方法实现视频删除
EduVideo eduVideo = videoService.getById(id);
String videoSourceId = eduVideo.getVideoSourceId();
//判断小节里面是否有视频id
if(!StringUtils.isEmpty(videoSourceId)) {
//根据视频id,远程调用实现视频删除
vodClient.removeAliyVideo(videoSourceId);
}
//删除小节
videoService.removeById(id);
return R.ok();
}
}
EduVideo实体类没有写, videoService也没有写,所以报红叉
测试:略,
由于我是临时写的EduVideoController,里面videoService都没有写,暂时测试不了。
附加说明:
由于公共的pom文件已经引入了服务注册,但是OssApplication却没有加相应的注解
application.properties也没有配置
所以启动会报错:nocas中没有注册
解决:
重新启动,测试OK