RestTemplate 配置手册
前言
在Spring项目中经常会使用RestTemplate进行接口调用。在使用过程中经常因为一些配置的不合理导致生产的服务问题,如并发低,超时问题等。
该文章特意整理了一些RestTemplate的相关配置,方便排查问题。
配置清单
看Spring的源码可以看到RestTemplate底层还是用的org.apache.http包下相关的HttpClient库。
针对RestTemplate的配置主要可以分为:
Http链接池池的配置,主要针对链接池的相关配置,影响并发。
Socket配置,主要针对Socket进行配置
Resquest的配置,主要是单个Http请求的配置,包括读超时时间,建立连接时间等。
ConnPoolControl
针对链接池的配置,查看源码可以看到主要在这个接口中。
配置项
上面提到的路由指的是按主机对MaxTotal进行再分配。比如:MaxtTotal=400,DefaultMaxPerRoute=200,而服务只连接到https://g.cn时,到这个主机的并发最多只有200;而不是400;而我连接到https://baidu.com 和 https://g.cn时,到每个主机的并发最多只有200;即加起来是400(但不能超过400)
而DefaultMaxPerRoute与MaxPerRoute的区别是:前者是所有路由的默认值,后者是可以单独为特定的路由进行配置。
SocketConfig
配置项
目前修改这块配置的情况比较少,只有有一个soTimeout会进行设置。但是这个值和后面请求的socketTimeout重复了, 一般也是通过设置请求socketTimeout来控制Socket的读超时时间。
RequestConfig
针对请求的配置,查看源码可以看到主要在这个接口中。
配置项
优化建议
前面介绍的配置项并不是都会用到,常用的配置有如下几个:
MaxTotal——最大连接数
DefaultMaxPerRoute——每个路由的默认最大连接数
connectionRequestTimeout——连接池获取链接超时时间
connectTimeout——建立连接的超时时间
socketTimeout——Socket的读超时时间
在Spring中的配置方式
MaxTotal和DefaultMaxPerRoute
这两个是一组相关配置,影响服务器并发量。
在需要提高并发量时大家经常会调大MaxTotal,而忽略了DefaultMaxPerRoute,这样的结果会导致并发量并不会提高。
所以在提高MaxTotal参数时,需要考虑系统架构的主机数,相应的提高DefaultMaxPerRoute。一般的建议是DefaultMaxPerRoute大概是MaxTotal的一半左右。
超时时间设置
其他三个设置主要是针对超时时间的设置。
connectionRequestTimeout和connectTimeout不建议设置过长,在网络情况差的情况下会导致大量的连接数被占用
socketTimeout需要更加服务的具体情况来设置,设置过长会导致连接被占用,设置过短会导致大数据下载时出现超时。
公共接口服务,socketTimeout不宜设置过长,应优化接口设计,不要一次返回大量数据。
文件服务,存在大量文件下载需求,socketTimeout可以根据网络情况适当设置大一点。
总结
最终的设置的调优还是一个持续的过程,需要在服务发布过程中持续的监控进行调优。根据具体的业务情况进行最优的配置。
版权声明: 本文为 InfoQ 作者【zane】的原创文章。
原文链接:【http://xie.infoq.cn/article/614bcef86c10b950c41afe3de】。文章转载请联系作者。
评论