| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> Java知识库 -> Tomcat的实现原理 -> 正文阅读 |
|
[Java知识库]Tomcat的实现原理 |
Tomcat 是一个Web容器。作为 Web 应用的容器承载着 Web 请求处理和响应的工作 由此 Web 容器的功能开始有了扩展,除了能够处理 HTTP 请求,还需要 HTTP 服务器调用服务端程序也就是常说的 Web 应用。 由于 Servlet 不能独立运行,因此需要由一个 Servlet 容器来承载它,并且对其进行初始化启动等管理操作。 为了承载 Servlet,也加入了 Servlet 容器,不过每个 Servlet 都代表一个业务类,包含了一些业务应用如果都接入到 Web 容器中会用户提供统一的服务响应就需要遵循统一的接口。 说白了就是要遵守一定规则才能放到 Servlet 容器中,方便进行管理,那么这个规则就是 Servlet 接口。从图中可以看出 Servlet 接口会对单个的 Servlet 进行标准定义。 对于Tomcat而言,它并不知道我们会有什么样的方法,这些都只是在项目被部署进webapp下后才确定的,由此分析,必然用到了Java的反射来实现类的动态加载、实例化、获取方法、调用方法。但是我们部署到Tomcat的中的Web项目必须是按照规定好的Servlet 接口来进行编写,以便进行调用
对于 Servlet 接口而言定义了 init 方法用做 Servlet 资源的初始化,同时也定义 destroy 方法用做 Servlet 资源的释放。 其中 Service 方法用来实现具体的业务需求,可以看到该方法传入 ServletRequest 和 ServletResponse 两个参数,分别表示封装了用户的请求信息和 Servlet 的响应信息。 接口中的 getServletConfig 方法会返回 ServletConfig,ServletConfig 是用来封装 Servlet 的初始化参数的,可以在 web.xml 配置 Servlet 参数,然后通过 getServletConfig 方法获取参数。 上面介绍了 Servlet 接口一下,再通过图 5 对 Servlet 接口调用的周边类进行深入了解。 如图 5 所示,Servlet 接口依赖 ServletConfig 接口,该接口正好是用来处理 Servlet 配置参数的,ServletConfig 接口同时也会关联 ServletContext 获取 Servlet 上下文的信息。 Servlet 接口中的 service 方法依赖两个参数分别是 ServletRequest 和 ServletResponse。 同时有两个接口 HttpServletRequest 和 HttpServletResponse 会分别继承 ServletRequest 和 ServletResponse。 一般而言 Servlet 作为接口需要具体的实现类去实现这个接口,因此 Servlet 规范提供了一个抽象类名叫 GenericServlet,它实现了 Servlet。 接着有一个 HttpServlet 的类继承 GenericServlet,为了处理 HTTP 请求这类也会依赖 HttpServletRequest 和 HttpServletResponse。 Servlet 接口定义是 Servlet 容器的重要组成部分,Servlet 容器通过接口去管理接入的 Servlet 实体。 在了解 Servlet 接口规范和 Servlet 容器以后,我们知道如果需要加载不同的动态资源(Web 应用)需要利用 Servlet 容器去加载对应的 Servlet,那么这个加载过程是如何进行的? 我们接下来看看 Servlet 的请求和响应流程。
1.用户通过浏览器发起 HTTP 请求。 Tomcat的结构比较复杂,但是又比较模块化,所以只要我们找到了最核心的模块,对于tomcat的整体架构和工作原理就很好理解了。 Connector(连接器)组件负责生成请求对象和响应对象的,Tomcat默认为HttpConnector,负责根据收到的Http请求报文生成Request对象和Response对象,并把这两个对象传递给Container,然后根据Response中的内容生成相应的HTTP报文。 Container是容器的父接口,所有子容器都必须实现这个接口,简单来说就是服务器部署的项目是运行在Container中的。Container里面的项目获取到Connector传递过来对应的的Request对象和Response对象进行相应的操作。 Connector可以根据不同的的设计和应用场景进行替换,而一个Container可以对应多个Connector。多个Connector和一个Container就形成了一个Service,而Service可以对外提供服务。 而service由server提供生存环境并控制其生命周期, 假设有一个请求http://localhost:8080/test/index.jsp 我们梳理一下流程 上面我们知道了流程,但是connector是如何接受请求?又如何封装成Request和Response对象的呢? Connector是使用ProtocolHandler来处理请求的,不同的ProtocolHandler代表不同的连接类型,比如我们之前说到的Http11Protocol使用的是普通Socket来连接的,Http11NioProtocol使用的是NioSocket来连接的 可以看到ProtocolHandler由包含了三个部件:Endpoint、Processor、Adapter Endpoint用来处理底层Socket的网络连接,由于是处理底层的Socket网络连接,因此Endpoint是用来实现TCP/IP协议的, Processor用于将Endpoint接收到的Socket封装成Request,用来实现HTTP协议的 Adapter用于将Request交给Container进行具体的处理,用来将请求适配到Servlet容器进行具体的处理 Endpoint的抽象实现类AbstractEndpoint里面定义的Acceptor和AsyncTimeout两个内部类和一个Handler接口。Acceptor用于监听请求,AsyncTimeout用于检查异步Request的超时,Handler用于处理接收到的Socket,在内部调用Processor进行处理。 到了这里,我们可以回答上面的问题了,但是Container是如何进行处理的以及处理完之后是如何将处理完的结果返回给Connector我们还不清楚, Engine:引擎,用来管理多个站点,一个Service最多只能有一个Engine; Host:代表一个站点,也可以叫虚拟主机,通过配置Host就可以添加站点; Context:代表一个应用程序,对应着平时开发的一套程序,或者一个WEB-INF目录以及下面的web.xml文件; Wrapper:每一Wrapper封装着一个Servlet的一个或多个实例; Context和Host的区别是Context表示一个应用,Tomcat中默认配置下webapps下的每一个文件夹目录都是一个Context而整个webapps就是一个Host站点 我们访问应用Context的时候, 如果是Host(webapps)下的其他应用,则可以使用http://www.test.com/docs进行访问, 默认指定的根应用(ROOT)是可以进行改变的 Container如何处理请求 Container处理请求是使用Pipeline-Valve管道来处理的 Pipeline-Valve是责任链模式,责任链模式是指在一个请求处理的过程中有很多处理者依次对请求进行处理,每个处理者负责做自己相应的处理,处理完之后将处理后的请求返回,再让下一个处理着继续处理。 每个Pipeline都有特定的Valve,而且是在管道的最后一个执行,这个Valve叫做BaseValve,BaseValve是不可删除的; 在上层容器的管道的BaseValve中会调用下层容器的管道。 当执行到StandardWrapperValve的时候,会在StandardWrapperValve中创建FilterChain,并调用其doFilter方法来处理请求,这个FilterChain包含着我们配置的与请求相匹配的Filter和Servlet,其doFilter方法会依次调用所有的Filter的doFilter方法和Servlet的service方法,这样请求就得到了处理! 当所有的Pipeline-Valve都执行完之后,并且处理完了具体的请求,这个时候就可以将返回的结果交给Connector了,Connector在通过Socket的方式将结果返回给客户端。 如果执行过程中间出现问题就抛异常。 |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/24 3:13:54- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |