大家好,关于深入浅出 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确保在启动组件时异步启动后台处理。因此,大多数情况下,每个容器组件只需要重写该方法,不需要考虑创建异步线程。
本文采摘于网络,不代表本站立场,转载联系作者并注明出处:https://www.iotsj.com//kuaixun/7401.html
用户评论
看标题应该能了解到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位网友表示赞同!
对于想要深入学习 Tomcat 的开发者来说非常有用.
有19位网友表示赞同!
这篇文章能帮助我解决一些关于 Tomcat 的疑问!
有17位网友表示赞同!
希望能看到一些 Tomcat 的实践案例和应用场景。
有14位网友表示赞同!