九.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 ReadTimeout3000 SocketTimeout3000 ConnectTimeout3000hystrix command default execution isolation thread timeoutInMilliseconds10300
2.2.Fiegn接口熔断-fallback方式
服务通过Feign接口调用异常或超时需要触发降级,返回托底数据。这里有两种方式,分别是通过@FeignClient(fallback=…) ,以及@FeignClient(fallbackFactory=…) 来指定托底类,区别在于通过fallback的方式编写的托底是没办法打印出异常日志的 ,而fallbackFactory方式是可以打印出异常日志, 我们先来看第一种写法:
value="user-server",fallback=UserFeignClientFallback.class) (publicinterfaceUserFeignClient { //订单服务来调用这个方法 http://localhost:1020/user/10// @GetMapping(value = "/user/{id}" )value="/user/{id}",method=RequestMethod.GET) (UsergetById( ("id")Longid); }
提示: fallback = UserFeignClientFallback.class : 该类是当前接口的实现类 ,也是托底数据所在的处理类
托底实现类:
//让Spring扫描到该托底类publicclassUserFeignClientFallbackimplementsUserFeignClient { //日志打印器privateLoggerlog=LoggerFactory.getLogger(UserFeignClientFallback.class); publicUsergetById(Longid) { log.info("用户服务不可用"); //托底数据returnnewUser(-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)value="user-server",fallbackFactory=UserFeignClientFallbackFactory.class) (publicinterfaceUserFeignClient { //订单服务来调用这个方法 http://localhost:1020/user/10// @GetMapping(value = "/user/{id}" )value="/user/{id}",method=RequestMethod.GET) (UsergetById( ("id")Longid); }
编写托底类
工程方式的托底类需要去实现 FallbackFactory接口 ,并指定泛型为“”Feign客户端接口(UserFeignClient )。FallbackFactory的create方法返回了Feign客户端接口的实例,该方法的throwable是参数是Feign调用失败的异常信息,如下:
//工厂方式的 , 托底类publicclassUserFeignClientFallbackFactoryimplementsFallbackFactory<UserFeignClient>{ //拖地方法 : throwable,异常publicUserFeignClientcreate(Throwablethrowable) { //返回UserFeignClient 接口的实例returnnewUserFeignClient() { publicUsergetById(Longid) { //把异常信息打印到控制台throwable.printStackTrace(); //真正拖地方法 , 这里的数据是托底数据returnnewUser(-1L,"无此用户","用户服务不可用"); } }; } }
启动测试
测试方式同上 ,只是这种方式触发托底是可以在控制台看到异常信息,方便我们调试。