1.引入依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
</dependency>
<!--hystrix依赖,主要是用 @HystrixCommand -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
2.在调用端(服务消费者)的application.properties文件配置熔断器
#开启熔断机制
feign.hystrix.enabled=true
# 设置hystrix超时时间,默认1000ms
hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds=6000
3.创建服务接口的实现类
在调用端(服务消费者端)为了调用其他服务的方法 在本模块中创建了一个接口 使用熔断器 当被调用的服务挂掉时 执行这个接口实现类的方法
@Component
public class VodDegradeFeignClient implements VodClient{
@Override
public R deleteAliyunVideo(String videoId) {
return R.error().message("删除小节删除视频失败,执行熔断器。。。");
}
@Override
public R deleteBacthVideoIds(List<String> videoIdList) {
return return R.error().message("删除课程删除视频失败,执行熔断器。。。");
}
}
注: 修改在接口的注解 添加上fallback属性
@Component
@FeignClient(name="service-vod",fallback = VodDegradeFeignClient.class)//需要调用的服务名(在nacos中注册的)
public interface VodClient {
在实现类上面记得加@Component注解
4.测试
@DeleteMapping("deleteVideo/{videoId}")
public R deleteVideo(@PathVariable String videoId){//这里的videoId是小节id
//通过小节videoId得到 小节对象
EduVideo eduVideo = eduVideoService.getById(videoId);
//通过小节对象得到视频id
String videosourseId = eduVideo.getVideoSourceId();
if(!StringUtils.isEmpty(videosourseId)) {
//先删视频再删小节 否则得到的视频id为空
System.out.println("videosourseId:"+videosourseId);
//调用另一个服务中的方法
//打了断点之后 用 debug的方式启动eduApplication.java
//测试熔断器 当调用vodClient中的方法出错 执行vodClient实现类中的方法
R result = vodClient.deleteAliyunVideo(videosourseId);
if(result.getCode() == 20001){
throw new MyException(20001,"删除小节视频失败,抛出自定义异常");
}
}
eduVideoService.removeById(videoId);
return R.ok();
}
在service_edu的EduVideoController中 删小节调用service_vod服务删阿里云视频的方法处打上断点 debug的方式启动EduApplication.java
然后正常启动其他服务 上传好视频
手动停掉service_vod服务 再在页面删小节时 因为vod服务挂掉了 不能再service_edu中通过vodClient接口去调用删阿里云端视频的方法 熔断器就会去执行vodClient实现类中的方法