HelloClientFailImpl.java
@Component("fallback") @Slf4j public class HelloClientFailImpl implements IHelloClient{ @Override public String hello(String name) { log.error("restTemplate调用[hello]服务发生熔断,参数name:{}", name); return "restTemplate调用[hello]服务发生熔断,参数name:" + name; } }HelloClientFallbackFactory/java
@Component @Slf4j public class HelloClientFallbackFactory implements FallbackFactory<IHelloClient>{ @Autowired @Qualifier("fallback") IHelloClient helloClient; @Override public IHelloClient create(Throwable cause) { log.error("feign调用发生异常,触发熔断", cause); return helloClient; } }可以知道,正常fallback就是一个接口的实现类,当发送异常时,会调用此接口实现类进行服务调用。而FallbackFactory是也是一个接口实现类,需要实现feign.hystrix.FallbackFactory<T>接口,在发生熔断时,调用create方法,同时返回被调用接口的实现类,以便进行fallback处理。
3.配置文件开启feign的熔断器功能。
feign.hystrix.enabled=true或者,申明一个Feign.Builder类也是可以的,我们从org.springframework.cloud.openfeign.FeignClientsConfiguration可以看出,启用feign的条件:
所以正常,我们只需要在配置文件中加入feign.hystrix.enabled为true即可,注意:此属性在IDE下未进行提示的。
或者就如此类一样,申明一个bean:
也是可以的。
4.编写一个测试类FeignController:
/** * feign 熔断器示例 * @author oKong * */ @RestController @Slf4j public class FeignController { @Autowired IHelloClient helloClient; @GetMapping("/feign") public String hello(String name) { log.info("使用feign调用服务,参数name:{}", name); return helloClient.hello(name); } }5.再次启动应用,访问::8038/feign?name=oKong ,正常调用如下:
关闭服务提供者,再次访问,浏览器返回了错误提示:
同时,我们使用了FallbackFactory,控制台打印出了具体异常:
针对熔断超时时间等相关设置,可以通过@HystrixCommand注解的各属性进行配置,主要还是commandProperties属性值,具体的参数可查看com.netflix.hystrix.HystrixCommandProperties类,也可以针对某个调用方法进行特殊设置。具体的可以看看这篇文章:hystrix的基本介绍和配置属性说明,或者可以去大佬程序员DD博客查阅下关于Hystrix相关知识点:服务容错保护(Hystrix断路器)【Dalston版】、服务容错保护(Hystrix依赖隔离)【Dalston版】,版本虽然是D版的,但原理是差不多的~
参考资料 总结本章节主要讲解了如何整合Hystrix。本身Hystrix已经包含了服务降级、依赖隔离、熔断器等功能了,我们使用时并没进行特殊设置,默认都是生效的。对于一些关于Hystrix的高级用法,比如信号量隔离、线程池的设置等等,还有一些像超时时间等,由于此方面了解的不多,这里就不班门弄斧了。大家可去官方网站或者谷歌搜索下相关材料下,对于一些业务场景,可进行一些自定义设置。主要还是针对@HystrixCommand注解的相关配置。关于调用统一异常的处理相关实践,比如当提供方异常时,调用方如何进行统一异常处理,或者服务不可用时,进行统一的异常捕获,告知外围调用者服务不可用等信息。这些相关实践部分会在之后的实践篇系列文章中进行阐述的,也许不是最佳的实践,仅希望提供一个参考方案吧。这里就不表了,敬请期待~
最后目前互联网上大佬都有分享SpringCloud系列教程,内容可能会类似,望多多包涵了。原创不易,码字不易,还希望大家多多支持。若文中有错误之处,还望提出,谢谢。
老生常谈个人QQ:499452441
微信公众号:lqdevOps
个人博客:
源码示例:https://github.com/xie19900123/spring-cloud-learning