正常状况下,咱们使用Feign通常使用方式以下spring
(1)声明服务接口app
@FeignClient(name = "hello",fallback = HelloServiceImpl.class)ide
public interface HelloService {spa
@GetMapping("hello")插件
public String hello();调试
}接口
改接口已经指定了降级处理代码get
(2)实现降级处理代码class
package com.easystudy.service.impl;import
import org.springframework.stereotype.Service;
import com.easystudy.service.HelloService;
import lombok.extern.slf4j.Slf4j;
@Service
@Slf4j // 不想每次都写private final Logger logger = LoggerFactory.getLogger(XXX.class);
// @Slf4j注入后找不到变量log,那就给IDE安装lombok插件
public class HelloServiceImpl implements HelloService {
@Override
public String hello() {
log.info("调用{}失败","hello");
return "调用hello失败";
}
}
可是问题来了,虽然咱们定义了降级处理代码,可是在降级处理代码中,咱们没法知道失败的具体细节,也就是没法拿到失败或错误的缘由,因此调试过程或排错过程就是意见很麻烦的事情了。为了解决这个问题,咱们必须能拿到对应错误码才行,咱们使用fallback工厂,而不是fallback。
fallbackFactory 实现以下:
(1)接口声明
@FeignClient(name = "hello",/*fallback = HelloServiceImpl.class,*/ fallbackFactory=HelloServiceFallbackFactory.class)
public interface HelloService {
@GetMapping("hello")
public String hello();
}
这里咱们指定了fallbackFactory,也就是由它来完成降级代码的生成。
(2)实现降级工厂
/**
* 错误处理
* @author Administrator
*/
@Component class HelloServiceFallbackFactory implements FallbackFactory<HelloService>{
@Override
public HelloService create(Throwable cause) {
System.out.println("请求错误:" + cause.getMessage());
// 降级处理
return new HelloService() {
@Override
public String hello() {
return "调用失败,请肯定服务是否启动或稍后重试!";
}
};
}
}
此处,咱们打印了具体的错误信息,而且返回了一个实现了HelloService接口的匿名类,也就是实现了降级服务接口。
注意,此处必须将fallback注释掉,采用fallbackFactory方式。fallbackFactory是为指定的客户端接口定义一个回退工厂。回退工厂必须产生回退类的实例,这些实例实现由FeignClient注释的接口。若是同时设置fallback和fallbackfactory不能够的,会有有冲突,fallback生效,fallbackfactory不能使用,fallbackFactory 是fallback的一个升级版,注释fallback设置便可.