上一篇 <<<Tomcat8的四种部署方式
下一篇 >>>Tomcat的AJP连接器的漏洞
SpringBoot内嵌入Tomcat比引入外部Tomcat容器部署性能要好.
因为外部tomcat非常臃肿,把一些没有必要的组件全部都开启,而为我们在使用SpringBoot构建微服务的时候是没有视图层的,所以SpringBoot关闭了很多没有必要的插件,比如jsp。
tips:我们在使用springboot项目开发的时候,不要将jar包放入到外部tomcat运行。
1.删除无效配置,借鉴springboot的做法
1.1 移除tomcat安装目录的conf/web.xml视图层组件JspServlet及相关映射
JspServlet: 编译并且执行我们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>
1.2去除conf/web.xml中的welcome-file-list配置,springboot是没有默认的
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
1.3 mime-mapping作用就是告诉给浏览器处理的格式,conf/web.xml中只保留一个json的就行了
<mime-mapping>
<extension>jpg</extension>
<mime-type>image/jpeg</mime-type>
</mime-mapping>
……
1.4 session在微服务下用的很少,几乎都是采用token替代Session,可删除conf/web.xml配置session-config
<session-config>
<session-timeout>30</session-timeout>
</session-config>
1.5 conf/server.xml 中的reloadable配置为false
如果为true时直接实现热部署,开发环境可以,但在生成环境设置为false,黑客注入class文件可能不安全。
<Context docBase="D:\jarye" path="/jarye" reloadable="false"/>
1.6 减少日志请求记录
在tomcat中日志文件分为:catalina、localhost_access_log
Catalina属于tomcat最核心的配置文件
localhost_access_log 记录每次请求,交给nginx记录即可
建议移除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" />
2.线程池的配置
<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.
如何设置:
a.如果并发量比较大的情况下 最小活跃线程建议设置比较大,可以避免重复处理线程 可以增加吞吐量;如果最小活跃的线程如果比较大的情况下,非常占用cpu资源;
b.如果是项目的并发量比较小的情况下,最小活跃线程可以设置小一点,可以节约cpu内存
tips:更多线程相关内容,请阅读并发编程-线程池
3.Connector优化
默认情况下Tomcat开启了两个Connector
分别为:
Connector 监听8080 Http协议
Connector 监听8009 AJP协议 (tomcat内部之间通讯)
建议可以将Connecto8009连接器移除,能够减少内存的消耗
Connector:
Endpoint:监听网络接口、接受网络连接请求、读取请求网络字节流、将响应字节流写回服务
Processor:生成统一的Tomcat Request对象
Adapter:将Tomcat Request转换成标准的ServletRequest、将ServletResponse转成Tomcat Response
4.IO线程模型优化
配置方法:在tomcat conf 下找到server.xml,在<Connector port="8080" protocol="HTTP/1.1"/>修改protocol的值。
可选值:
BIO: protocol =" org.apache.coyote.http11.Http11Protocol"阻塞式IO,采用传统的java IO进行操作,该模式下每个请求都会创建一个线程,适用于并发量小的场景。【Tomcat7及以下linux环境默认该模式,JDK1.4之前唯一选择】NIO: protocol ="org.apache.coyote.http11.Http11NioProtocol"同步非阻塞式io 效率比BIO提高非常多倍 采用多路复合机制【tomcat8在linux系统默认采用该模式,JDK1.4开始支持】
AIO: protocol ="org.apache.coyote.http11.Http11Nio2Protocol"异步非阻塞形式 【tomcat8后支持,JDK1.7开始支持】
APR: protocol ="org.apache.coyote.http11.Http11AprProtocol" tomcat以JNI形式调用http服务器的核心动态链接库来处理文件读取或网络传输操作,从而大大提高了tomcat对静态文件的处理性能,但需要编译安装APR库【Tomcat7或Tomcat8在Win7或以上的系统中启动默认使用这种方式】
Tomcat7的默认IO模型:
![]()
Tomcat8的默认IO模型:
![]()
Springboot的默认IO模型:
![]()
推荐阅读:
<<<Tomcat的底层架构模型
<<<Tomcat启动流程说明
<<<Tomcat8的四种部署方式
<<<Tomcat的AJP连接器漏洞
网友评论