Feign提供了Hystrix的支持,只需要简单的几个配置,就可以实现与Hystrix的整合。
与Hystrix的整合
在前文示例的基础上,我们来加入Hystrix的支持。
- 在
pom.xml
文件中加入Hystrix的依赖
1 | <dependency> |
- 在
application.yml
文件中打开Feign的Hystrix的开关
1 | feign: |
- 在应用启动类中加入
@EnableCircuitBreaker
注释,开启hystrix
1 |
|
- 在
ComputeClient
中加入服务调用失败的回退
1 | "eureka-client", fallback = ComputeClient.Fallback.class) (value = |
我们加入了一个minus的服务调用,因为这个服务不存在,因此对它的调用总是会进入回退逻辑中。我们以此来判断Hystrix是否生效。
- 在
ComputeController
中增加对minus服务的调用
1 |
|
访问http://localhost:8765/minus?a=5&b=1
,发现结果返回-1
,说明Hystrix已经生效了。
超时设置
为了测试Hystrix的超时效果,我们将add服务延时800ms,然后配置Hystrix的超时时间:
1 | hystrix: |
这里我们设置了add服务的超时时间。
Feign与Hystrix整合使用时,会自动帮我们生成CommandKey,格式为:Feign客户端接口名#方法名(参数类型)
。例如本例中的客户端为ComputeClient,方法为add,参数为两个Integer,生成的CommandKey为ComputeClient#add(Integer,Integer)
。
如果要针对全局做配置,则需要使用:
1 | hystrix: |
经过上面的配置,我们知道add()方法总是会超时,从而调用失败回退逻辑。
断路器状态
默认情况下,10s内请求超过20次,且失败率超过50%,断路器将被打开。我们来看看是否是这样的。
控制器方法中获取add方法的断路器,并输出其状态。
1 | "/add", method = RequestMethod.GET) (value = |
接下来,编写一个测试客户端,多线程访问控制器方法:
1 |
|
执行后可以看到服务消费者控制台输出如下:
1 | 断路器状态:false |
可以看到,经过20次调用失败后,断路器打开。
重试
Feign的重试依赖于Ribbon,因此只需要加入如下Ribbon的配置就可以实现重试:
1 | eureka-client: |
如果要进行全局配置,加入如下配置:
1 | ribbon: |