欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

SpringCloud 教程 | 第七篇: 服务消费者整合(Feign+Ribbon)设置超时时间和重试机制进行服务熔断降级(SpringBoot)(2.X版本)

程序员文章站 2022-04-15 18:50:09
SpringCloud 教程 | 第七篇: 服务消费者整合(Feign+Ribbon)设置超时时间和重试机制进行服务熔断降级(SpringBoot)(2.X版本)前言:SpringCloud 微服务之间调用的时候,我们使用Feign和Ribbon技术;比如其中有一个实例发生了故障而该情况还没有被服务治理机制及时的发现和摘除,这时候客户端访问该节点的时候自然就会失败。所以,为了构建更加健壮的服务应用系统,我们希望当请求失败的时候能够有一定的策略进行重试机制,而不是直接返回失败信息。一、进行项目配置1....

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消费者服务
SpringCloud 教程 | 第七篇: 服务消费者整合(Feign+Ribbon)设置超时时间和重试机制进行服务熔断降级(SpringBoot)(2.X版本)
三、开始测试验证
3.1 浏览器访问 http://localhost:8902/swagger-ui.html
SpringCloud 教程 | 第七篇: 服务消费者整合(Feign+Ribbon)设置超时时间和重试机制进行服务熔断降级(SpringBoot)(2.X版本)3.2 正常情况下 测试getTest 和 postTest接口
SpringCloud 教程 | 第七篇: 服务消费者整合(Feign+Ribbon)设置超时时间和重试机制进行服务熔断降级(SpringBoot)(2.X版本)
SpringCloud 教程 | 第七篇: 服务消费者整合(Feign+Ribbon)设置超时时间和重试机制进行服务熔断降级(SpringBoot)(2.X版本)结论:请求都返回成功。

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:
SpringCloud 教程 | 第七篇: 服务消费者整合(Feign+Ribbon)设置超时时间和重试机制进行服务熔断降级(SpringBoot)(2.X版本)3.3图2:
SpringCloud 教程 | 第七篇: 服务消费者整合(Feign+Ribbon)设置超时时间和重试机制进行服务熔断降级(SpringBoot)(2.X版本)3.3图3:
SpringCloud 教程 | 第七篇: 服务消费者整合(Feign+Ribbon)设置超时时间和重试机制进行服务熔断降级(SpringBoot)(2.X版本)3.3图4:
SpringCloud 教程 | 第七篇: 服务消费者整合(Feign+Ribbon)设置超时时间和重试机制进行服务熔断降级(SpringBoot)(2.X版本)结论:经过以上4张图,Ribbon触发了失败重试机制(设置为2次 加上自身1次 总共3次请求)
控制台的Debug处的信息输出了3次,测试成功。

3.4 测试 开启重启机制:对当前实例重试1次

#设置为1次 加上自身1次 总共2次请求
ribbon.MaxAutoRetries=1

SpringCloud 教程 | 第七篇: 服务消费者整合(Feign+Ribbon)设置超时时间和重试机制进行服务熔断降级(SpringBoot)(2.X版本)SpringCloud 教程 | 第七篇: 服务消费者整合(Feign+Ribbon)设置超时时间和重试机制进行服务熔断降级(SpringBoot)(2.X版本)结论:Ribbon触发了失败重试机制(设置为1次 加上自身1次 总共2次请求)控制台的Debug处的信息输出了2次,测试成功。

3.5 测试post请求不会触法Ribbon重试机制

# false只对get请求进行重试,true对所有请求都进行重试
ribbon.OkToRetryOnAllOperations=false
#负载均衡超时时间,默认值5000
ribbon.ReadTimeout=5000

3.5图1:
SpringCloud 教程 | 第七篇: 服务消费者整合(Feign+Ribbon)设置超时时间和重试机制进行服务熔断降级(SpringBoot)(2.X版本)3.5图2:
SpringCloud 教程 | 第七篇: 服务消费者整合(Feign+Ribbon)设置超时时间和重试机制进行服务熔断降级(SpringBoot)(2.X版本)3.5图3:
SpringCloud 教程 | 第七篇: 服务消费者整合(Feign+Ribbon)设置超时时间和重试机制进行服务熔断降级(SpringBoot)(2.X版本)3.5图4:
SpringCloud 教程 | 第七篇: 服务消费者整合(Feign+Ribbon)设置超时时间和重试机制进行服务熔断降级(SpringBoot)(2.X版本)结论:根据以上4图分析得出,post请求幷没有触发Ribbon重试机制。

3.6 开启post请求重试机制,进行测试验证一下

# false只对get请求进行重试,true对所有请求都进行重试
ribbon.OkToRetryOnAllOperations=true

3.6图1:
SpringCloud 教程 | 第七篇: 服务消费者整合(Feign+Ribbon)设置超时时间和重试机制进行服务熔断降级(SpringBoot)(2.X版本)3.6图2:
SpringCloud 教程 | 第七篇: 服务消费者整合(Feign+Ribbon)设置超时时间和重试机制进行服务熔断降级(SpringBoot)(2.X版本)3.6图3:
SpringCloud 教程 | 第七篇: 服务消费者整合(Feign+Ribbon)设置超时时间和重试机制进行服务熔断降级(SpringBoot)(2.X版本)3.6图4:
SpringCloud 教程 | 第七篇: 服务消费者整合(Feign+Ribbon)设置超时时间和重试机制进行服务熔断降级(SpringBoot)(2.X版本)结论:根据以上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