老鸟飞过,学习使用,欢迎交流
九.Feign开启Hystrix在学习Feign的那一章节我们了解到Feign已经集成了Hystrix,但是在高版本关闭了Hystrix功能,我们这一章节就来学习在Feign里面如何使用Hystrix。
1.支付服务集成Hystrix官方文档:https://cloud.spring.io/spring-cloud-static/Greenwich.SR5/single/spring-cloud.html#spring-cloud-feign-hystrix
支付服务 springcloud-pay-server-1040 之前集成了Feign,修改该工程集成Hystrix。我们除了要给Feign开启Hystrix以外还需要为Feign接口编写托底类。
1.1.开启Hystrix通过feign.hystrix.enabled=true
开启Hystrix
feign:
hystrix:
enabled: true #开启熔断支持
ribbon:
ReadTimeout: 3000
SocketTimeout: 3000
ConnectTimeout: 3000
hystrix:
command:
default:
execution:
isolation:
thread:
timeoutInMilliseconds: 10300
2.2.Fiegn接口熔断-fallback方式
服务通过Feign接口调用异常或超时需要触发降级,返回托底数据。这里有两种方式,分别是通过@FeignClient(fallback=…) ,以及@FeignClient(fallbackFactory=…) 来指定托底类,区别在于通过fallback的方式编写的托底是没办法打印出异常日志的 ,而fallbackFactory方式是可以打印出异常日志, 我们先来看第一种写法:
@FeignClient(value = "user-server",fallback = UserFeignClientFallback.class)
public interface UserFeignClient {
//订单服务来调用这个方法 http://localhost:1020/user/10
// @GetMapping(value = "/user/{id}" )
@RequestMapping(value = "/user/{id}",method = RequestMethod.GET)
User getById(@PathVariable("id")Long id);
}
提示: fallback = UserFeignClientFallback.class : 该类是当前接口的实现类 ,也是托底数据所在的处理类
托底实现类:
//让Spring扫描到该托底类
@Component
public class UserFeignClientFallback implements UserFeignClient {
//日志打印器
private Logger log = LoggerFactory.getLogger(UserFeignClientFallback.class);
@Override
public User getById(Long id) {
log.info("用户服务不可用");
//托底数据
return new User(-1l,"无此用户","用户服务不可用");
}
}
提示:注意,这里托底类需要交给Spirng管理,类上需要打 @Component 注解 , 拖地类需要实现 Feign接口,复写接口中的方法作为托底方法返回拖地数据。当Fiegn调用失败就会以拖地方法返回的结果返回给用户
启动测试
依次启动 springcloud-eureka-server-1010 , springcloud-user-server-1020, springcloud-pay-server-1030 , 访问:http://localhost:1040/pay/1 观察浏览器是否正常拿到结果,然后关闭 springcloud-user-server-1020工程观察浏览器是否返回托底数据。
这种方式及时触发托底了也看不到异常日志。
2.3.Fiegn接口熔断-fallbackFactory方式使用fallbackFactory属性,使用工厂方式指定托底
//@FeignClient(value = "user-server",fallback = UserFeignClientFallback.class)
@FeignClient(value = "user-server",fallbackFactory = UserFeignClientFallbackFactory.class)
public interface UserFeignClient {
//订单服务来调用这个方法 http://localhost:1020/user/10
// @GetMapping(value = "/user/{id}" )
@RequestMapping(value = "/user/{id}",method = RequestMethod.GET)
User getById(@PathVariable("id")Long id);
}
编写托底类 工程方式的托底类需要去实现 FallbackFactory接口 ,并指定泛型为“”Feign客户端接口(UserFeignClient )。FallbackFactory的create方法返回了Feign客户端接口的实例,该方法的throwable是参数是Feign调用失败的异常信息,如下:
//工厂方式的 , 托底类
@Component
public class UserFeignClientFallbackFactory implements FallbackFactory{
//拖地方法 : throwable,异常
@Override
public UserFeignClient create(Throwable throwable) {
//返回UserFeignClient 接口的实例
return new UserFeignClient() {
@Override
public User getById(Long id) {
//把异常信息打印到控制台
throwable.printStackTrace();
//真正拖地方法 , 这里的数据是托底数据
return new User(-1L,"无此用户","用户服务不可用");
}
};
}
}
启动测试
测试方式同上 ,只是这种方式触发托底是可以在控制台看到异常信息,方便我们调试。