Spring Cloud 各组件调优参数
Spring Cloud整合了各种组件,每个组件往往还有各种参数。本文来详细探讨Spring Cloud各组件的调优参数。
Tomcat配置参数
1 server:
2 tomcat:
3 max-connections: 0 # 默认值
4 max-threads: 0 # 默认值
Hystrix配置参数
- 如隔离策略是THREAD:
1 hystrix.threadpool.default.coreSize: 10
2 hystrix.threadpool.default.maximumSize: 10
3 hystrix.threadpool.default.maxQueueSize: -1 # 如该值为-1,那么使用的是SynchronousQueue,
4 否则使用的是LinkedBlockingQueue。
5 注意,修改MQ的类型需要重启。例如从-1修改为100,需要重启,因为使用的Queue类型发生了变化
如果想对特定的HystrixThreadPoolKey 进行配置,则将default 改为 HystrixThreadPoolKey 即可。
- 如果隔离策略是SEMAPHORE:
1 hystrix.command.default.execution.isolation.strategy: SEMAPHORE
2 hystrix.command.default.execution.isolation.semaphore.maxConcurrentRequests: 10 # 默认值
如果想对指定的HystrixCommandKey 进行配置,则将default 改为HystrixCommandKey 即可。
Feign配置参数
Feign默认没有线程池。
当使用HttpClient时,可如下设置:
1 feign:
2 httpclient:
3 enabled: true
4 max-connections: 200 # 默认值
5 max-connections-per-route: 50 # 默认值
代码详见:
org.springframework.cloud.netflix.feign.FeignAutoConfiguration.
HttpClientFeignConfiguration#connectionManager
org.springframework.cloud.netflix.feign.ribbon.
HttpClientFeignLoadBalancedConfiguration.HttpClientFeignConfiguration#connectionManager
当使用OKHttp时,可如下设置:
1 feign:
2 okhttp:
3 enabled: true
4 httpclient:
5 max-connections: 200 # 默认值
6 max-connections-per-route: 50 # 默认值
代码详见:
org.springframework.cloud.netflix.feign.FeignAutoConfiguration.
OkHttpFeignConfiguration#httpClientConnectionPool 。
org.springframework.cloud.netflix.feign.ribbon.OkHttpFeignLoadBalancedConfiguration.
OkHttpFeignConfiguration#httpClientConnectionPool
Zuul配置参数
我们知道Hystrix有隔离策略:THREAD 以及SEMAPHORE ,默认是 SEMAPHORE 。
隔离策略
1 zuul:
2 ribbon-isolation-strategy: thread
最大信号
当Zuul的隔离策略为SEMAPHORE时:
设置默认最大信号量:
1 zuul:
2 semaphore:
3 max-semaphores: 100 # 默认值
设置指定服务的最大信号量:
1 zuul:
2 eureka:
3 <commandKey>:
4 semaphore:
5 max-semaphores: 100 # 默认值
参考:
- https://github.com/spring-cloud/spring-cloud-netflix/issues/1130
- https://github.com/spring-cloud/spring-cloud-netflix/issues/1362 ,非常重要,里面指出,不同版本配置略有差异。
<commandKey>在Brixton.SR5及更早版本中,是<serviceId>RibbonCommand,从Brixton.SR6开始,<commandKey>只需写<serviceId>即可,即:服务注册到Eureka Server上的名称。
Zuul参数
- Hystrix并发参数
Edgware及之后的版本中,当Zuul的隔离策略为THREAD时,可为Hystrix配置独立线程池:
参考:http://www.itmuch.com/spring-cloud/edgware-new-zuul-hystrix-thread-pool/
如果不设置独立线程池,那么HystrixThreadPoolKey 是 RibbonCommand 。
Hystrix并发配置参数请参考《Hystrix并发配置参数一节》
- Zuul并发参数:
Zuul内置的Filterhttp://www.itmuch.com/%2Fspring-cloud%2Fzuul%2Fzuul-filter-in-spring-cloud%2F
对于形如:
1 zuul:
2 routes:
3 user-route: # 该配置方式中,user-route只是给路由一个名称,可以任意起名。
4 url: http://localhost:8000/ # 指定的url
5 path: /user/** # url对应的路径。
的路由,可使用如下方式配置并发参数:
1 zuul:
2 host:
3 max-total-connections: 200 # 默认值
4 max-per-route-connections: 20 # 默认值
- 当Zuul底层使用的是Apache HttpClient时,对于使用Ribbon的路由,可使用如下方式配置并发参数:
1 serviceId:
2 ribbon:
3 MaxTotalConnections: 0 # 默认值
4 MaxConnectionsPerHost: 0 # 默认值
相关代码:org.springframework.cloud.netflix.ribbon.support.AbstractLoadBalancingClient 子类的createDelegate 方法。
springcloud之Feign、ribbon设置超时时间和重试机制的总结
因为测试 Feign + Hystrix 搭配模式下的降级(fallback)超时时间自定义问题,这里的不同组件的超时时间设置问题。
一、 Feign设置超时时间
使用Feign调用接口分两层,ribbon的调用和hystrix的调用,所以ribbon的超时时间和Hystrix的超时时间的结合就是Feign的超时时间
#hystrix的超时时间
hystrix:
command:
default:
execution:
timeout:
enabled: true
isolation:
thread:
timeoutInMilliseconds: 9000
#ribbon的超时时间
ribbon:
ReadTimeout: 3000
ConnectTimeout: 3000
一般情况下 都是 ribbon 的超时时间(<)hystrix的超时时间(因为涉及到ribbon的重试机制)
Feign中,默认使用的Retryer是NEVER_RETRY,

因为ribbon的重试机制和Feign的重试机制有冲突,所以NEVER_RETRY源码中默认关闭Feign的重试机制,源码如下:

要开启Feign的重试机制如下:(Feign默认重试五次 源码中有)
@Bean
Retryer feignRetryer() {
return new Retryer.Default();
}
Feign的default的retryer源码如下:

二、ribbon的重试机制
设置重试次数:
ribbon:
ReadTimeout: 3000
ConnectTimeout: 3000
MaxAutoRetries: 1 #同一台实例最大重试次数,不包括首次调用
MaxAutoRetriesNextServer: 1 #重试负载均衡其他的实例最大重试次数,不包括首次调用
OkToRetryOnAllOperations: false #是否所有操作都重试
根据上面的参数计算重试的次数:MaxAutoRetries+MaxAutoRetriesNextServer+(MaxAutoRetries *MaxAutoRetriesNextServer) 即重试3次 则一共产生4次调用
设置超时ribbon的超时时间
如果在重试期间,时间超过了hystrix的超时时间,便会立即执行熔断,fallback。所以要根据上面配置的参数计算hystrix的超时时间,使得在重试期间不能达到hystrix的超时时间,不然重试机制就会没有意义
hystrix超时时间的计算: (1 + MaxAutoRetries + MaxAutoRetriesNextServer) * ReadTimeout 即按照以上的配置 hystrix的超时时间应该配置为 (1+1+1)*3=9秒
当ribbon超时后且hystrix没有超时,便会采取重试机制。当OkToRetryOnAllOperations设置为false时,只会对get请求进行重试。如果设置为true,便会对所有的请求进行重试,如果是put或post等写操作,如果服务器接口没做幂等性,会产生不好的结果,所以OkToRetryOnAllOperations慎用。
如果不配置ribbon的重试次数,默认会重试一次
注意:
默认情况下,GET方式请求无论是连接异常还是读取异常,都会进行重试
非GET方式请求,只有连接异常时,才会进行重试
断路器超时与Ribbon超时关系
背景
springCloud:Finchley.RELEASE
官方建议
当Ribbon客户端和hystrix同时使用时,您需要确保您的hystrix超时时间配置比Ribbon超时时间更长,包括可能进行的重试。例如,如果您的Ribbon连接超时为1秒,而Ribbon客户端可能会重试该请求3次,则hystrix超时应该略大于3秒。
三、如何设置Hystrix线程池大小
Hystrix线程池大小默认为10hystrix:
threadpool:
default:
coreSize: 10
每秒请求数 = 1/响应时长(单位s) * 线程数 = 线程数 / 响应时长(单位s)
也就是
线程数 = 每秒请求数 * 响应时长(单位s) + (缓冲线程数)
标准一点的公式就是QPS * 99% cost + redundancy count
比如一台服务, 平均每秒大概收到20个请求,每个请求平均响应时长估计在500ms,
线程数 = 20 * 500 / 1000 = 10
为了应对峰值高并发,加上缓冲线程,比如这里为了好计算设为5,就是 10 + 5 = 15个线程
Spring Cloud 各组件调优参数的更多相关文章
- Dubbo性能调优参数及原理
本文是针对 Dubbo 协议调用的调优指导,详细说明常用调优参数的作用域及源码. Dubbo调用模型 常用性能调优参数 参数名 作用范围 默认值 说明 备注 threads provider 200 ...
- Spring Cloud各个组件的配套使用
我们从整体上来看一下Spring Cloud各个组件如何来配套使用: 从上图可以看出Spring Cloud各个组件相互配合,合作支持了一套完整的微服务架构. 其中Eureka负责服务的注册与发现, ...
- Linux TCP/IP调优参数 /proc/sys/net/目录
所有的TCP/IP调优参数都位于/proc/sys/net/目录. 例如, 下面是最重要的一些调优参数,后面是它们的含义: /proc/sys/net/core/rmem_default " ...
- hadoop作业调优参数整理及原理
hadoop作业调优参数整理及原理 10/22. 2013 1 Map side tuning参数 1.1 MapTask运行内部原理 当map task开始运算,并产生中间数据时,其产生的中间结果并 ...
- Spring Cloud 各个组件介绍
从上图可以看出 Spring Cloud 各个组件相互配合,合作支持了一套完整的微服务架构: Eureka 负责服务的注册与发现,很好地将各服务连接起来. Hystrix 负责监控服务之间的调用情况, ...
- JVM性能调优的6大步骤,及关键调优参数详解
JVM性能调优方法和步骤1.监控GC的状态2.生成堆的dump文件3.分析dump文件4.分析结果,判断是否需要优化5.调整GC类型和内存分配6.不断分析和调整JVM调优参数参考 对JVM内存的系统级 ...
- Spring Cloud常用组件及各组件版本对应关系图
Spring Cloud常用组件: 架构图: 版本对应关系:
- 直通BAT必考题系列:JVM性能调优的6大步骤,及关键调优参数详解
JVM内存调优 对JVM内存的系统级的调优主要的目的是减少GC的频率和Full GC的次数. 1.Full GC 会对整个堆进行整理,包括Young.Tenured和Perm.Full GC因为需要对 ...
- JVM调优参数、方法、工具以及案例总结
这种文章挺难写的,一是JVM参数巨多,二是内容枯燥乏味,但是想理解JVM调优又是没法避开的环节,本文主要用来总结梳理便于以后翻阅,主要围绕四个大的方面展开,分别是JVM调优参数.JVM调优方法(流程) ...
随机推荐
- putty 、xshell的使用 和 putty 、xshell、 shell 间免密登陆
相关软件的使用: ######################################################################### 以上是相关软件的使用! 以下是免密 ...
- Liunx----vi编辑器
关于vi编辑器基本的用法总结如下: vi是linux下的一款文编编辑器. 进入vi的方法:在系统启动起来后,直接键入vi或vi 文件名: 进去后输入内容方法:输入a或i,切换到编辑模式: 退出编辑模式 ...
- 芯灵思SinlinxA33开发板Linux内核定时器编程
开发平台 * 芯灵思SinlinxA33开发板 淘宝店铺: https://sinlinx.taobao.com/ 嵌入式linux 开发板交流 QQ:641395230 Linux 内核定时器是内核 ...
- nginx与Apache的优缺点
来源:http://itindex.net/detail/46414-apache-nginx 1.nginx相对于apache的优点: 轻量级,同样起web 服务,比apache 占用更少的内存及资 ...
- Unity 原厂免费资源学习
- qq互联php版本
https://zhidao.baidu.com/question/1495432442326804379.html qq互联php版本 http://www.jb51.net/article/104 ...
- Git中清除远程仓库HTTPS认证信息的方法
Git远程仓库同步时用户认证有两种方式:HTTPS.SSH,对应的Git仓库上有两个不同的链接地址. https方式使用账号和密码授权,简单易用,便于进行权限细分管理,而且防火墙一般会打开 http ...
- 转-[WebServer] Windows操作系统下 Tomcat 服务器运行 PHP 的环境配置
原文 前言: 由于本人在开发和学习过程中需要同时部署 JavaWeb 和 PHP 项目,于是整理了网上的一些相关资料,并结合自己的实际操作,记录于此,以供参考. 一.环境(64bit): 1.操作系统 ...
- 在公司上wifi
公司的wifi上不了咋办?自己搞! 做法: 把自己的newifi mini带到公司, 记录公司内网ip,登入路由器设置, 1. 把ip改为内网一致, 2.关闭dhcp功能 3.设置wifi 网线连接: ...
- redis 如何查看所有的key
可以使用KEYS 命令 KEYS pattern 例如, 列出所有的key redis> keys * 列出匹配的key redis>keys apple* 1) apple1 2) ap ...