什么是Tomcat?原始的Java servlet容器
你需要了解的关于Tomcat的一切。高可用性的Java和Jakarta EE应用服务器,用于Servlets、JSP和WebSockets。
Apache Tomcat是一个历史悠久的开源Java servlet容器,实现了核心的Java企业(现在的Jakarta EE)规范,包括Jakarta Servlet、Jakarta Server Pages和Jakarta WebSocket规范。
Tomcat于1998年由Apache软件基金会首次发布,仅比Java本身晚四年。Tomcat开始作为原始Java ServletAPI和JavaServer Pages规范的参考实现。今天,它仍然是使用最广泛的Java应用服务器,拥有一个经过良好测试和验证的核心引擎,具有良好的可扩展性。
Tomcat和Jakarta EE
像其他Java企业工具一样,Tomcat已经从最初的Java EE规范迁移到了Jakarta EE。Tomcat 9和更早的版本是基于Java EE的;Tomcat 10和更高版本是基于Jakarta EE的。从Tomcat 10开始的所有版本都支持将包的名称改为jakarta.* 。截至本文撰写时,最新的版本是Tomcat 10.0.23。
在这个简短的介绍中,你将了解到为什么许多开发者选择Tomcat来运行Java Web应用程序。你将得到Tomcat的概述和使用方法、安装说明,以及使用Tomcat部署Java应用程序的四种方法的简要指南。
Tomcat是应用服务器还是Web服务器?
Java生态系统支持几种类型的应用服务器:
- Servlet容器是Jakarta Servlet规范的一个实现,主要用于托管Servlet。
- Web服务器是一个旨在为本地系统提供文件的服务器,如Apache。
- Java企业应用服务器是对Jakarta EE规范的全面实现。
从本质上讲,Tomcat是一个Servlet和JSP容器:
- 一个Java(或Jakarta)servlet定义了HTTP请求的端点,并将它们路由到业务逻辑代码进行处理。
- JSP,即Jakarta服务器页面,是一种服务器端的视图渲染技术,允许使用来自服务器内部的数据以及来自请求和响应的信息来定义HTML界面。作为开发者,你编写Servlet或JSP页面,为请求和响应定义规则,然后让Tomcat处理路由。
Tomcat还包含Coyote网络服务器。Coyote使Tomcat有可能与Apache网络服务器一起为静态文件提供服务(关于这一点很快就会有更多介绍)。
Tomcat的一个扩展版本,称为TomEE,包括更广泛的Jakarta规范和能力,包括Jakarta Persistence API。(TomEE通过了Jakarta Web Profile 9.1认证)。
接下来,我们将看看如何使用Tomcat来托管servlets和JSPs。
下载并安装Tomcat
作为软件世界中的一个古老版本,Tomcat有几个可用的版本。在大多数情况下,你可以只使用最新的稳定版本。
为了开始工作,请下载最新版本的Tomcat。你可以选择将Tomcat下载为档案(.zip或tar.gz),或下载为已安装的服务。最佳选择取决于你,除非你不在Windows上运行,在这种情况下,你将选择存档。我们将在本文中使用存档。
你也可以在命令行中用wget 等工具下载存档。在这种情况下,你只需输入一个命令,如
wget https://downloads.apache.org/tomcat/tomcat-10/v<VER>/bin/apache-tomcat-<VER>.tar.g
其中是你想要的版本。
从Java迁移到Jakarta EE
如果你从Tomcat 9迁移到10,你必须改变任何调用,java.* 到jakarta.* 。例如,javax.servlet-api变成jakarta.servlet-api 。如果你要迁移一个大的项目,请查看用于Jakarta EE的Apache Tomcat迁移工具。
Tomcat的Windows安装
下面的说明假定你是从存档中安装的。如果你运行的是Windows并且想使用安装程序,只需下载.exe 文件并运行它。Tomcat将以合理的默认值将自己安装为一个服务。然后它将通知你安装的位置,你可以像在那里解压档案一样继续进行。
第一步\命令行安装
转到命令行,输入gunzip apache-tomcat-10.0.22.tar.gz ,然后输入tar -xf apache-tomcat-10.0.22.tar 。这个命令会创建以下目录:
- /bin包含用于执行Tomcat的脚本。
- /webapps是你将部署你的应用程序的位置。
- /logs是Tomcat输出其日志的地方。注意,Tomcat的日志默认会进入
/logs/catalina.out。你可以使用这个文件来调试问题,结合应用程序特定的日志文件。 - /lib是Tomcat寻找JAR的地方。你将在这里存储不包括在Tomcat中的额外包,如JPA。
- /conf是Tomcat的配置XML,你可以在这里做一些事情,比如为Tomcat添加用户和角色。
第二步\启动Tomcat
如果你把Tomcat安装为一个服务,它已经在运行了。否则,请在命令行输入./catalina.sh start ,启动它。(输入"./catalina.sh",不带参数,以查看所有可用的命令)。现在,你应该能够在浏览器中浏览到Tomcat的欢迎屏幕,如图1所示。
如何在Tomcat中部署一个应用程序
Tomcat的webapps 目录是你部署应用的地方。你可以把一个.war文件放在那里,Tomcat会运行它。.war文件是网络应用程序资源的标准包装;它本质上是一个Java归档文件(.jar),带有一些附加文件,告诉容器如何运行它。
接下来,我们将看看在Tomcat中部署静态文件和Web应用程序的另外三种方法。
爆炸式部署
一个 "爆炸式 "的网络应用程序是没有被压缩成.war文件的,这意味着它仍然包含所有以目录和文件形式布置的元素。你解压的Tomcat归档文件中有几个以这种方式部署的例子,你可以在/webapps/examples 目录中找到。爆炸式部署的好处是你可以查看那里的文件,而不必担心压缩问题。
如果你导航到**http://localhost:8080/examples,**你会发现一个链接列表。这个页面是由Tomcat从`/webapps/examples/index.html` 文件中渲染出来的。Tomcat正从文件系统中提供一个HTML文件,这是Tomcat的Coyote引擎作为Web服务器的一个实例。
本页的例子很好地概述了Tomcat为Servlet、JSP和WebSockets提供服务的能力。Tomcat默认还包括一个管理应用程序,可在/manager 路径下找到。除其他事项外,该应用程序允许你从Web控制台启动、停止和重新部署应用程序。
使用Tomcat的反向代理
Tomcat可以从磁盘上提供静态文件(并提供APR库以更有效地这样做),但将Tomcat与旗舰的Apache web服务器(httpd)结合起来处理静态文件也很常见。
有几种方法可以将Tomcat和Apache服务器一起使用。第一种是所谓的 "反向代理",即Apache处理静态文件的请求,然后将其他资源请求(例如/webapp/** )交给Tomcat。然后Apache服务器将响应传回给客户端。这实际上只是一个代理,但它被称为反向代理,以区别于典型的客户端代理的作用。
通过设置Apache的配置文件,安排一个反向代理并不困难。这里可以找到一个简单的配置。
另一种方法是使用所谓的AJP(Apache JServe Protocol),它可以更容易地处理类似元数据的头文件。AJP有相同的架构设置(apache<->Tomcat),并有资格作为反向代理。这种方法避免了一些手工操作,但需要更多的前期配置。你可以在这里了解更多关于AJP的信息。
MicroSoft IIS也可以进行类似的设置。
嵌入式Tomcat
在很长一段时间里,Jetty是唯一能够作为嵌入式服务器运行的服务器。这种情况已经改变了,现在Tomcat也可以嵌入运行。使用嵌入式服务器的想法是,你有一个带有主类的应用程序(即一个独立的Java应用程序),从其代码库中调用服务器功能,而不是像你目前看到的那样,服务器包含应用程序文件。总的来说,这提供了一个更简单和可移植的开发模式,并迅速成为规范。(例如,Spring Boot就使用了一个在开发模式下运行的嵌入式Tomcat实例)。
运行嵌入式服务器可以使操作简单化,因为你现在只需要处理一个单一的组件(应用程序),而不是同时处理应用程序和服务器的部署。另一方面,Tomcat作为一个独立的主机运行的设置仍然非常普遍。
要嵌入运行Tomcat,你要通过Maven或Gradle等依赖管理器包含服务器库。然后,在代码中以编程方式启动服务器,如清单1所示。
清单1.嵌入的Tomcat
package foo;
import java.io.File;
import org.apache.catalina.WebResourceRoot;
import org.apache.catalina.core.StandardContext;
import org.apache.catalina.startup.Tomcat;
import org.apache.catalina.webresources.DirResourceSet;
import org.apache.catalina.webresources.StandardRoot;
public class Main {
public static void main(String[] args) throws Exception {
Tomcat tomcat = new Tomcat();
tomcat.setPort(Integer.valueOf(8080));
StandardContext ctx = (StandardContext) tomcat.addWebapp("/", new File("src/main/webapp/").getAbsolutePath());
File additionWebInfClasses = new File("target/classes");
WebResourceRoot resources = new StandardRoot(ctx);
resources.addPreResources(new DirResourceSet(resources, "/WEB-INF/classes",
additionWebInfClasses.getAbsolutePath(), "/"));
ctx.setResources(resources);
tomcat.start();
tomcat.getServer().await();
}
}
清单1的主要内容是实例化Tomcat对象,并为其提供必要的参数,如监听的端口以及应用程序和类文件的位置,然后启动服务器。你可以在这里了解更多关于作为嵌入式服务器运行Tomcat的信息。
Tomcat vs. TomEE
如果你想用Tomcat使用更多的标准Java EE或Jakarta EE功能,一个选择是将这些库添加到Tomcat或你的应用依赖中。另一个选择是使用TomEE。TomEE是同一个Tomcat引擎,具有额外的Java企业支持,包括流行的JPA和CDIAPIs。TomEE的规范是基于Java EE网络配置文件的,所以它比Tomcat提供了更多的功能,但并不是像WildFly或GlassFish那样完全的Java EE应用服务器。
高可用性和集群
Tomcat支持高可用性和集群。高可用性基本上是指能够故障转移到服务器的另一个实例,并重新创建会话,就像没有出错一样。集群是创建同一服务器的多个版本以处理大流量的能力。
Tomcat与其他服务器的比较
你可能想知道Tomcat与其他服务器的比较。让我们在下面快速看一下。
Tomcat与Jetty
作为Tomcat的替代品,Jetty倾向于关注性能,而Tomcat关注的是与Jakarta EE规范保持同步。Jetty也因普及嵌入式servlet容器的运行而闻名。像Tomcat一样,Jetty提供了一个核心的servlet/JSP引擎,可以用插件进行扩展。一般来说,Tomcat仍然更受欢迎,但两者都是可靠的选择。
Tomcat vs Nginx
Nginx是一个流行的、高性能的网络服务器。它的功能与Apache网站服务器相似。Nginx也可以作为Tomcat的反向代理服务器使用。
Tomcat vs WildFly
WildFly是Red Hat的Jakarta EE实现。它也是一个长期运行的项目(以前被称为JBoss),曾经使用Tomcat作为其Servlet/JSP容器。
Tomcat与Httpd
Httpd是前面讨论的Apache网络服务器的另一个名字。Httpd是Apache网络服务器中的进程名称。你可以用这个服务器作为Tomcat的一个反向代理。
总结
Tomcat仍在积极开发,与变化保持同步,并为部署Web应用提供了一个坚实可靠的平台。它的持续流行以及被许多PaaS系统选为默认的Java平台,都证明了它的持续成功。
这个故事,"什么是Tomcat?最初的Java servlet容器 "最初是由JavaWorld发布的。