Spring Boot如何优化内嵌的Tomcat示例详解

前言

本文主要给大家介绍了关于Spring Boot优化内嵌Tomcat的相关内容,分享出来供大家参考学习,下面话不多说了,来一看看详细的介绍吧。

Spring Boot测试版本

<parent>
 <groupId>org.springframework.boot</groupId>
 <artifactId>spring-boot-starter-parent</artifactId>
 <version>1.3.3.RELEASE</version>
</parent>
<dependencies>
 <dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-web</artifactId>
 </dependency>
</dependencies> 

SpringBoot默认使用的是Tomcat作为web server

springboot中默认可以通过配置如下参数设置内嵌容器Tomcat的端口,最大线程数等等

server.port=8081
server.tomcat.max-threads=1000

但是,无法设置最大连接数,而最大连接数直接影响到Tomcat的性能,如何调整这个最大连接数呢?

以下有三种方法

第一种:

package com.web.server; 

import org.apache.catalina.connector.Connector;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.context.embedded.EmbeddedServletContainer;
import org.springframework.boot.context.embedded.ServletContextInitializer;
import org.springframework.boot.context.embedded.tomcat.TomcatEmbeddedServletContainerFactory;
import org.springframework.stereotype.Component; 

@Component()
public class MyEmbeddedServletContainerFactory extends TomcatEmbeddedServletContainerFactory
{
 public EmbeddedServletContainer getEmbeddedServletContainer(ServletContextInitializer... initializers)
 {
  //设置端口
  this.setPort(8081);
  return super.getEmbeddedServletContainer(initializers);
 } 

 protected void customizeConnector(Connector connector)
 {
  super.customizeConnector(connector);
  Http11NioProtocol protocol = (Http11NioProtocol)connector.getProtocolHandler();
  //设置最大连接数
  protocol.setMaxConnections(2000);
  //设置最大线程数
  protocol.setMaxThreads(2000);
  protocol.setConnectionTimeout(30000);
 }
} 

第二种:

package com.web.server; 

import org.apache.catalina.connector.Connector;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.boot.context.embedded.EmbeddedServletContainerFactory;
import org.springframework.boot.context.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.context.embedded.tomcat.TomcatEmbeddedServletContainerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration; 

@Configuration
public class WebServerConfiguration
{
 @Bean
 public EmbeddedServletContainerFactory createEmbeddedServletContainerFactory()
 {
  TomcatEmbeddedServletContainerFactory tomcatFactory = new TomcatEmbeddedServletContainerFactory();
  tomcatFactory.setPort(8081);
  tomcatFactory.addConnectorCustomizers(new MyTomcatConnectorCustomizer());
  return tomcatFactory;
 }
}
class MyTomcatConnectorCustomizer implements TomcatConnectorCustomizer
{
 public void customize(Connector connector)
 {
  Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
  //设置最大连接数
  protocol.setMaxConnections(2000);
  //设置最大线程数
  protocol.setMaxThreads(2000);
  protocol.setConnectionTimeout(30000);
 }
} 

第三种:

package com.web.server; 

import org.springframework.boot.context.embedded.ConfigurableEmbeddedServletContainer;
import org.springframework.boot.context.embedded.EmbeddedServletContainerCustomizer;
import org.springframework.boot.context.embedded.tomcat.TomcatEmbeddedServletContainerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration; 

@Configuration
public class WebServerConfiguration
{
 @Bean
 public EmbeddedServletContainerCustomizer createEmbeddedServletContainerCustomizer()
 {
  return new MyEmbeddedServletContainerCustomizer();
 }
} 

class MyEmbeddedServletContainerCustomizer implements EmbeddedServletContainerCustomizer
{
 public void customize(ConfigurableEmbeddedServletContainer container)
 {
  TomcatEmbeddedServletContainerFactory tomcatFactory = (TomcatEmbeddedServletContainerFactory)container;
  tomcatFactory.setPort(8081);
  //下面的操作可以参照上面的方法
 }
} 

最后,如果发现没有生效,就把application.properties配置里面关于Tomcat的一些配置(server.*)全部删掉,就OK了。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对我们的支持。

时间: 2017-09-06

详解SpringBoot初始教程之Tomcat、Https配置以及Jetty优化

1.介绍 在SpringBoot的Web项目中,默认采用的是内置Tomcat,当然也可以配置支持内置的jetty,内置有什么好处呢? 1. 方便微服务部署. 2. 方便项目启动,不需要下载Tomcat或者Jetty 在目前的公司已经把内置的Jetty部署到了线上项目中,目前来说并无太大问题,内置就算有一些性能损失,但是通过部署多台机器, 其实也能够很轻松的解决这样的问题,内置容器之后其实是方便部署和迁移的. 1.1 优化策略 针对目前的容器优化,目前来说没有太多地方,需要考虑如下几个点 线程数

Tomcat并发优化方法介绍

Tomcat 常用运行模式有3种,分别为 bio,nio,apr.生产环境建议用apr,详细请看上一篇博文<Tomcat之--运行模式> 安装APR [root@liuyazhuang ~]# yum -y install apr apr-devel openssl-devel [root@liuyazhuang ~]# tar zxvf tomcat-native.tar.gz [root@liuyazhuang ~]# cd tomcat-native-1.1.24-src/jni/nat

tomcat性能优化(性能总览)

1.增加JVM堆内存大小 1)JVM通常不去调用垃圾回收器,所以服务器可以更多关注处理web请求,并要求尽快完成. 2)更改文件(catalina.sh) JAVA_OPTS="-Djava.awt.headless=true -Dfile.encoding=UTF-8 -server -Xms1024m -Xmx1024m -XX:NewSize=512m -XX:MaxNewSize=512m -XX:PermSize=512m -XX:MaxPermSize=512m -XX:+Disab

基于Tomcat安全配置与性能优化详解

Tomcat 是 Apache软件基金会下的一个免费.开源的WEB应用服务器,它可以运行在 Linux 和 Windows 等多个平台上,由于其性能稳定.扩展性好.免费等特点深受广大用户喜爱.目前,很多互联网应用和企业应用都部署在 Tomcat 服务器上,比如我们公司,哈. 之前我们 tomcat 都采用的是默认的配置,因此在安全方面还是有所隐患的.上周对测试环境的所有服务器的tomcat都做了安全优化,其间也粗略做了一些性能优化,这里就简单记录分享下! 一.版本安全 升级当前的tomcat版本

tomcat性能优化方式简单整理

Tomcat本身优化 Tomcat内存优化 启动时告诉JVM我要一块大内存(调优内存是最直接的方式) 我们可以在 tomcat 的启动脚本 catalina.sh 中设置 java_OPTS 参数 JAVA_OPTS参数说明 server 启用jdk 的 server 版 Xms java虚拟机初始化时的最小内存 Xmx java虚拟机可使用的最大内存 XX: PermSize 内存永久保留区域 XX:MaxPermSize 内存最大永久保留区域 配置示例: JAVA_OPTS='-Xms102

整理AngularJS框架使用过程当中的一些性能优化要点

1. 简介 无论你正在编写一个旧的应用程序还是在一个大型应用中采用AngularJS,性能是一个重要的方面.了解是什么原因导致AngularJS应用程序慢下来非常重要,要知道,在开发过程中做出权衡是很重要的.本文将介绍一些AngularJS比较常见的性能问题,以及优化的建议. 2. 性能测试工具 本文采用jsPerf http://jsperf.com/ 性能测试的基准. 3. 软件性能 评价软件性能有两个基本的因素: 首先是算法的时间复杂度.一个简单的例子就是线性搜索和二分检索有着非常显著的性

Go程序性能优化及pprof使用方法详解

Go 程序的性能优化及 pprof 的使用 程序的性能优化无非就是对程序占用资源的优化.对于服务器而言,最重要的两项资源莫过于 CPU 和内存.性能优化,就是在对于不影响程序数据处理能力的情况下,我们通常要求程序的 CPU 的内存占用尽量低.反过来说,也就是当程序 CPU 和内存占用不变的情况下,尽量地提高程序的数据处理能力或者说是吞吐量. Go 的原生工具链中提供了非常多丰富的工具供开发者使用,其中包括 pprof. 对于 pprof 的使用要分成下面两部分来说. Web 程序使用 pprof

SQLite 性能优化实例分享

最早接触 iOS 开发了解到的第一个缓存数据库就是 SQLite,后面一直也以 SQLite 作为中坚力量使用,以前没有接触到比较大量数据的读写,所以在性能优化方面关注不多,这次对一个特定场景的较多数据批量读写做了一个性能优化,使性能提高了十倍. 大致应用场景是这样: 每次程序启动会从服务器拉取一些数据,对本地数据库两个表进行同步更新,不存在就写入,存在就更新其字段.数据少的时候几十条,多的上千条. 由于缓存的数据可能会存在异步同时读写,所以做了一个后台同步队列,所有的缓存数据库操作都在这个队列

浅谈DOM的操作以及性能优化问题-重绘重排

写在前面: 大家都知道DOM的操作很昂贵. 然后贵在什么地方呢? 一.访问DOM元素 二.修改DOM引起的重绘重排 一.访问DOM 像书上的比喻:把DOM和JavaScript(这里指ECMScript)各自想象为一个岛屿,它们之间用收费桥梁连接,ECMAScript每次访问DOM,都要途径这座桥,并交纳"过桥费",访问DOM的次数越多,费用也就越高.因此,推荐的做法是尽量减少过桥的次数,努力待在ECMAScript岛上.我们不可能不用DOM的接口,那么,怎样才能提高程序的效率? 既然

asp.net小谈网站性能优化

当然,网站性能优化是多方面的,这里先谈一下这些天来的所获: 1.书写代码的习惯: 再复杂的逻辑,也是从最简单的开始.在书写代码的过程中,很多不好的规范都会影响网站的性能: 以下是整理出来的些许代码习惯: 1)字符串的比较 用 string.Empty 代替 " " 2)在遍历过程中,先定义好计数变量, 再遍历, 这样会减少每次遍历就分配一次内存空间: 复制代码 代码如下: int i; for( i=0; i<100;i++) { // codeing } 3)同样的,用 Str

ASP.NET性能优化小结(ASP.NET&amp;C#)

ASP.NET: 一.返回多个数据集 检查你的访问数据库的代码,看是否存在着要返回多次的请求.每次往返降低了你的应用程序的每秒能够响应请求的次数.通过在单个数据库请求中返回多个结果集,可以减少与数据库通信的时间,使你的系统具有扩展性,也可以减少数据库服务器响应请求的工作量. 如果用动态的SQL语句来返回多个数据集,那用存储过程来替代动态的SQL语句会更好些.是否把业务逻辑写到存储过程中,这个有点争议.但是我认为,把业务逻辑写到存储过程里面可以限制返回结果集的大小,减小网络数据的流量,在逻辑层也不

Python 性能优化技巧总结

1.使用测量工具,量化性能才能改进性能,常用的timeit和memory_profiler,此外还有profile.cProfile.hotshot等,memory_profiler用了psutil,所以不能跟踪cpython的扩展: 2.用C来解决费时的处理,c是效率的代名词,也是python用来解决效率问题的主要途径,甚至有时候我都觉得python是c的完美搭档.常用的是Cython,直接把py代码c化然后又能像使用py包一样使用,其次是ctypes,效率最最高的存在,最后还有CPython