哈喽,大家好,最近周边的同事,邻居逐渐都羊了。
创新互联于2013年开始,是专业互联网技术服务公司,拥有项目网站制作、网站建设网站策划,项目实施与项目整合能力。我们以让每一个梦想脱颖而出为使命,1280元宜阳做网站,已为上家服务,为宜阳各地企业和个人服务,联系电话:028-86922220
而指北君还在坚挺码字。等待阳的到来。
相信羊过之后,必是一片彩虹!
如果很多资源的使用如果不从共享资源池中获取,极容易造成内存泄漏和内存溢出。要想实现高并发并且合理利用资源,大部分设计方案都会用到各种连接池,线程池等等。所有的可重复利用资源均从一组资源池中进行调用。也类似于近几年火爆的共享经济,然而共享经济就和软件设计中的共享资源池类似。不单独持有某个资源,在需要使用的时候再去资源池中进行申请。
下面我们盘一盘各种资源共享池的一些配置,以及优化策略!
废话少说,我们看一下一个简单的SpringBoot tomcat配置
server:
tomcat:
accept-count: 500 //accept队列长度
max-connections: 1000//最大连接数
threads:
max: 200 //最大工作线程数量
min-spare: 10 //最小工作线程数量
HTTP Connector
其工作流程如下:
关于这个咱们讲一个食堂干饭的例子:
通过上面的例子,我相信大家都能清楚tomcat的一些基本参数配置作用,并且针对不同的情况进行调优了。
关于Java线程池,大家都比较熟悉了吧。下面是基本参数
public ThreadPoolExecutor(
int corePoolSize, //核心线程数
int maximumPoolSize,//最大线程数
long keepAliveTime, //大于核心线程数量的线程存活时间,如果没有新任务就会关闭
TimeUnit unit, // 时间单位
BlockingQueueworkQueue, //线程等待队列
ThreadFactory threadFactory,//创建线程的工厂
RejectedExecutionHandler handler//拒绝策略
){
线程池基本运行原理介绍
这里线程池的方案和tomcat Connector 的方案稍微有点不同。前者是先排队然后再把池子容量扩大代最大,后者是先扩大池子,然后再排2个队。
我觉得对于ThreadPoolExecutor线程池的理解,用工厂工人的例子比较好理解。
对线程池的优化思路:
SpringBoot微服务与其他Restful的资源进行交互的时候会使用到RestTemplate。如果你直接new RestTemplate,那么就需要特别注意了。使用不慎就会造成内存泄漏,引发GC等。
RestTemplate底层依旧是使用org.apache.http包下的HttpClient。
SpringBoot中可以通过PoolingHttpClientConnectionManager设置一些connection pool 的参数
PoolingHttpClientConnectionManager connectionPoolManager = new PoolingHttpClientConnectionManager();
connectionPoolManager.setMaxTotal(100);//最大连接数
connectionPoolManager.setDefaultMaxPerRoute(200);//
通过HttpRequestFactory可以设置connectTimeOut,connectionRequestTimeout,SocketTimeout
HttpComponentsClientHttpRequestFactory httpRequestFactory = new HttpComponentsClientHttpRequestFactory();
httpRequestFactory.setConnectionRequestTimeout(3000);//获取链接超时时间
httpRequestFactory.setConnectTimeout(3000);// 指客户端和服务器建立连接的timeout
httpRequestFactory.setReadTimeout(120000);// 读取数据的超时时间
小结一下比较重要的几个参数如下:
maxTotal : 连接池里面的最大连接数
defaultMaxPerRoute : 每个路由默认接收的最大连接数
socketTimeout :它是指客户端和服务器建立连接后,客户端从服务器读取数据的超时时间,超出后会抛出SocketTimeOutException。
connectionRequestTimout:指从连接池获取连接的timeout
connetionTimeout:指客户端和服务器建立连接的timeout。
可以通过如下方式构建RestTemplate,其中的参数也可以自定以从配置文件中引入。
@Bean
public RestTemplate buildPoolingRestTemplate(RestTemplateBuilder builder){
PoolingHttpClientConnectionManager connectionPoolManager = new PoolingHttpClientConnectionManager();
connectionPoolManager.setMaxTotal(100);//最大连接数
connectionPoolManager.setDefaultMaxPerRoute(200);//每个路由默认接收的最大连接数
HttpClient httpClient = HttpClientBuilder.create()
.setConnectionManager(connectionPoolManager).build();
HttpComponentsClientHttpRequestFactory httpRequestFactory = new HttpComponentsClientHttpRequestFactory();
httpRequestFactory.setHttpClient(httpClient);
httpRequestFactory.setConnectionRequestTimeout(3000);//获取链接超时时间
httpRequestFactory.setConnectTimeout(3000);// 指客户端和服务器建立连接的timeout
httpRequestFactory.setReadTimeout(120000);// socketTimeout 读取数据的超时时间
return builder.requestFactory(()-> httpRequestFactory).build();
}
对于RestTemplate的一些建议
当然还有其他的一些优化的地方,比如使用不同的ConnectionKeepAliveStrategy等,设置maxIdleTime最大空闲时间等。
本篇总结了Tomcat,线程池,RestTemplate 的一些日常优化策略。平时应该多注意总结,在不同的情况下,优化参数均有不同。所以就要多一些测试,才能得到最好的配置。看完这些不妨在项目中试一下,增强记忆。
分享名称:连接池要这么配,干货收藏!
文章源于:http://www.36103.cn/qtweb/news3/15903.html
网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等
声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联