1. 首页 > 快讯

深入浅出 Tomcat 架构设计解析

大家好,关于深入浅出 Tomcat 架构设计解析很多朋友都还不太明白,不过没关系,因为今天小编就来为大家分享关于的知识点,相信应该可以解决大家的一些困惑和问题,如果碰巧可以解决您的问题,还望关注下本站哦,希望对各位有所帮助!

总体设计为了让读者更深入地了解tomcat相关组件的概念,我将采用启发式解释的方法来介绍tomcat的整体设计!从如何设计一个应用服务器开始,逐步完善,直到最终推导tomcat 的整体结构!

[[283520]]

2.1.1 server从最基本的功能来看,服务器可以简单地看成是一个应用程序(容器服务器、应用服务器等这里不再细分)。它只需要能够接受客户端请求并解析,完成相关业务处理。最后将处理结果作为响应返回给客户端。

通常,我们可以通过socket监听服务器的指定端口来实现该功能。根据描述,设计可以如下:

我们通过start()方法启动服务器,打开socket链接,监听服务器端口,接受客户端的请求并返回响应。同时提供了stop方法()来停止服务器,释放网络资源。

如果我们设计的不是服务器,而只是嵌入在QPS要求不高的应用系统中的远程请求处理方案,这可能是一个不错的方案!然而,我们正在设计的是一个应用服务器。

2.1.2 connector和container在实践中很快发现将请求和处理放在一起扩展性很差,比如适应多种网络协议,但请求处理逻辑是一样的。因为tomcat始终支持与apache集成,无论是AJP协议还是HTTP协议。例如,当Web应用单独部署到tomcat时,使用HTTP协议;集群部署apache时,使用AJP协议进行连接。当应用服务器tomcat在两种架构之间切换时,应保证Web应用不需要做任何改变。

因此,很自然地想到从概念上分离网络协议和请求处理,如下所示:

一个服务器可以包含多个连接器和容器。连接器负责打开套接字、监听客户端请求、返回响应数据;容器负责具体的请求处理;每个都有自己的start() 和stop() 方法来加载和释放其维护的资源。

同样,这种设计仍然有缺点,即如何知道哪个容器处理来自某个连接器的请求?比较合理的设计应该是这样的:

也许你以为通过维护一个复杂的映射规则就可以解决上面的问题,但事实是可以多次解决,因为上面的设计足够灵活!如图2-3所示,一台服务器包含多个服务,一个服务负责多个服务。一个连接器和一个容器,使得来自容器的请求只能由其所属服务维护的容器来处理。多个服务彼此独立,但共享一个JVM和系统类库。

在tomcat规范中,容器组件的名称是engine,用来表示整个servlet引擎。但是,应该记住,它不是servlet 容器,server 代表的是servlet 容器。引擎只需要负责请求的处理,不需要考虑请求的链接、协议、返回等的处理。

2.1.3 container设计上一节解决了协议和容器的解耦,但我们设计的是应用服务器,用于部署和运行Web应用程序。它是一个运行环境而不是一个具体的业务处理系统。因此,我们需要在引擎容器中支持Web管理应用。当接收到来自连接器的处理请求时,引擎可以找到合适的Web应用程序来处理。

我们使用上下文来表示一个Web应用程序,一个引擎可以包含多个上下文。

至此,设计已经越来越完美了!但现在有一个实际场景。在线主机负责多个域名的服务。我们应该如何处理呢?在主机上运行多个应用程序服务器实例?是的!但是如果您只运行一个实例怎么办?

我们可以将每个域名视为一个虚拟主机。每个虚拟主机包含多个Web应用程序。客户端用户不关心这些,所以如下图:

一个主机可以包含多个上下文应用程序。

通过阅读servlet规范,我们知道在一个web应用中,会包含多个servlet实例来处理不同的请求链接,因此需要一个组件。该组件在tomcat中称为包装器,因此修改后的设计如下:

到目前为止,我们已经多次提到“容器”的概念,有时指引擎,有时指上下文,但实际上它代表了一类组件,其功能是接受请求并返回响应数据。尽管特定的操作可以委托给子组件,但行为定义是一致的。基于这个理念,我们可以再次修改设计图,如下:

我们用container来表示一个容器,它可以添加和维护子容器,所以engine、host、context、wrapper都继承了container。服务与引擎结合(tomcat8.5.6之前,与容器结合)。

请记住,框架设计是否需要如此复杂取决于需求。如果你只需要嵌入式启动Tomcat,不需要支持多个Web应用程序,那么你可以只在服务中维护一个简化版本的引擎。

补充:Tomcat的容器还有一个非常重要的功能,就是后台处理,用于实现常规的异步处理,比如扫描文件变化等,实现原理是在容器中定义了backgroundProcess()方法,及其基本抽象类containerbase确保在启动组件时异步启动后台处理。因此,大多数情况下,每个容器组件只需要重写该方法,不需要考虑创建异步线程。

用户评论

可儿

看标题应该能了解到Tomcat是怎么工作的原理吧!

    有18位网友表示赞同!

ヅ她的身影若隐若现

一直想深入了解一下Tomcat的架构,这篇文章刚好合适。

    有9位网友表示赞同!

掉眼泪

终于找到一篇讲解Tomcat设计理念的来了,太好了!

    有18位网友表示赞同!

ー半忧伤

学习web开发的人肯定需要了解Tomcat的运行机制吧?

    有7位网友表示赞同!

夏以乔木

希望文章能详细介绍tomcat不同组件之间的关系。

    有11位网友表示赞同!

太难

对于Javaweb开发来说,掌握Tomcat架构是非常重要的。

    有10位网友表示赞同!

軨倾词

准备做深入学习JVM和 web容器了,先从 Tomcat 开始了解下。

    有20位网友表示赞同!

权诈

这篇文章肯定能让我对 Tomcat 有个更全面的理解!

    有9位网友表示赞同!

关于道别

我已经用过Tomcat很多次了,但从来没仔细研究过它的设计原理。

    有10位网友表示赞同!

惯例

想深入理解tomcat的源码,这本书一定是个好起点。

    有9位网友表示赞同!

金橙橙。-

最近在学习 servlet 和 JSP,了解Tomcat架构能帮助我更有效地学习。

    有7位网友表示赞同!

咆哮

希望能找到关于 Tomcat 性能调优方面的知识

    有16位网友表示赞同!

纯情小火鸡

期待文章能够以通俗易懂的方式解释复杂的 Tomcat 架构设计

    有9位网友表示赞同!

独角戏°

终于不用去猜自己部署的Java应用背后的原理了!

    有5位网友表示赞同!

如你所愿

学习架构设计的绝佳素材,期待开拓视野!

    有5位网友表示赞同!

無極卍盜

这本书的内容听起来很有深度,能帮助我更好地理解 Java 应用部署。

    有15位网友表示赞同!

我绝版了i

对于想要深入学习 Tomcat 的开发者来说非常有用.

    有19位网友表示赞同!

来自火星的我

这篇文章能帮助我解决一些关于 Tomcat 的疑问!

    有17位网友表示赞同!

泡泡龙

希望能看到一些 Tomcat 的实践案例和应用场景。

    有14位网友表示赞同!

本文采摘于网络,不代表本站立场,转载联系作者并注明出处:https://www.iotsj.com//kuaixun/7401.html

联系我们

在线咨询:点击这里给我发消息

微信号:666666