什么是Tomcat?原始的Java servlet容器

625 阅读10分钟

什么是Tomcat?原始的Java servlet容器

你需要了解的关于Tomcat的一切。高可用性的Java和Jakarta EE应用服务器,用于Servlets、JSP和WebSockets。

Apache Tomcat是一个历史悠久的开源Java servlet容器,实现了核心的Java企业(现在的Jakarta EE)规范,包括Jakarta ServletJakarta Server PagesJakarta 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提供了更多的功能,但并不是像WildFlyGlassFish那样完全的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发布的。