之前我们将 Hystrix 引入到了商品模块,但是如果这样去写,会和商品模块的业务代码耦合度太高,不利于维护,所以需要解耦。
我们这里是整合 Feign 与 Hystrix,所以需要将 Hystrix 引入到订单模块中去。
一、项目修改
订单模块
pom
<!-- hystrix 断路器 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
<version>2.2.9.RELEASE</version>
</dependency>
增加 feign 远程调用的具体实现
之前我们的 feign 远程调用是一个接口,现在我们给这个接口弄一个实现类。
这里实现类其实就是熔断降级要走的方法,写好之后,再回到 feign 中进行配置~~~
yml
yml 中我们需要开启 feign 对 Hystrix 的支持。
feign:
client:
config:
default: # 这里就是指的所有被加载的默认FeignClient实现的服务配置都生效
connectTimeout: 1000
readTimeout: 2000
circuitbreaker:
enabled: true
之前版本添加支持是通过
feign:
hystrix:
enabled: true
这样的形式进行添加的,但是现在改成了 feign.circuitbreaker.enabled ~~
商品模块
商品模块我们当时弄了三个,现在自己找一个没有引入 Hystrix 的模块进行修改。
要增加的代码很简单~~~,这里休眠 2 秒。
二、测试 1
我们将之前数据库中的数据清除掉,然后启动 Eureka Server 集群,以及两个业务模块。
可以看到,调用的话是正常的,返回 code 值 200,我们来看看日志。
可以看到,Feign 调用商品模块的时候,服务被熔断了~~~(这里是因为 Hystrix 导致我们的服务被熔断,可以看请求时间。)
三、测试 2
我们在订单模块中增加 Hystrix 超时时间
这里要注意一点,一定要将 Hystrix 的超时时间超过上面 feign 的超时时间。
再来测试~~~
这个和上面测试的结果很类似,请求返回的 code 也是 200,再来看日志。
日志也是一样。
但是,细心的人可能已经发现问题了。我们两次测试的结果虽然效果是一样的,但是!!!超时机制的拦截缺不一样。
第一次测试的超时是因为 Hystrix 导致,因为 Hystrix 的超时默认是 1 秒,而 Feign 是 2 秒(要看读取时间),我们程序响应需要 2 秒,所以这里 Hystrix 就已经帮我们做服务熔断降级处理了。
而第二次测试,我们在订单模块中增加了 Hystrix 的超时时间配置,将之前的 1 秒提高到了 3 秒,其他的没变,但是我们可以看响应时间,是 2.08 秒,也就是说,我们这次是因为超过了 Feign 的读取超时时间,所以 Feign 将服务熔断降级了。
四、Feign 整合 Hystrix 后超时机制
通过上面的两次测试,可以看出第二次测试结果,业务请求根本没有过 Hystrix。
所以这里是强制要求,openFeign 的超时时间一定要大于 Hystrix,否则我们配置的 Hystrix 根本没有用。
这一讲就讲到这里,有问题可以联系我:QQ 2100363119,欢迎大家访问我的个人网站:https://www.lemon1234.com
最近网站已经做好,并且已经上线,欢迎各位留言~~