前情回顾
上章节我们讲了消费者调用生产者的两种方案。
调用过程中出现异常或者服务不可用怎么办呢?
管它呢,直接返回给客户错误信息....
这个?这个?这样做貌似不是一个合格程序员做的事情吧,我们应该遵循友好性原则,友情提示下。
那这就是本篇的主题FeignClient中使用熔断机制Hystrix进行服务熔断友情提示
小插曲
说来也惭愧,项目弄了3个月了刚开始也是集成了熔断机制的,可以SpringCloud一升级发现不起作用了,也就不用管这块,突然在整理本章内容的时候,发现了原因,现在共享给大家,希望有所帮助。(我们时共同进步的机制,所以有问题在下面发表你的看法,有问必有答)
概念扫盲
在微服务架构中,根据业务来拆分成一个个的服务,服务与服务之间可以相互调用(RPC),在Spring Cloud可以用RestTemplate+Ribbon和Feign来调用。为了保证其高可用,单个服务通常会集群部署。由于网络原因或者自身的原因,服务并不能保证100%可用,如果单个服务出现问题,调用这个服务就会出现线程阻塞,此时若有大量的请求涌入,Servlet容器的线程资源会被消耗完毕,导致服务瘫痪。服务与服务之间的依赖性,故障会传播,会对整个微服务系统造成灾难性的严重后果,这就是服务故障的“雪崩”效应。为了解决这个问题,业界提出了断路器模型。
Netflix开源了Hystrix组件,实现了断路器模式,SpringCloud对这一组件进行了整合。 在微服务架构中,一个请求需要调用多个服务是非常常见的
来张图
Demo开始
强大的springcloud-01-eureka-producer-consumer模块,没错,本章内容还是以这个模块为demo,已经很多章节都是以此模块讲解了,是不是有必要下载下源码呢?(文末共享)
以下代码在消费者spring-cloud-consumer添加
首先是pom引入(和上章节一样,木变化)
我们用的是spring-cloud-starter-openfeign核心包
接下就是Service层了
看看和上篇有哪些变化
发现有什么不同了吗?没错的,相信已经看到了,就这么简单加上fallbackFactory即可
fallbackFactory = HelloServiceFallbackFactory.class
然后HelloServiceFallbackFactory 实现FallbackFactory接口就ok了
HelloServiceFallbackFactory 类
注意点:加上注解@Component 不要忘记 ;然后实现每个方法的返回值就ok了
启动类 (也很关键)
对的只需要加上@EnableFeignClients即可,但是这边有几个知识点,一定要要牢记,EnableFeignClients功能
1.支持Hystrix和他的fallback
2.支持ribbon 的负载均衡
3.启动时会进行包扫
Controller层
结束,为了本章完整性,在加一下controller吧(和上章木有变化)
启动项目开始测试
测试
访问controller结果返回,正确,收工?
这就测试完成了?我们还忘了配置文件的配置吧,不是忘记了,是因为太重要了,我们放在这里讲解
配置文件(最后几项)
spring.application.name=spring-cloud-consumerserver.port=9001eureka.client.serviceUrl.defaultZone=http://localhost:7001/eureka/#开启熔断feign.hystrix.enabled=true#是否开启超时熔断, 如果为false, 则熔断机制只在服务不可用时开启hystrix.command.default.execution.timeout.enabled=true# 设置超时熔断时间hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds=6000
测试流程:关闭掉spring-cloud-provider模块的生产者,此时是没有服务的,消费者者访问理应触发熔断机制。
一:我们要是不开启熔断feign.hystrix.enabled,会有什么效果呢(如下图,还是会报错的,熔断没起作用)
二:feign.hystrix.enabled=true开启后
结论:熔断生效
至于最后熔断超时设置,验证就很简单了(启动消费者在生产者打上断点,消费者自然就超时了)
未打断点返回数据:hello spring-cloud zhangsan1
开始打断点:
打上之后返回:连接超时,稍后重试
结论:超时设置生效
End
案例很简单,要学会动手实践,SpringCloud极简入门系列文章结束后,即将开启高级架构实战篇欢迎转发关注
有问题可随时@架构师速成记
源码:https://github.com/shinians/springcloud-demos