什么是汤姆猫? 原始的 Java servlet 容器
Apache Tomcat 是一个长期存在的开源 Java servlet 容器,它实现了核心 Java 企业(现在的 Jakarta EE)规范,包括 Jakarta Servlet、Jakarta Server Pages 和 Jakarta WebSocket 规范。
Tomcat 于 1998 年由 Apache 软件基金会首次发布,仅比 Java 发布晚四年。 Tomcat 最初是作为原始 Java Servlet API 和 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 是应用服务器还是网络服务器?
Java 生态系统支持多种应用服务器:
- servlet 容器是 Jakarta Servlet 规范的实现,主要用于托管 servlet。 Web 服务器是设计用于从本地系统(如 Apache)提供文件服务的服务器。 Java 企业应用程序服务器是 Jakarta EE 规范的成熟实现。
本质上,Tomcat 是一个 servlet 和 JSP 容器:
- Java(或 Jakarta)servlet 为 HTTP 请求定义端点并将它们路由到业务逻辑代码以进行处理。 JSP 或 Jakarta Server Pages 是一种服务器端视图呈现技术,它允许使用来自服务器内部的数据以及来自请求和响应的信息来定义 HTML 界面。 作为开发人员,您编写 servlet 或 JSP 页面,为请求和响应定义规则,然后让 Tomcat 处理路由。
Tomcat 还包含 Coyote Web 服务器。 Coyote 可以结合 Apache Web 服务器使用 Tomcat 来提供静态文件(稍后会详细介绍)。
Tomcat 的一个扩展版本,称为 TomEE,包括更广泛的 Jakarta 规范和功能,包括 Jakarta Persistence API。 (TomEE 已通过 Jakarta Web Profile 9.1 认证。)
接下来,我们将了解如何使用 Tomcat 托管 servlet 和 JSP。
下载并安装 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 将自己安装为具有合理默认值的服务。 然后它会通知您安装位置,您可以继续进行,就好像您已经在那里解压缩了存档一样。
步骤 1. 命令行安装
转到命令行并键入 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 添加用户和角色之类的操作。
步骤 2. 启动 Tomcat
如果您将 Tomcat 安装为服务,则它已经在运行。 否则,继续并通过输入启动它 ./catalina.sh start
在命令行。 (键入不带参数的“./catalina.sh”以查看所有可用命令。)现在,您应该能够在浏览器中浏览到 Tomcat 的欢迎屏幕,如图 1 所示。
国际数据集团
图 1. Tomcat 欢迎页面。
如何在 Tomcat 中部署应用程序
雄猫的 webapps
目录是您将部署应用程序的地方。 您可以将 .war 文件放在那里,Tomcat 将运行它。 .war 文件是 Web 应用程序资源的标准包装; 它本质上是一个 Java 存档 (.jar) 文件,其中包含一些附加文件,告诉容器如何运行它。
接下来,我们将了解在 Tomcat 中部署静态文件和 Web 应用程序的另外三种方法。
展开部署
“展开的”Web 应用程序是未压缩为 .war 文件的应用程序,这意味着它仍然包含目录和文件中布置的所有元素。 您解压的 Tomcat 存档附带了几个以这种方式部署的示例,您可以在 /webapps/examples
目录。 展开部署的优点是您可以查看那里的文件而不必担心压缩。
如果您导航到 http://localhost:8080/examples,您将找到一个链接列表。 此页面由 Tomcat 从 /webapps/examples/index.html
文件。 Tomcat 正在从文件系统中提供一个 HTML 文件,它是充当 Web 服务器的 Tomcat Coyote 引擎的一个实例。
此页面上的示例很好地概述了 Tomcat 为 servlet、JSP 和 WebSocket 提供服务的能力。 默认情况下,Tomcat 还包含一个管理应用程序,位于 /manager
小路。 除此之外,此应用程序还允许您从 Web 控制台启动、停止和重新部署应用程序。
使用 Tomcat 进行反向代理
Tomcat 可以提供磁盘外的静态文件(并提供 APR 库以更有效地执行此操作),但将 Tomcat 与旗舰 Apache Web 服务器 (httpd) 结合使用以获取静态文件也很常见。
有几种方法可以一起使用 Tomcat 和 Apache 服务器。 第一个是所谓的“反向代理”,其中 Apache 处理对静态文件的请求,然后传递其他资源请求(/webapp/**
,例如)到 Tomcat。 然后 Apache 服务器将响应传回客户端。 这实际上只是一个代理,但它被称为反向代理以区别于代理的典型客户端角色。
通过设置 Apache 配置文件来安排反向代理并不难。 可以在此处找到一个简单的配置。
另一种方法是使用所谓的 AJP(Apache JServe 协议),它可以更轻松地处理类似元数据的标头。 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("https://www.infoworld.com/", 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(), "https://www.infoworld.com/"));
ctx.setResources(resources);
tomcat.start();
tomcat.getServer().await();
}
}
清单 1 的要点是实例化一个 Tomcat 对象并为其提供必要的参数,例如要侦听的端口以及应用程序和类文件的位置,然后启动服务器。 您可以在此处了解有关将 Tomcat 作为嵌入式服务器运行的更多信息。
Tomcat 与 TomEE
如果您想在 Tomcat 中使用更多标准 Java EE 或 Jakarta EE 功能,一种选择是将这些库添加到 Tomcat 或您的应用程序依赖项中。 另一种选择是使用 TomEE。 TomEE 是相同的 Tomcat 引擎,具有额外的 Java 企业支持,包括流行的 JPA 和 CDI API。 TomEE 的规范基于 Java EE Web 配置文件,因此它为您提供的不仅仅是 Tomcat,但不是像 WildFly 或 GlassFish 这样的成熟的 Java EE 应用程序服务器。
高可用性和集群
Tomcat 支持高可用性和集群。 高可用性本质上是故障转移到服务器的另一个实例并重新创建会话的能力,就好像没有出现任何问题一样。 集群是创建同一服务器的多个版本以处理大量流量的能力。
Tomcat 与其他服务器的比较
您可能想知道 Tomcat 与其他服务器相比如何。 下面让我们快速浏览一下。
Tomcat 与 Jetty
作为 Tomcat 的替代品,Jetty 倾向于关注性能,而 Tomcat 则专注于与 Jakarta EE 规范保持同步。 Jetty 还以普及运行嵌入式 servlet 容器而闻名。 与 Tomcat 一样,Jetty 提供了一个可以使用插件扩展的核心 servlet/JSP 引擎。 总的来说,Tomcat 仍然更受欢迎,但两者都是不错的选择。
Tomcat 与 Nginx
Nginx 是一种流行的高性能 Web 服务器。 它的功能类似于 Apache Web 服务器。 Nginx 也可以用作 Tomcat 的反向代理服务器。
Tomcat 与 WildFly
WildFly 是 Red Hat 的 Jakarta EE 实现。 它也是一个长期运行的项目(以前称为 JBoss),曾经使用 Tomcat 作为其 Servlet/JSP 容器。
Tomcat 与 Httpd
Httpd 是前面讨论的 Apache Web 服务器的另一个名称。 Httpd 是 Apache Web 服务器中的进程名称。 您可以将此服务器用作 Tomcat 的反向代理。
结论
Tomcat 保持积极开发,跟上变化的步伐,并为部署 Web 应用程序提供坚实可靠的平台。 它的持续流行和作为许多 PaaS 系统的默认 Java 平台的选择都证明了它的持续成功。