目录
超详细 Tomcat 介绍什么是 TomcatTomcat 是一个 Servlet 容器Tomcat 是一个 Web 服务器 为什么要用 TomcatTomcat 架构Connector + ContainerContainer 容器 Tomcat 性能优化Tomcat 和 Nginx 、Apache 的关系超详细 Tomcat 介绍
什么是 Tomcat
学过Java
的同学对Tomcat
应该都比较熟悉,知道Tomcat
是一个Servlet
容器,也是一个Web
服务器,
我们平常编写的Java Web
项目就可以在Tomcat
上运行。
这里可以分为两点进行理解:
Tomcat 是一个 Servlet 容器
什么是Servlet
容器应该很好理解,能运行Servlet
程序的环境就是Servlet
容器,常用的Servlet
容器有Tomcat
、jetty 等。
那么Servlet
又是什么呢?Servlet
是Java EE
提供的一组API
,我们可以使用Servlet API
来编写自己的Java Web
程序。
平常我们编写Servlet
程序的时候都是先继承 HttpServlet
接口,然后会在继承的方法(doGet()
,doPost()
…)中编写我们的代码。
public class MyServlet extends HttpServlet {@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {}@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {//设置响应的编码格式为UTF-8编码,否则发生中文乱码现象res.setContentType("text/html;charset=UTF-8");// 获得请求方式String method = req.getMethod();}}
我们编写Servlet
程序的时候并没有实现任何对象,学过Java
的都知道在调用对象方法的时候必须先创建对象才能调用,否则运行程序的时候会报异常。
而我们在Servlet
的程序中却能够直接使用HttpServletRequest
和HttpServletResponse
这两个对象,是怎么回事呢?
答案是,这些接口的对象都是Servlet
容器创建的。当我们的Servlet
代码运行在Servlet
容器的时候,由Servlet
容器自动给我们创建的。
现在我们总结下,什么是Servlet
容器。
Servlert
容器是实现了JavaEE Servlet API
并在Java WEB
程序运行的时候自动注入到我们编写的Servlet
代码中的 一个Servlet
运行环境。
Tomcat 是一个 Web 服务器
Web
服务器一般指网站服务器,通过浏览器
发送请求并返回相应响应。
我们编写Servlet
程序部署在Tomcat
上也是通过浏览器进行请求响应的,所以Tomcat
也是一个Web
服务器。
目前最主流的三个WEB服务器是Apache
、Nginx
、IIS
。
为什么没有Tomcat
,因为Tomcat
主要还是作为一个Servlet
容器存在。
Tips :
一个Web
软件可以是多种功能的服务器组合。
例如:
Tomcat
既可以作为Servlet
容器使用,也可以作为Web
服务器使用。
Nginx
既可以作为Web
服务器,也可以作为反向代理服务器或者电子邮件代理服务器使用。
为什么要用 Tomcat
原因主要有两个:
Tomcat
是一个Servlet
容器,我们编写的Java WEB
程序想要运行起来,必须部署在Servlet
容器中。
Tomcat
是Apache
基金会的一个免费开源项目,相比其他收费软件来讲可以节省项目开支。
Tomcat 架构
Connector + Container
连接器:监听网络端口,处理socket
连接
容器:加载和管理Servlet
,以及具体处理Request
请求;
Container 容器
Container 包含四个组件:
Wrapper
表示一个Servlet
。
Context
表示一个Web
应用程序,一个WEB
程序可能有多个Servlet
。
Host
表示一个虚拟主机,或者说一个站点,一个站点(Host
) 可以部署多个Web
应用。
Engine
表示一个完整的Servlet
引擎,一个完整的Servlet
引擎可以管理多个站点(Host
)。
我们可通过Tomcat
配置文件加深对这四个组件的层次关系理解。
<Server port="8005" shutdown="SHUTDOWN"> // 顶层组件,可包含多个 Service,代表一个 `Tomcat`实例<Service name="Catalina"> // 顶层组件,包含一个 Engine ,多个连接器<Connector port="8080" protocol="HTTP/1.1"connectionTimeout="20000"redirectPort="8443" /><!-- Define an AJP 1.3 Connector on port 8009 --><Connector port="8009" protocol="AJP/1.3" redirectPort="8443" /> // 连接器// 容器组件:一个 Engine 处理 Service 所有请求,包含多个 Host<Engine name="Catalina" defaultHost="localhost">// 容器组件:处理指定Host下的客户端请求, 可包含多个 Context<Host name="localhost" appBase="WEBapps"unpackWARs="true" autoDeploy="true">// 容器组件:处理特定 Context WEB应用的所有客户端请求<Context></Context></Host></Engine></Service></Server>
Tomcat
是如何将URL定位到Servlet
呢?
假如有用户访问一个 URL,比如图中的:8080/order/buy
。
那么访问过程如下图:
Tomcat 性能优化
Tomcat
性能指标:响应时间,TPS,服务器资源使用率。具体性能数据可以通过Jmeter
等压测工具进行压测得到。
在压测过程中如果发现性能指标太差的话,一般需要对Tomcat
性能进行优化。
优化主要有JVM
内存优化和线程池进行优化:
JVM 内存优化
修改 TOMCAT_HOME/bin/catalina.sh 中的 JAVA_OPTS 参数。
JAVA_OPTS="-server -Xms512m -Xmx1024m -XX:NewSize=512m -XX:MaxNewSize=1024M -XX:+DisableExplicitGC"参数说明:-server:jvm的server工作模式,对应的有client工作模式。使用“java -version”可以查看当前工作模式-Xms512m:初始Heap大小,使用的最小内存-Xmx1024m:Java heap最大值,使用的最大内存-XX:NewSize=512m:表示新生代初始内存的大小,应该小于 -Xms的值-XX:MaxNewSize=1024M:表示新生代可被分配的内存的最大上限,应该小于 -Xmx的值-XX:PermSize=1024m:设定内存的永久保存区域(注:jdk1.8 was removed)-XX:MaxPermSize=1024m:设定最大内存的永久保存区域(注:jdk1.8 was removed)-XX:+DisableExplicitGC:自动将System.gc()调用转换成一个空操作,即应用中调用System.gc()会变成一个空操作
线程池优化
修改 conf/server.xml 中的 Connector 参数,增加线程池。
<Executor name="tomcatThreadPool" namePrefix="req-exec-" maxThreads="600" minSpareThreads="100" maxSpareThreads="500" acceptCount="700" maxIdleTime="60000"/><Connector port="80" executor="tomcatThreadPool" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />maxThreads="600" // 请求处理的最大线程数,默认是200minSpareThreads="100" // 初始化时创建的线程数maxSpareThreads="500" // 一旦创建的线程超过这个值,Tomcat就会关闭不再需要的socket线程。acceptCount="700" // 指定当所有可以使用的处理请求的线程数都被使用时,可以放到处理队列中的请求数,超过这个数的请求将不予处理maxIdleTime="60000" // 线程最大空闲时间
当然除了这两点还有其他优化方向,这里只是介绍以下主要的和常用的。
Tomcat 和 Nginx 、Apache 的关系
网站架构中,Web
服务器一般是动静分离架构 ,Nginx + Tomcat,或者 Apache + Tomcat配合使用。
Nginx 、Apache 用来处理网站静态数据,如 html, css, js, img 等,Tomcat
用来处理动态数据,如用户的个性化数据展示。
为什么要做动静态分离?
并非Java
程序才做动静分离,任何语言的Web
程序都可以使用这种架构,
像 Nginx + php-fpm (php), Nginx + uwsgi (python),Nginx + Gin (go)
因为Web
服务器特别是像Nginx
,处理静态资源的能力强,日志、安全等功能也很完善,还可以作为负载均衡器甚至作为网关使用,Nginx
用得好可以大大简化后端的开发。
网站常用Web
服务器架构
END
如果觉得《超详细 Tomcat 介绍》对你有帮助,请点赞、收藏,并留下你的观点哦!