其实springboot中通过内嵌tomcat的方式已对tomcat做了去除臃肿的操作,所以我们可以参照微服务的方式
去优化tomcat
1.若项目的视图没有使用JSP,可以将其去掉
将conf/web.xml中关于jsp的配置删除,即如下:
<servlet>
<servlet-name>jsp</servlet-name>
<servlet-class>org.apache.jasper.servlet.JspServlet</servlet-class>
<init-param>
<param-name>fork</param-name>
<param-value>false</param-value>
</init-param>
<init-param>
<param-name>xpoweredBy</param-name>
<param-value>false</param-value>
</init-param>
<load-on-startup>3</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>jsp</servlet-name>
<url-pattern>*.jsp</url-pattern>
<url-pattern>*.jspx</url-pattern>
</servlet-mapping>
2.去掉默认的首页
还是conf/web.xml,删除welcome-file-list节点,我们可以自定义
3.微服务项目可以设定其数据格式
conf/web.xml中有很多mime-mapping节点
mime-mapping作用就是告诉给浏览器处理的格式,微服务项目只需要配置json即可
4.服务器集群的项目可去除session
如果服务器集群的,session的支持不是很又友好 几乎在很多公司都是采用token替代Session
可删除conf/web.xml中的session-config配置
5.Reloadable设为false
Reloadable配置建议禁止,如果为true,则tomcat会实现热部署
即,自动检测应用程序的/WEB-INF/lib和/WEB-INF/classes目录的变化,自动装载新的应用程序。
生产环境此乃大忌
6.去除冗余日志
主流都是nginx记录每次请求地址,且此日志几乎不会被人查看,los/localhost_access_log.*
移除conf/server.xml中如下配置
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="localhost_access_log." suffix=".txt"
pattern="%h %l %u %t "%r" %s %b" />
7.线程池优化
conf/server.xml 配置相关线程池
<Executor name="tomcatThreadPool" namePrefix="catalina-exec-"
maxThreads="150" minSpareThreads="4"/>
相关参数配置:
name: 线程池名称
namePrefix: 创建的每个线程的名称前缀, 单独的线程名称为 namePrefix + threadNumber.
maxThreads: 线程池中最大并发线程数, 默认值为200, 一般建议设置400~ 800 , 要根据服务器配置和业务需求而定.
minSpareThreads: 最小活跃线程数, 也就是核心线程数, 不会被销毁, 会一直存在.
prestartminSpareThreads: 是否在启动程序时就生成minSpareThreads个线程, 默认为false, 即不启动. 若不设置为true,
则minSpareThreads的设置就不起作用了.
maxIdleTime: 线程最大空闲时间, 超过该时间后, 空闲线程会被销毁, 默认值为6000, 单位为毫秒.
maxQueueSize: 最大的等待队列数, 超过则拒绝请求. 默认值为int类型的最大值(Integer.MAX_VALUE), 等同于无限大.
一般不作修改, 避免发生部分请求未能被处理的情况.
threadPriority: 线程池中线程的优先级, 默认值为5, 取值范围: 1 ~ 10.
8.Connector优化
默认情况下Tomcat开启了两个Connector
分别为:
Connector 监听8080 Http协议
Connector 监听8009 AJP协议 (tomcat内部之间通讯)
建议可以将Connector连接器移除,能够减少内存的消耗
9.IO模型优化
1.BIO:
阻塞式IO,采用传统的java IO进行操作,该模式下每个请求都会创建一个线程,
适用于并发量小的场景
2.NIO:
同步非阻塞,比传统BIO能更好的支持大并发,tomcat 8.0 后默认采用该模式
3.APR:tomcat 以JNI形式调用http服务器的核心动态链接库来处理文件读取或网络传输操作,需要编译安装APR库
4.AIO:异步非阻塞,tomcat8.0后支持
配置方法:在tomcat conf 下找到server.xml
在<Connector port="8080" protocol="HTTP/1.1"/>
BIO: protocol =" org.apache.coyote.http11.Http11Protocol"
NIO: protocol ="org.apache.coyote.http11.Http11NioProtocol"
AIO: protocol ="org.apache.coyote.http11.Http11Nio2Protocol"
APR: protocol ="org.apache.coyote.http11.Http11AprProtocol"