tomcat原理

tomcat位置
tomcat实际上是部署在服务器上的;
tomcat作用
tomcat服务器是一个Servlet和JSP容器,它响应HTML页面的访问请求。
实际上Tomcat是Apache 服务器的扩展,但运行时它是独立运行的,所以当你运行tomcat 时,它实际上作为一个与Apache 独立的进程单独运行的,Apache 为HTML页面服务,而Tomcat 实际上运行JSP 页面Servlet;

简单的说就是tomcat接收到请求信息,把它分配到各个网站的;同时tomcat会去扫描.java文件;遍历.java,同时拿到所有路径;
tomcat顶层架构

Tomcat中最顶层的容器是Server,代表着整个服务器,从上图中可以看出,一个Server可以包含至少一个Service,用于具体提供服务,也可以知道tomcat可以一次执行多个service。

在service中核心是 connector(转发),container(容器)两个组件
1、Connector用于处理连接相关的事情,并提供Socket与Request和Response相关的转化;
2、Container用于封装和管理Servlet,以及具体处理Request请求;
所以可以知道tomcat主要是请求和分发

上图可以看到一个Tomcat中只有一个Server,一个Server可以包含多个Service,一个Service只有一个Container,但是可以有多个Connectors,这是因为一个服务可以有多个连接,如同时提供Http和Https链接,也可以提供向相同协议不同端口的连接,示意图如下:

多个 Connector 和一个 Container 就形成了一个 Service,有了 Service 就可以对外提供服务了,但是 Service 还要一个生存的环境,必须要有人能够给她生命、掌握其生死大权,那就非 Server 莫属了!所以整个 Tomcat 的生命周期由 Server 控制

在tomcat的conf目录下的server.xml配置文件中看出上图的配置各个包含关系;如下图(我这个是tomcat8.0版本的)


Server标签设置的端口号为8005,shutdown=”SHUTDOWN” ,表示在8005端口监听“SHUTDOWN”命令,如果接收到了就会关闭Tomcat。一个Server有一个Service,当然还可以进行配置,一个Server有多个,Service左边的内容都属于Container的,Service下边是Connector
总结一下
(1)Tomcat中只有一个Server,一个Server可以有多个Service,一个Service可以有多个Connector和一个Container;
(2) Server掌管着整个Tomcat的生死大权;
(4)Service 是对外提供服务的;
(5)Connector用于接受请求并将请求封装成Request和Response(Response封装了写操作)来具体处理;
(6)Container用于封装和管理Servlet,以及具体处理request请求;

关于container 和connector的关系
由上述内容我们大致可以知道一个请求发送到Tomcat之后,首先经过Service然后会交给我们的Connector,Connector用于接收请求并将接收的请求封装为Request和Response来具体处理,Request和Response封装完之后再交由Container进行处理,Container处理完请求之后再返回给Connector,最后在由Connector通过Socket将处理的结果返回给客户端,这样整个请求的就处理完了!

关于Socket(套接字)简要概括
套接字方法:socket
作用:监听端口(里面有while循环,可以做到一直监听),读取数据,和发送数据;
socket和网卡直接交互;
socket:可以给数据去封装;
Socket这个线程一直存活;在tomcat里监听端口;

Connector架构分析
Connector用于接受请求并将请求封装成Request和Response,然后交给Container进行处理,Container处理完之后在交给Connector返回给客户端。

因此,我们可以把Connector分为四个方面进行理解:

(1)Connector如何接受请求的?
(2)如何将请求封装成Request和Response的?
(3)封装完之后的Request和Response如何交给Container进行处理的?
(4)Container处理完之后如何交给Connector并返回给客户端的?

首先看一下Connector的结构图(图B),如下所示:

Connector就是使用ProtocolHandler来处理请求的,不同的ProtocolHandler代表不同的连接类型,比如:Http11Protocol使用的是普通Socket来连接的,Http11NioProtocol使用的是NioSocket来连接的。

其中ProtocolHandler由包含了三个部件:Endpoint、Processor、Adapter。

(1)Endpoint用来处理底层Socket的网络连接,Processor用于将Endpoint接收到的Socket封装成Request,Adapter用于将Request交给Container进行具体的处理。

(2)Endpoint由于是处理底层的Socket网络连接,因此Endpoint是用来实现TCP/IP协议的,而Processor用来实现HTTP协议的,Adapter将请求适配到Servlet容器进行具体的处理。

(3)Endpoint的抽象实现AbstractEndpoint里面定义的Acceptor和AsyncTimeout两个内部类和一个Handler接口。Acceptor用于监听请求,AsyncTimeout用于检查异步Request的超时,Handler用于处理接收到的Socket,在内部调用Processor进行处理

Container架构分析
Container用于封装和管理Servlet,以及具体处理Request请求,在Connector内部包含了4个子容器,结构图如下(图C):

4个子容器的作用分别是:
(1)Engine:引擎,用来管理多个站点,一个Service最多只能有一个Engine;
(2)Host:代表一个站点,也可以叫虚拟主机,通过配置Host就可以添加站点;
(3)Context:代表一个应用程序,对应着平时开发的一套程序,或者一个WEB-INF目录以及下面的web.xml文件;
(4)Wrapper:每一Wrapper封装着一个Servlet;
可以在tomcat的目录里对比

然后在webapps中(就是上面的Host),里面的docs,和root都代表着一个Context;

Context和Host的区别是Context表示一个应用,我们的Tomcat中默认的配置下webapps下的每一个文件夹目录都是一个Context,其中ROOT目录中存放着主应用,其他目录存放着子应用,而整个webapps就是一个Host站点;
我们访问应用Context的时候,如果是ROOT下的则直接使用域名就可以访问,例如:www.ledouit.com,如果是Host(webapps)下的其他应用,则可以使用http://www.ledouit.com/docs进行访问,当然默认指定的根应用(ROOT)是可以进行设定的,只不过Host站点下默认的主营用是ROOT目录下的。

Container如何处理请求的
ontainer处理请求是使用Pipeline-Valve管道来处理的!(Valve是阀门之意)

Pipeline-Valve是责任链模式,责任链模式是指在一个请求处理的过程中有很多处理者依次对请求进行处理,每个处理者负责做自己相应的处理,处理完之后将处理后的请求返回,再让下一个处理着继续处理。

但是!Pipeline-Valve使用的责任链模式和普通的责任链模式有些不同!区别主要有以下两点:

(1)每个Pipeline都有特定的Valve,而且是在管道的最后一个执行,这个Valve叫做BaseValve,BaseValve是不可删除的;

(2)在上层容器的管道的BaseValve中会调用下层容器的管道。

我们知道Container包含四个子容器,而这四个子容器对应的BaseValve分别在:StandardEngineValve、StandardHostValve、StandardContextValve、StandardWrapperValve。

Pipeline的处理流程图如下(图D):

(1)Connector在接收到请求后会首先调用最顶层容器的Pipeline来处理,这里的最顶层容器的Pipeline就是EnginePipeline(Engine的管道);

(2)在Engine的管道中依次会执行EngineValve1、EngineValve2等等,最后会执行StandardEngineValve,在StandardEngineValve中会调用Host管道,然后再依次执行Host的HostValve1、HostValve2等,最后在执行StandardHostValve,然后再依次调用Context的管道和Wrapper的管道,最后执行到StandardWrapperValve。

(3)当执行到StandardWrapperValve的时候,会在StandardWrapperValve中创建FilterChain,并调用其doFilter方法来处理请求,这个FilterChain包含着我们配置的与请求相匹配的Filter和Servlet,其doFilter方法会依次调用所有的Filter的doFilter方法和Servlet的service方法,这样请求就得到了处理!

(4)当所有的Pipeline-Valve都执行完之后,并且处理完了具体的请求,这个时候就可以将返回的结果交给Connector了,Connector在通过Socket的方式将结果返回给客户端

关于doFilter(过滤器)
过滤器的作用就是之一就是在用户的请求到达servlet之前,拦截下来做预处理,处理之后便执行doFilter这个方法,如果还有别的过滤器,那么将处理好的请求传给下个过滤器,依此类推,当所有的过滤器都把这个请求处理好了之后,再将处理完的请求发给servlet;如果就这一个过滤器,那么就将处理好的请求直接发给servlet。

今天躺了一上午半下午,晚上开始整理tomcat原理,这个是我在知乎上看到的大佬写的,
(后知后觉微信公众号:Java后端技术(ID:JavaITWork)https://zhuanlan.zhihu.com/p/35398064)
我自己添加的理解和一些注释,可能我这样整理更加适合新手看,图片也是有好多是我自己电脑截图,这个总结也算是自己对tomcat的更深层次的理解,我也理解了tomcat的原理,以为一个小时搞定,,,结果到了一点多,
大年初二,因为新型冠状肺炎,不敢出去逛,就继续学习吧,路过大佬看见有问题麻烦给点意见,谢谢!

武汉加油

tomcat原理简要分析,java相关推荐

  1. C打印函数printf的一种实现原理简要分析

    [0]README 0.1)本文旨在对 printf 的 某一种 实现 原理进行分析,做了解之用: 0.2) vsprintf 和 printf.c 的源码,参见 https://github.com ...

  2. java inverse_简要分析java中inverse和cascade有何区别

    在java开发的过程中,inverse和cascade的作用或许有些人比较清楚,而另外有的人感到陌生,究竟两者之间有没有关系?正如它们又都能影响对象关联关系的维护,所以将这两个属性的作用区分开也不是很 ...

  3. Java 代理模式的实现和原理详细分析

    文章目录 代理模式 静态代理 1. 静态代理的概念 2. 静态代理的实现 动态代理 1. 动态代理的概念 2. 动态代理的实现 2.1 如何创建一个动态代理对象 2.2 完整的动态代理的例子 3.动态 ...

  4. IDEA/Tomcat 原理:如何将 Tomcat 集成到 IDEA?实现由传统部署延伸到热部署 Java EE 项目?

    文章目录 前言 一.将 Tomcat 集成到 IDEA 中 1.1.进入 IDEA Tomcat 配置页面 1.2.配置并集成 Tomcat 1.3.配置完成说明 1.4.集成检查 1.4.1.检查主 ...

  5. 【java】log4j2核弹级漏洞原理和分析

    1.概述 转载:log4j2核弹级漏洞原理和分析 并且补充. 2.漏洞是怎么发现的? 3.漏洞问题重现 依赖如下 <dependencies><!-- https://mvnrepo ...

  6. [Java] HashMap 源码简要分析

    特性 * 允许null作为key/value. * 不保证按照插入的顺序输出.使用hash构造的映射一般来讲是无序的. * 非线程安全. * 内部原理与Hashtable类似. 源码简要分析 publ ...

  7. Java NIO原理 图文分析及代码实现

    最近在分析hadoop的RPC(Remote Procedure Call Protocol ,远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议.可以参考: ...

  8. 深入源码分析Java线程池的实现原理

    转载自   深入源码分析Java线程池的实现原理 程序的运行,其本质上,是对系统资源(CPU.内存.磁盘.网络等等)的使用.如何高效的使用这些资源是我们编程优化演进的一个方向.今天说的线程池就是一种对 ...

  9. Java NIO原理图文分析及代码实现

    2019独角兽企业重金招聘Python工程师标准>>> 前言:  最近在分析hadoop的RPC(Remote Procedure Call Protocol ,远程过程调用协议,它 ...

最新文章

  1. 通过Dockerfile构建Docker镜像
  2. Hadoop命令执行时提示JVM OOM问题的处理
  3. SDI高清视频光端机特点有哪些?
  4. js中split()和join()的用法
  5. web程序前后台功能实现_好程序员web前端教程之JS继承实现方式解析
  6. 面向开发者的机器学习(一)| 机器学习简介
  7. JAVA 创建学生类
  8. 初三学生什么时候上一对一效果最好?
  9. 【破损识别】基于matlab GUI机器视觉+SVM玉米种子破损识别(带面板)【含Matlab源码 1651期】
  10. STlink下载程序步骤
  11. 使用python实现猴子摘香蕉问题
  12. MongoDB Bulk write operation error on server duplicate key error问题解决
  13. github加速插件(google浏览器)
  14. 微信小程序保存相册授权全过程:第一次授权、已授权、拒绝后再授权
  15. JAVA——请输入打印一个倒99乘法口诀
  16. 【Linux学习笔记】管理Linux操作系统:软件安装
  17. c语言 判断互质,[经典算法] 找出某数以内与其互质的数
  18. oracle 甩手 java ee,谈判失败,Oracle 亲手把 Java EE 送上断头台
  19. qq登陆inc.php,JTBC(php) 版 QQ 一键登录实现过程
  20. eclips下第一个java程序 hello world!

热门文章

  1. JavaCV音视频开发宝典:UDP推流 使用UDP方式推送TS流 实现UDP一对一直播点播
  2. 流量运营分析ESOP
  3. AD18 导出装配图的一种方法
  4. 用Ventoy制作多系统启动盘(带你快速了解)
  5. linux系统vmd软件如何使用,VMD使用
  6. Matlab凸轮设计
  7. 执行wsdl2java 中文乱码的解决
  8. 01-软件项目立项报告
  9. 中国网建提供的SMS短信发送
  10. GIT 详细命令介绍