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方式请求,只有连接异常时,才会进行重试

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值