Tomcat架构分析与性能优化

目录

概述

架构说明

Server(Tomcat)

Listener

GlobalNamingResources

Resource

JNDI

Service

Connector

Thread Pool

Executor

Engine

Value

Cluster

Realm

Host

Context

Manager

Loader

Resource

Web App

Filter

POJO

Servlet

优化方案

内存优化

线程优化-单连接器

线程优化-多连接器

禁用DNS

设置session过期时间

Apr插件


概述

Tomcat是非常常用的应用服务器,了解Tomcat的总体架构以及实现细节,对于理解整个java web也是有非常大的帮助。

架构说明

Server(Tomcat)

Server是服务器的意思,代表整个tomcat服务器,一个tomcat只有一个Server。Server中包含至少一个Service组件,用于提供具体服务。

#在8005端口监听到“SHUTDOWN”命令,服务器就会停止。
<Server port="8005" shutdown="SHUTDOWN">

使用telnet命令连接此端口,在连接成功后,发送配置的“SHUTDOWN”字符串,可以查看Tomcat的服务已经关闭了。考虑Tomcat的安全性,此端口命令必须在Tomcat服务器所在的机器上发出,远程测试是无效的。

Listener

Tomcat的监听能够帮助我们webapp在启动的生命周期内完成你棘手的若干在应用系统中才能完成的功能。

<Listener className="org.apache.catalina.startup.VersionLoggerListener" />

GlobalNamingResources

定义了服务器的全局JNDI资源

<GlobalNamingResources>

Resource

用于配置数据源

<Resource name="UserDatabase" auth="Container" type="org.apache.catalina.UserDatabase" description="User database that can be updated and saved" factory="org.apache.catalina.users.MemoryUserDatabaseFactory" pathname="conf/tomcat-users.xml" />

JNDI

Java Naming and Directory Interface:Java命名和目录接口,用于配置数据源

Service

Server中的一个逻辑功能层,一个Server可以包含多个Service。接收客户端的请求,然后解析请求,完成相应的业务逻辑,然后把处理后的结果返回给客户端。

#指定service的名字为Catalina
<Service name="Catalina">

Connector

连接器。是Service的核心组件之一,一个Service可以有多个Connector,主要是连接客户端请求;

用于接受请求并将请求封装成Request和Response,然后交给Container进行处理,Container处理完之后在交给Connector返回给客户端。

#port:指定服务器端要创建的端口号,并在这个端口监听来自客户端的请求。
#minProcessors:服务器启动时创建的处理请求的线程数。
#maxProcessors:最大可以创建的处理请求的线程数。
#enableLookups:如果为true,则可以通过调用request.getRemoteHost()进行DNS查询来得到远程客户端的实#际主机名,若为false则不进行DNS查询,而是返回其ip地址。
#redirectPort:指定服务器正在处理http请求时收到了一个SSL传输请求后重定向的端口号。
#acceptCount:指定当所有可以使用的处理请求的线程数都被使用时,可以放到处理队列中的请求数,超过这个数的请求将不予处理。
#connectionTimeout:指定超时的时间数(以毫秒为单位)。
<Connector port="80" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" URIEncoding="UTF-8"/>

Thread Pool

在tomcat中每一个用户请求都是一个线程,所以可以使用线程池提高性能。

Executor

配置一个共享线程池

<Executor name="tomcatThreadPool" namePrefix="catalina-exec-" maxThreads="150" minSpareThreads="4"/>

Engine

表示指定service中的请求处理机,接收和处理来自Connector的请求。

#defaultHost:指定缺省的处理请求的主机名,它至少与其中的一个host元素的name属性值是一样的。
<Engine name="Catalina" defaultHost="localhost">

Value

功能与Logger差不多,其prefix和suffix属性解释和Logger 中的一样

className:指定Valve使用的类名,如用org.apache.catalina.valves.AccessLogValve类可以记录应用程序的访问信息。

Directory:指定log文件存放的位置

Pattern:有两个值,common方式记录远程主机名或ip地址,用户名,日期,第一行请求的字符串,HTTP响应代码,发送的字节数。combined方式比common方式记录的值更多

Cluster

一般来说,在多个tomcat集群业务中,session会话共享是必须的需求,不然前端nginx转发过来的请求不知道之前请求在哪台tomcat节点上,从而就找不到session以至于最终导致请求失败。要实现tomcat session共享有多种方案,今天介绍下使用tomcat自带的cluster方式,在多个tomcat节点间自动实时复制session信息,配置起来很简单。tomcat自带的这种session共享方案,对于规模较小的tomcat集群来说够用了,但这个方案的效率比较低,在大并发下表现并不好。所以大规模的tomcat集群还是建议使用memcache或者redis来实现session共享。

Realm

相当于Tomcat的用户权限管理,用于配置安全管理角色,通常读取tomcat-uesrs.xml进行验证表示存放用户名,密码及role的数据库

className:指定Realm使用的类名,此类必须实现org.apache.catalina.Realm接口

Host

表示一个虚拟主机,用于进行请求的映射处理。每个虚拟主机可以看做独立的请求文件。

#name:指定主机名
#appBase:应用程序基本目录,即存放应用程序的目录
#unpackWARs:如果为true,则tomcat会自动将WAR文件解压,否则不解压,直接从WAR文件中运行应用程序。
<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true">

Context

表示一个web应用程序,通常为WAR文件,关于WAR的具体信息见servlet规范。

docBase:应用程序的路径或者是WAR文件存放的路径

path:表示此web应用程序的url的前缀,这样请求的url为http://localhost:8080/path/****

reloadable:这个属性非常重要,如果为true,则tomcat会自动检测应用程序的/WEB-INF/lib 和/WEB-INF/classes目录的变化,自动装载新的应用程序,我们可以在不重起tomcat的情况下改变应用程序。

Manager


Loader


Resource


Web App


Filter


POJO


Servlet

优化方案

内存优化

在catalina.sh前面加上

JAVA_OPTS="-XX:PermSize=64M -XX:MaxPermSize=128m -Xms512m -Xmx1024m -Duser.timezone=Asia/Shanghai"

说明:其内存的配置需要根据服务器(或虚拟机)的实际内存来配置。

线程优化-单连接器

#maxThreads="600" //最大线程数
#minSpareThreads="100" //初始化时创建的线程数
#maxSpareThreads="500" //一旦创建的线程超过这个值,Tomcat就会关闭不再需要的socket线程。
#acceptCount="700" //指定当所有可以使用的处理请求的线程数都被使用时,可以放到处理队列中的请求数,超过这个数的请求将不予处理
<Connector port="80" protocol="HTTP/1.1" maxThreads="600" minSpareThreads="100" maxSpareThreads="500" acceptCount="700" connectionTimeout="20000" redirectPort="8443" />

线程优化-多连接器

由于tomcat有多个connector,所以tomcat线程的配置,又支持多个connector共享一个线程池。

<Executor name="tomcatThreadPool" namePrefix="catalina-exec-" maxThreads="500" minSpareThreads="20" maxIdleTime="60000" />

然后,修改<Connector ...>节点,增加executor属性,executor设置为线程池的名字:

<Connector executor="tomcatThreadPool" port="80" protocol="HTTP/1.1"  connectionTimeout="60000" keepAliveTimeout="15000" maxKeepAliveRequests="1"  redirectPort="443" />

禁用DNS

当web应用程序向要记录客户端的信息时,它也会记录客户端的IP地址或者通过域名服务器查找机器名转换为IP地址。

DNS查询需要占用网络,并且包括可能从很多很远的服务器或者不起作用的服务器上去获取对应的IP的过程,这样会消耗一定的时间。

修改server.xml文件中的Connector元素,修改属性enableLookups参数值: enableLookups="false"

如果为true,则可以通过调用request.getRemoteHost()进行DNS查询来得到远程客户端的实际主机名,若为false则不进行DNS查询,而是返回其ip地址

设置session过期时间

#conf/web.xml中通过参数指定
<session-config>
    <session-timeout>180</session-timeout>
</session-config>

Apr插件

未完待续。。。。

 

 

欢迎各位大神评论点赞!

发布了12 篇原创文章 · 获赞 15 · 访问量 271

猜你喜欢

转载自blog.csdn.net/xieweikun_7/article/details/105329137
今日推荐