白话SpringCloud | 第五章:服务容错保护(Hystrix) (3)

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的条件:

HystrixFeignConfiguration

所以正常,我们只需要在配置文件中加入feign.hystrix.enabled为true即可,注意:此属性在IDE下未进行提示的。
或者就如此类一样,申明一个bean:

@Bean public Feign.Builder feignHystrixBuilder() { return HystrixFeign.builder(); }

也是可以的。

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

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zyfygp.html