Netflix开发的
service中引入依赖
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId></dependency>
在调用端service_edu的启动类上加上注解@EnableFeignClients
调用端service_edu创建一个接口VodClient
加上注解@Component交给spring管理
加上注解指定要调用的服务名
@FeignClient("service-vod")
定义要调用的方法的路径 url要写全,加上controller的url
@DeleteMapping("/eduvod/video/deleteVideoById/{id}")public R deleteVideoById(@PathVariable("id") String id);
参数中的@PathVariable一定要指定参数的名称@PathVariable("id")
EduVideoController
注入VodClient
@Autowiredprivate VodClient vodClient;
在删除小节的方法findVideoById中调用vod的方法删除视频
@DeleteMapping("deleteVideoById/{id}")public R deleteVideoById(@PathVariable String id){//根据小节id得到视频id,先得到对应的小节对象
EduVideo video = eduVideoService.getById(id);
String videoSourceId = video.getVideoSourceId();//调用vod的删除视频的方法if(!StringUtils.isEmpty(videoSourceId)){
vodClient.deleteVideoById(videoSourceId);}//删除小节boolean flag = eduVideoService.removeById(id);return flag ? R.ok(): R.error();}
实现原理
调用VodClient中的方法时会根据指定的服务名去远程调用service_vod中的方法,相当于创建实现类调用
7、问题
启动edu时控制台报错:No Feign Client for loadBalancing defined. Did you forget to include spring-cloud-starter-loadbalancer?
加上了依赖
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-loadbalancer</artifactId></dependency>
之后还是在删除小节的时候报错:
Receiver classorg.springframework.cloud.netflix.ribbon.RibbonLoadBalancerClient does not define or
之后将父工程pom文件中的springboot和springcloud的版本降低了之后就可以了,上面的loadbalancer依赖也去掉
<parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.2.1.RELEASE</version><relativePath/></parent><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>Hoxton.RELEASE</version><type>pom</type><scope>import</scope></dependency>
参考:https://blog.csdn.net/padawan75/article/details/112616053
创建删除多个视频的方法,使用多个视频id的list集合作为参数,调用service的方法
@DeleteMapping("deleteMultiVideos")public R deleteMultiVideos(@RequestParam("videoIdList") List videoIdList){
vodService.deleteMultiVideos(videoIdList);return R.ok();}
if(!StringUtils.isEmpty(videoSourceId)){
R r = vodClient.deleteVideoById(videoSourceId);if(r.getCode()==20001){thrownewOrangeException(20001,"删除视频失败,熔断器执行");}}