失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > 超详细 Tomcat 介绍

超详细 Tomcat 介绍

时间:2020-09-07 05:52:13

相关推荐

超详细 Tomcat 介绍

目录

超详细 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又是什么呢?ServletJava 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的程序中却能够直接使用HttpServletRequestHttpServletResponse这两个对象,是怎么回事呢?

答案是,这些接口的对象都是Servlet容器创建的。当我们的Servlet代码运行在Servlet容器的时候,由Servlet容器自动给我们创建的。

现在我们总结下,什么是Servlet容器。

Servlert容器是实现了JavaEE Servlet API并在Java WEB程序运行的时候自动注入到我们编写的Servlet代码中的 一个Servlet运行环境。

Tomcat 是一个 Web 服务器

Web服务器一般指网站服务器,通过浏览器发送请求并返回相应响应。

我们编写Servlet程序部署在Tomcat上也是通过浏览器进行请求响应的,所以Tomcat也是一个Web服务器。

目前最主流的三个WEB服务器是ApacheNginxIIS

为什么没有Tomcat,因为Tomcat主要还是作为一个Servlet容器存在。

Tips :

一个Web软件可以是多种功能的服务器组合。

例如:

Tomcat既可以作为Servlet容器使用,也可以作为Web服务器使用。

Nginx既可以作为Web服务器,也可以作为反向代理服务器或者电子邮件代理服务器使用。

为什么要用 Tomcat

原因主要有两个:

Tomcat是一个Servlet容器,我们编写的Java WEB程序想要运行起来,必须部署在Servlet容器中。

TomcatApache基金会的一个免费开源项目,相比其他收费软件来讲可以节省项目开支。

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 介绍》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。