- 前言
- 第1集 RestTemplate里面的存在的问题你知道多少- Broken pipe错误
- 第2集 高性能RestTemplate连接池封装配置实战
- 第3集 【10倍+QPS提升】Jmeter5.x压测 优化后RestTemplate前后性能对比
前言
第1集 RestTemplate里面的存在的问题你知道多少- Broken pipe错误小滴课堂,旨在让编程不在难学,让技术与生活更加有趣。 随着互联网+的时代,在线教育技术越来越便捷,小滴课堂依托在线教育时间以及空间上的便利,为广大IT从业者提供了更为方便、快捷的学习交流途径、提供大量高质量的IT在线课程。更多教程请访问xdclass.net(添加VX:xdclass99)
简介: RestTemplate里面的存在的问题你知道多少
-
还原代码(暂时不用异步)
- 异步-里面是用线程池-是池化思想的一种应用
-
同步发送+resttemplate未池化
-
压测结果 几百吞吐量
-
错误Caused by: java.io.IOException: Broken pipe
- 服务端向前端socket连接管道写返回数据时 链接(pipe)却断开了
- 从应用角度分析,这是因为客户端等待返回超时了,主动断开了与服务端链接
- 连接数设置太小,并发量增加后,造成大量请求排队等待
- 网络延迟,是否有丢包
- 内存是否足够多支持对应的并发量
- 服务端向前端socket连接管道写返回数据时 链接(pipe)却断开了
-
-
问题分析
- resttemplate底层是怎样的?
- 基于之前的认知-池化思想,联想到是否使用了http连接池?
-
重新认识RestTemplate
- RestTemplate是Spring提供的用于访问Rest服务的客户端
- 底层通过使用java.net包下的实现创建HTTP 请求
- 通过使用ClientHttpRequestFactory指定不同的HTTP请求方式,主要提供了两种实现方式
- SimpleClientHttpRequestFactory(默认)
- 底层使用J2SE提供的方式,既java.net包提供的方式,创建底层的Http请求连接
- 主要createRequest 方法( 断点调试),每次都会创建一个新的连接,每次都创建连接会造成极大的资源浪费,而且若连接不能及时释放,会因为无法建立新的连接导致后面的请求阻塞
- HttpComponentsClientHttpRequestFactory
- 底层使用HttpClient访问远程的Http服务
- SimpleClientHttpRequestFactory(默认)
-
问题解决
- 客户端每次请求都要和服务端建立新的连接,即三次握手将会非常耗时
- 通过http连接池可以减少连接建立与释放的时间,提升http请求的性能
- Spring的restTemplate是对httpclient进行了封装, 而httpclient是支持池化机制
- 拓展
- 对httpclient进行封装的有:Apache的Fluent、es的restHighLevelClient、spring的restTemplate等
简介: 高性能RestTemplate封装配置实战
- 配置RestTemplate连接池实战
@Bean public RestTemplate restTemplate(ClientHttpRequestFactory factory) { return new RestTemplate(factory); } @Bean public ClientHttpRequestFactory httpRequestFactory() { return new HttpComponentsClientHttpRequestFactory(httpClient()); } @Bean public HttpClient httpClient() { Registry第3集 【10倍+QPS提升】Jmeter5.x压测 优化后RestTemplate前后性能对比registry = RegistryBuilder. create() .register("http", PlainConnectionSocketFactory.getSocketFactory()) .register("https", SSLConnectionSocketFactory.getSocketFactory()) .build(); PoolingHttpClientConnectionManager connectionManager = new PoolingHttpClientConnectionManager(registry); //设置整个连接池最大连接数 connectionManager.setMaxTotal(500); //MaxPerRoute路由是对maxTotal的细分,每个主机的并发,这里route指的是域名 connectionManager.setDefaultMaxPerRoute(200); RequestConfig requestConfig = RequestConfig.custom() //返回数据的超时时间 .setSocketTimeout(20000) //连接上服务器的超时时间 .setConnectTimeout(10000) //从连接池中获取连接的超时时间 .setConnectionRequestTimeout(1000) .build(); return HttpClientBuilder.create() .setDefaultRequestConfig(requestConfig) .setConnectionManager(connectionManager) .build(); }
简介: 【10倍+提升】Jmeter5.x压测 优化后RestTemplate前后性能对比
-
同步发送+resttemplate未池化
- 压测结果 几百 吞吐量
-
同步发送+resttemplate池化
- 压测结果
- 检查你自己公司的项目,是否存在对应的问题
- 这些都是面试跳槽里面-项目的亮点
- 发现问题
- 找出原因
- 解决问题