SpringCloud学习笔记(六)-Zuul及Feign的超时时间测试

本文涉及的产品
传统型负载均衡 CLB,每月750个小时 15LCU
网络型负载均衡 NLB,每月750个小时 15LCU
应用型负载均衡 ALB,每月750个小时 15LCU
简介: SpringCloud学习笔记(六)-Zuul及Feign的超时时间测试

image.pngimage.png


springcloud中Ribbon常常用来做负载均衡,其超时时间可以用以下公式来计算。


RibbonTime=(ReadTimeout+ConnectTimeout)*(1+MaxAutoRetries)*(1+MaxAutoRetriesNextServer)


ReadTimeout:处理超时时间


ConnectTimeout:连接建立超时时间


MaxAutoRetries:当前服务器的重试次数(不包括当前请求)


MaxAutoRetriesNextServer:负载到其他服务器的请求次数


上图中T1指网关转发请求到服务A时,总共的超时时间。


T2指服务A调用服务B的超时时间,如果服务是采用Feign,则代表是FeignClient的超时时间。


一、服务A到服务B的超时时间测试


服务A中FeignClient的超时配置如下(其中网关的超时时间是60秒)

#--------------超时配置----------------------
#hystrix超时
hystrix.command.default.execution.timeout.enabled=true
hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds=70000
#开启重试机制
spring.cloud.loadbalancer.retry.enabled=true
#当前服务器连接次数
ribbon.MaxAutoRetries=2
#下个负载均衡服务器连接次数
ribbon.MaxAutoRetriesNextServer=1
#请求处理的超时时间
ribbon.ReadTimeout=14000
#请求连接超时时间
ribbon.ConnectTimeout=10000
#--------------超时配置----------------------


执行超时:14秒,连接超时:10秒,熔断:150秒,本服务器重试次数:2次,下个服务器重试次数:1次,假如服务B执行需要200秒,


Feign是get接口,实际需要84秒超时


Feign是post接口,实际需要14秒超时


由此可以看出得出如下结论


结论一:get请求时会重试。post请求不会重试,主要是考虑到幂等性问题。当然可以通过配置强制所有接口都重试(不推荐)


由实际测试结果看,实际的超时时间并没有包括配置的连接超时时间,这一点跟官网给出的超时时间的计算是有出入的,原因未知。


get:T2 = 14*(1+2)*(1+1) = 84秒


post:T2 = 14*1*1 = 14秒


如果把熔断超时修改为70秒,其他配置不变


则实际超时时间如下


get:min(14*(1+2)*(1+1),  70)=70


Post: min(14*1*1,  70)=14


结论二:熔断的超时时间要大于执行超时


这是在服务A中看到的时间结果,但是由于zuul配置的超时时间是60秒,所以返回给用户的信息是60秒就已经超时。


二、网关的超时时间测试


FeignClient的超时时间不变,网关的超时配置如下:

#--------------超时配置----------------------
#hystrix超时
hystrix.command.default.execution.timeout.enabled=true
zuul.ribbonIsolationStrategy=THREAD
hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds=90000
#开启重试机制
zuul.retryable=true
#当前服务器连接次数
ribbon.MaxAutoRetries=1
#下个负载均衡服务器连接次数
ribbon.MaxAutoRetriesNextServer=1
#请求处理的超时时间
ribbon.ReadTimeout=15000
#请求连接超时时间
ribbon.ConnectTimeout=10000
#--------------超时配置----------------------


实际超时时间:


Get请求时:    T1 = 15*(1+1)*(1+1) = 60秒


Post请求时:   T1 = 15秒


如果把熔断的超时时间改为40秒,其他不变

#--------------超时配置----------------------
#hystrix超时
hystrix.command.default.execution.timeout.enabled=true
zuul.ribbonIsolationStrategy=THREAD
hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds=40000
#开启重试机制
zuul.retryable=true
#当前服务器连接次数
ribbon.MaxAutoRetries=1
#下个负载均衡服务器连接次数
ribbon.MaxAutoRetriesNextServer=1
#请求处理的超时时间
ribbon.ReadTimeout=15000
#请求连接超时时间
ribbon.ConnectTimeout=10000
#--------------超时配置----------------------


Get请求时:    T1 = min(40, 15*(1+1)*(1+1)) = 40秒


Post请求时:   T1 = min(40, 15) = 15秒


结论三:从上面配置可以看出,feign与zuul开启超时重试的参数是不一致的。另外hytrix默认的隔离策略是信号量隔离,需要配置
zuul.ribbonIsolationStrategy=THREAD,否则熔断不会生效。


结论四:如果FeignClient的超时大于网关的超时时间时,网关会直接超时返回或熔断返回,通过ZuulFallbackProvider接口实现,网关是服务级的超时。


相关实践学习
SLB负载均衡实践
本场景通过使用阿里云负载均衡 SLB 以及对负载均衡 SLB 后端服务器 ECS 的权重进行修改,快速解决服务器响应速度慢的问题
负载均衡入门与产品使用指南
负载均衡(Server Load Balancer)是对多台云服务器进行流量分发的负载均衡服务,可以通过流量分发扩展应用系统对外的服务能力,通过消除单点故障提升应用系统的可用性。 本课程主要介绍负载均衡的相关技术以及阿里云负载均衡产品的使用方法。
相关文章
|
2月前
|
测试技术
自动化测试项目学习笔记(五):Pytest结合allure生成测试报告以及重构项目
本文介绍了如何使用Pytest和Allure生成自动化测试报告。通过安装allure-pytest和配置环境,可以生成包含用例描述、步骤、等级等详细信息的美观报告。文章还提供了代码示例和运行指南,以及重构项目时的注意事项。
238 1
自动化测试项目学习笔记(五):Pytest结合allure生成测试报告以及重构项目
|
2月前
|
JSON Java 数据格式
【微服务】SpringCloud之Feign远程调用
本文介绍了使用Feign作为HTTP客户端替代RestTemplate进行远程调用的优势及具体使用方法。Feign通过声明式接口简化了HTTP请求的发送,提高了代码的可读性和维护性。文章详细描述了Feign的搭建步骤,包括引入依赖、添加注解、编写FeignClient接口和调用代码,并提供了自定义配置的示例,如修改日志级别等。
110 1
|
2月前
|
测试技术 Python
自动化测试项目学习笔记(四):Pytest介绍和使用
本文是关于自动化测试框架Pytest的介绍和使用。Pytest是一个功能丰富的Python测试工具,支持参数化、多种测试类型,并拥有众多第三方插件。文章讲解了Pytest的编写规则、命令行参数、执行测试、参数化处理以及如何使用fixture实现测试用例间的调用。此外,还提供了pytest.ini配置文件示例。
47 2
|
2月前
|
测试技术 Python
自动化测试项目学习笔记(二):学习各种setup、tearDown、断言方法
本文主要介绍了自动化测试中setup、teardown、断言方法的使用,以及unittest框架中setUp、tearDown、setUpClass和tearDownClass的区别和应用。
72 0
自动化测试项目学习笔记(二):学习各种setup、tearDown、断言方法
|
7月前
|
应用服务中间件 nginx 微服务
SpringCloud解决feign调用token丢失问题
【5月更文挑战第2天】在feign调用中可能会遇到如下问题: * 同步调用中,token丢失,这种可以通过创建一个拦截器,将token做透传来解决 * 异步调用中,token丢失,这种就无法直接透传了,因为子线程并没有**token**,这种需要先将token从父线程传递到子线程,再进行透传
460 3
|
3月前
|
负载均衡 Java Nacos
SpringCloud基础2——Nacos配置、Feign、Gateway
nacos配置管理、Feign远程调用、Gateway服务网关
SpringCloud基础2——Nacos配置、Feign、Gateway
|
3月前
|
负载均衡 Java 网络架构
实现微服务网关:Zuul与Spring Cloud Gateway的比较分析
实现微服务网关:Zuul与Spring Cloud Gateway的比较分析
143 5
|
3月前
|
前端开发 API 微服务
SpringCloud微服务之间使用Feign调用不通情况举例
SpringCloud微服务之间使用Feign调用不通情况举例
628 2
|
3月前
|
Java API 开发者
【已解决】Spring Cloud Feign 上传文件,提示:the request was rejected because no multipart boundary was found的问题
【已解决】Spring Cloud Feign 上传文件,提示:the request was rejected because no multipart boundary was found的问题
608 0
|
4月前
|
网络协议 安全 前端开发
【应用服务 App Service】Azure 应用服务测试网络访问其他域名及请求超时限制(4分钟 ≈ 230秒)
【应用服务 App Service】Azure 应用服务测试网络访问其他域名及请求超时限制(4分钟 ≈ 230秒)