OkHttpClient
connectTimeout(connectTimeout, TimeUnit.MILLISECONDS)
readTimeout(readTimeout, TimeUnit.MILLISECONDS)
writeTimeout(writeTimeout, TimeUnit.MILLISECONDS)
RestTemplate
requestFactory.setConnectionRequestTimeout(15_000);
requestFactory.setConnectTimeout(15_000);
requestFactory.setReadTimeout(15_000);
问题描述:通过skywalking 看到有100s以上的慢接口,导致服务器过载
原因分析:在高并发场景下ConnectionRequestTimeout 不进行设置,conn 线程池会一直等待导致服务器连接数过大从而拖垮服务。
一劳永逸的方法
现代应用程序使用许多协议(即SOAP,REST,HTTP,HTTPS,JDBC,RMI…)来连接远程应用程序。有时,远程应用程序可能需要很长时间才能响应。有时它可能根本没有响应。
sun.net.client.defaultConnectTimeout
指定与主机建立连接的超时(以毫秒为单位)。例如,对于 HTTP 连接,它是与 HTTP 服务器建立连接时的超时。
sun.net.client.defaultReadTimeout
指定与资源建立连接时从输入流读取时的超时(以毫秒为单位)。
-Dsun.net.client.defaultConnectTimeout=2000
-Dsun.net.client.defaultReadTimeout=2000