SpringCloud 教程 | 第七篇: 服务消费者整合(Feign+Ribbon)设置超时时间和重试机制进行服务熔断降级(SpringBoot)(2.X版本)
SpringCloud 教程 | 第七篇: 服务消费者整合(Feign+Ribbon)设置超时时间和重试机制进行服务熔断降级(SpringBoot)(2.X版本)
前言:
SpringCloud 微服务之间调用的时候,我们使用Feign和Ribbon技术;比如其中有一个实例发生了故障而该情况还没有被服务治理机制及时的发现和摘除,这时候客户端访问该节点的时候自然就会失败。所以,为了构建更加健壮的服务应用系统,我们希望当请求失败的时候能够有一定的策略进行重试机制,而不是直接返回失败信息。
一、进行项目配置
1.1 添加pom依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
1.2 添加配置文件信息
#(Feign+Ribbon)设置超时时间和重试机制进行服务Hystrix熔断降级
#开启Feign熔断支持
feign.hystrix.enabled=true
#设置hystrix熔断器检测时间(默认1秒)
hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds=16000
#开启Eureka支持Ribbon
ribbon.eureka.enabled=true
# false只对get请求进行重试,true对所有请求都进行重试
ribbon.OkToRetryOnAllOperations=false
#负载均衡超时时间,默认值5000
ribbon.ReadTimeout=5000
#ribbon请求连接的超时时间,默认值2000
ribbon.ConnectTimeout=2000
#对当前实例的重试次数,默认0 设置为2次 加上自身1次 总共3次请求 每次最大超时时间5000
# 3*5000=15000 要小于hystrix的时间16000 要不然重试没完成就hystrix熔断了
ribbon.MaxAutoRetries=2
#对切换实例的重试次数,默认1
ribbon.MaxAutoRetriesNextServer=0
二、启动项目
2.1 启动 8900注册中心、8901提供者、8902消费者服务
三、开始测试验证
3.1 浏览器访问 http://localhost:8902/swagger-ui.html
3.2 正常情况下 测试getTest 和 postTest接口
结论:请求都返回成功。
3.3 测试第一种情况: 我们在8901服务提供者接口处打入Debug模式卡住让处于等待状态 直到客户端服务超时-触发Hystrix的熔断机制
首先测试get请求触法Ribbon重试机制
开启重启机制:对当前实例重试2次
#对当前实例的重试次数,默认0 设置为2次 加上自身1次 总共3次请求 每次最大超时时间5000
#3*5000=15000 要小于hystrix的时间16000 要不然重试没完成就hystrix熔断了
ribbon.MaxAutoRetries=2
3.3图1:
3.3图2:
3.3图3:
3.3图4:
结论:经过以上4张图,Ribbon触发了失败重试机制(设置为2次 加上自身1次 总共3次请求)
控制台的Debug处的信息输出了3次,测试成功。
3.4 测试 开启重启机制:对当前实例重试1次
#设置为1次 加上自身1次 总共2次请求
ribbon.MaxAutoRetries=1
结论:Ribbon触发了失败重试机制(设置为1次 加上自身1次 总共2次请求)控制台的Debug处的信息输出了2次,测试成功。
3.5 测试post请求不会触法Ribbon重试机制
# false只对get请求进行重试,true对所有请求都进行重试
ribbon.OkToRetryOnAllOperations=false
#负载均衡超时时间,默认值5000
ribbon.ReadTimeout=5000
3.5图1:
3.5图2:
3.5图3:
3.5图4:
结论:根据以上4图分析得出,post请求幷没有触发Ribbon重试机制。
3.6 开启post请求重试机制,进行测试验证一下
# false只对get请求进行重试,true对所有请求都进行重试
ribbon.OkToRetryOnAllOperations=true
3.6图1:
3.6图2:
3.6图3:
3.6图4:
结论:根据以上4个图分析,post请求允许触发Ribbon重试机制成功。
四、总结:
当ribbon.OkToRetryOnAllOperations=false,只会对get请求进行重试。
注意事项:
4.1、如果ribbon.OkToRetryOnAllOperations设置为true,便会对所有的请求进行重试,如果是put或post等写操作,如果服务器接口没做幂等性,会产生不好的结果,所以ribbon.OkToRetryOnAllOperations慎用。
4.2、如果不配置ribbon的重试次数,默认会重试一次 。
4.3、默认情况下,GET方式请求无论是连接异常还是读取异常,都会进行重试 ,非GET方式请求,只有连接异常时,才会进行重试
本文地址:https://blog.csdn.net/weixin_42277978/article/details/109263087
上一篇: SpringBoot-日志默认配置