feign整合hystrix
原创
©著作权归作者所有:来自51CTO博客作者Denial_learn的原创作品,请联系作者获取转载授权,否则将追究法律责任
feign 默认是支持hystrix的,但是在Spring cloud Dalston 版本之后就默认关闭了, 因为业务需求不一定要使用;所以现在要使用首先得打开他,在yml文件加上如下配置:
feign.hystrix.enabled=true
加上配置之后降级方法怎么写呢?
@FeignClient(value="34-SPRINGCLOUD-SERVICE-GOODS", fallback = GoodsRemoteClientFallBack.class)
public interface GoodsRemoteClient {
/**
* 声明一个feign的接口,它的实现是服务提供者的controller实现
*
* @return
*/
@RequestMapping("/service/goods")
public ResultObject goods();
}
在feign客户端的注解上 有个属性叫fallback 然后指向一个类GoodsRemoteClientFallBack类:
@Component
public class GoodsRemoteClientFallBack implements GoodsRemoteClient {
@Override
public ResultObject goods() {
return new ResultObject(Constant.ONE,"feign服务调用降级");
}
}
如此方法降级便可以了;
当然如果需要拿到具体的服务错误信息,那么可以这样:
客户端指定一个fallbackFactory即可;
@FeignClient(value="34-SPRINGCLOUD-SERVICE-GOODS", fallbackFactory = GoodsRemoteClientFallBackFactory.class)
public interface GoodsRemoteClient {
/**
* 声明一个feign的接口,它的实现是服务提供者的controller实现
*
* @return
*/
@RequestMapping("/service/goods")
public ResultObject goods();
}
@Component
public class GoodsRemoteClientFallBackFactory implements FallbackFactory<GoodsRemoteClient> {
@Override
public GoodsRemoteClient create(Throwable throwable) {
return new GoodsRemoteClient() {
@Override
public ResultObject goods() {
String message = throwable.getMessage();
System.out.println("feign远程调用异常:" + message);
return new ResultObject();
}
};
}
}
这个message 就是错误信息,至此,就完成了feign与hystrix的整合;
Spring Cloud Feign超时时间设置
Feign调用服务的默认时长是1秒钟,也就是如果超过1秒没连接上或者超过1秒没响应,那么会相应的报错。而实际情况是因为业务的不同可能出现超出1秒的情况,这时我们需要调整超时时间。
Feign 的负载均衡底层用的就是 Ribbon在application.properties中添加如下配置,超过5秒没连接上报连接超时,如果超过5秒没有响应,报请求超时;
# 参考RibbonClientConfiguration
# 请求连接的超时时间 默认的时间为 1 秒
ribbon.ConnectTimeout=5000
# 请求处理的超时时间
ribbon.ReadTimeout=5000
ribbon还有MaxAutoRetries对当前实例的重试次数,
MaxAutoRetriesNextServer对切换实例的重试次数,
如果ribbon的ReadTimeout超时,或者ConnectTimeout连接超时,会进行重试操作
由于ribbon的重试机制,通常熔断hystrix的超时时间需要配置的比ReadTimeout长,ReadTimeout比ConnectTimeout长,否则还未重试,就熔断了;
为了确保重试机制的正常运作,理论上(以实际情况为准)建议hystrix的超时时间为:(1 + MaxAutoRetries + MaxAutoRetriesNextServer) * ReadTimeout