文章目录

  • Tomcat是什么?
  • Tomcat的缺省端口是多少,怎么修改
  • tomcat 有哪几种Connector 运行模式(优化)?
  • Tomcat有几种部署方式?
  • tomcat容器是如何创建servlet类实例?用到了什么原理?
  • Tomcat工作模式
  • Tomcat顶层架构
    • Tomcat顶层架构小结
  • Connector和Container的微妙关系
  • Container架构分析
    • Container如何处理请求的
  • 总结

Java面试总结汇总,整理了包括Java基础知识,集合容器,并发编程,JVM,常用开源框架Spring,MyBatis,数据库,中间件等,包含了作为一个Java工程师在面试中需要用到或者可能用到的绝大部分知识。欢迎大家阅读,本人见识有限,写的博客难免有错误或者疏忽的地方,还望各位大佬指点,在此表示感激不尽。文章持续更新中…

序号 内容 链接地址
1 Java基础知识面试题(2020最新版) https://thinkwon.blog.csdn.net/article/details/104390612
2 Java集合容器面试题(2020最新版) https://thinkwon.blog.csdn.net/article/details/104588551
3 Java异常面试题(2020最新版) https://thinkwon.blog.csdn.net/article/details/104390689
4 并发编程面试题(2020最新版) https://thinkwon.blog.csdn.net/article/details/104863992
5 JVM面试题(2020最新版) https://thinkwon.blog.csdn.net/article/details/104390752
6 Spring面试题(2020最新版) https://thinkwon.blog.csdn.net/article/details/104397516
7 Spring MVC面试题(2020最新版) https://thinkwon.blog.csdn.net/article/details/104397427
8 Spring Boot面试题(2020最新版) https://thinkwon.blog.csdn.net/article/details/104397299
9 Spring Cloud面试题(2020最新版) https://thinkwon.blog.csdn.net/article/details/104397367
10 MyBatis面试题(2020最新版) https://thinkwon.blog.csdn.net/article/details/101292950
11 Redis面试题(2020最新版) https://thinkwon.blog.csdn.net/article/details/103522351
12 MySQL数据库面试题(2020最新版) https://thinkwon.blog.csdn.net/article/details/104778621
13 消息中间件MQ与RabbitMQ面试题(2020最新版) https://thinkwon.blog.csdn.net/article/details/104588612
14 Dubbo面试题(2020最新版) https://thinkwon.blog.csdn.net/article/details/104390006
15 Linux面试题(2020最新版) https://thinkwon.blog.csdn.net/article/details/104588679
16 Tomcat面试题(2020最新版) https://thinkwon.blog.csdn.net/article/details/104397665
17 ZooKeeper面试题(2020最新版) https://thinkwon.blog.csdn.net/article/details/104397719
18 Netty面试题(2020最新版) https://thinkwon.blog.csdn.net/article/details/104391081
19 架构设计&分布式&数据结构与算法面试题(2020最新版) https://thinkwon.blog.csdn.net/article/details/105870730

Tomcat是什么?

Tomcat 服务器Apache软件基金会项目中的一个核心项目,是一个免费的开放源代码的Web 应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP 程序的首选。

Tomcat的缺省端口是多少,怎么修改

  1. 找到Tomcat目录下的conf文件夹
  2. 进入conf文件夹里面找到server.xml文件
  3. 打开server.xml文件
  4. 在server.xml文件里面找到下列信息
  5. 把Connector标签的8080端口改成你想要的端口
<Service name="Catalina">
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />

tomcat 有哪几种Connector 运行模式(优化)?

下面,我们先大致了解Tomcat Connector的三种运行模式。

​ 配制项:protocol=”HTTP/1.1”

  • NIO:同步非阻塞IO

    利用Java的异步IO处理,可以通过少量的线程处理大量的请求,可以复用同一个线程处理多个connection(多路复用)。

    Tomcat8在Linux系统中默认使用这种方式。

    Tomcat7必须修改Connector配置来启动。

    配制项:protocol=”org.apache.coyote.http11.Http11NioProtocol”

    备注:我们常用的Jetty,Mina,ZooKeeper等都是基于java nio实现.

  • APR:即Apache Portable Runtime,从操作系统层面解决io阻塞问题。**AIO方式,**异步非阻塞IO(Java NIO2又叫AIO) 主要与NIO的区别主要是操作系统的底层区别.可以做个比喻:比作快递,NIO就是网购后要自己到官网查下快递是否已经到了(可能是多次),然后自己去取快递;AIO就是快递员送货上门了(不用关注快递进度)。

    配制项:protocol=”org.apache.coyote.http11.Http11AprProtocol”

    备注:需在本地服务器安装APR库。Tomcat7或Tomcat8在Win7或以上的系统中启动默认使用这种方式。Linux如果安装了apr和native,Tomcat直接启动就支持apr。

Tomcat有几种部署方式?

在Tomcat中部署Web应用的方式主要有如下几种:

  1. 利用Tomcat的自动部署。

    把web应用拷贝到webapps目录。Tomcat在启动时会加载目录下的应用,并将编译后的结果放入work目录下。

  2. 使用Manager App控制台部署。

    在tomcat主页点击“Manager App” 进入应用管理控制台,可以指定一个web应用的路径或war文件。

  3. 修改conf/server.xml文件部署。

    修改conf/server.xml文件,增加Context节点可以部署应用。

  4. 增加自定义的Web部署文件。

    在conf/Catalina/localhost/ 路径下增加 xyz.xml文件,内容是Context节点,可以部署应用。

tomcat容器是如何创建servlet类实例?用到了什么原理?

  1. 当容器启动时,会读取在webapps目录下所有的web应用中的web.xml文件,然后对 xml文件进行解析,并读取servlet注册信息。然后,将每个应用中注册的servlet类都进行加载,并通过 反射的方式实例化。(有时候也是在第一次请求时实例化)
  2. 在servlet注册时加上1如果为正数,则在一开始就实例化,如果不写或为负数,则第一次请求实例化。

Tomcat工作模式

Tomcat作为servlet容器,有三种工作模式:

进入Tomcat的请求可以根据Tomcat的工作模式分为如下两类:

面试时问到Tomcat相关问题的几率并不高,正式因为如此,很多人忽略了对Tomcat相关技能的掌握,下面这一篇文章整理了Tomcat相关的系统架构,介绍了Server、Service、Connector、Container之间的关系,各个模块的功能,可以说把这几个掌握住了,Tomcat相关的面试题你就不会有任何问题了!另外,在面试的时候你还要有意识无意识的往Tomcat这个地方引,就比如说常见的Spring MVC的执行流程,一个URL的完整调用链路,这些相关的题目你是可以往Tomcat处理请求的这个过程去说的!掌握了Tomcat这些技能,面试官一定会佩服你的!

学了本章之后你应该明白的是:

Tomcat顶层架构

俗话说,站在巨人的肩膀上看世界,一般学习的时候也是先总览一下整体,然后逐个部分个个击破,最后形成思路,了解具体细节,Tomcat的结构很复杂,但是 Tomcat 非常的模块化,找到了 Tomcat 最核心的模块,问题才可以游刃而解,了解了 Tomcat 的整体架构对以后深入了解 Tomcat 来说至关重要!

先上一张Tomcat的顶层结构图(图A),如下:

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

Service主要包含两个部分:Connector和Container。从上图中可以看出 Tomcat 的心脏就是这两个组件,他们的作用如下:

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

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

另外,上述的包含关系或者说是父子关系,都可以在tomcat的conf目录下的server.xml配置文件中看出,下图是删除了注释内容之后的一个完整的server.xml配置文件(Tomcat版本为8.0)

详细的配置文件内容可以到Tomcat官网查看:Tomcat配置文件

上边的配置文件,还可以通过下边的一张结构图更清楚的理解:

Server标签设置的端口号为8005,shutdown=”SHUTDOWN” ,表示在8005端口监听“SHUTDOWN”命令,如果接收到了就会关闭Tomcat。一个Server有一个Service,当然还可以进行配置,一个Service有多个Connector,Service左边的内容都属于Container的,Service下边是Connector。

Tomcat顶层架构小结

  1. Tomcat中只有一个Server,一个Server可以有多个Service,一个Service可以有多个Connector和一个Container;

  2. Server掌管着整个Tomcat的生死大权;

  3. Service 是对外提供服务的;

  4. Connector用于接受请求并将请求封装成Request和Response来具体处理;

  5. Container用于封装和管理Servlet,以及具体处理request请求;

知道了整个Tomcat顶层的分层架构和各个组件之间的关系以及作用,对于绝大多数的开发人员来说Server和Service对我们来说确实很远,而我们开发中绝大部分进行配置的内容是属于Connector和Container的,所以接下来介绍一下Connector和Container。

Connector和Container的微妙关系

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

Connector最底层使用的是Socket来进行连接的,Request和Response是按照HTTP协议来封装的,所以Connector同时需要实现TCP/IP协议和HTTP协议!

Tomcat既然需要处理请求,那么肯定需要先接收到这个请求,接收请求这个东西我们首先就需要看一下Connector!

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进行处理。

至此,我们应该很轻松的回答1,2,3的问题了,但是4还是不知道,那么我们就来看一下Container是如何进行处理的以及处理完之后是如何将处理完的结果返回给Connector的?

Container架构分析

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

4个子容器的作用分别是:

  1. Engine:引擎,用来管理多个站点,一个Service最多只能有一个Engine;

  2. Host:代表一个站点,也可以叫虚拟主机,通过配置Host就可以添加站点;

  3. Context:代表一个应用程序,对应着平时开发的一套程序,或者一个WEB-INF目录以及下面的web.xml文件;

  4. Wrapper:每一Wrapper封装着一个Servlet;

下面找一个Tomcat的文件目录对照一下,如下图所示:

Context和Host的区别是Context表示一个应用,我们的Tomcat中默认的配置下webapps下的每一个文件夹目录都是一个Context,其中ROOT目录中存放着主应用,其他目录存放着子应用,而整个webapps就是一个Host站点。

我们访问应用Context的时候,如果是ROOT下的则直接使用域名就可以访问,例如:www.baidu.com,如果是Host(webapps)下的其他应用,则可以使用www.baidu.com/docs进行访问,当然默认指定的根应用(ROOT)是可以进行设定的,只不过Host站点下默认的主应用是ROOT目录下的。

看到这里我们知道Container是什么,但是还是不知道Container是如何进行请求处理的以及处理完之后是如何将处理完的结果返回给Connector的?别急!下边就开始探讨一下Container是如何进行处理的!

Container如何处理请求的

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

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

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

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

  • 在上层容器的管道的BaseValve中会调用下层容器的管道。

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

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

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

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

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

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

总结

至此,我们已经对Tomcat的整体架构有了大致的了解,从图A、B、C、D可以看出来每一个组件的基本要素和作用。我们在脑海里应该有一个大概的轮廓了!如果你面试的时候,让你简单的聊一下Tomcat,上面的内容你能脱口而出吗?当你能够脱口而出的时候,面试官一定会对你刮目相看的!

Tomcat面试题(2020最新版)相关推荐

  1. Java并发编程面试题(2020最新版)

    转载自  Java并发编程面试题(2020最新版) 基础知识 并发编程的优缺点 为什么要使用并发编程(并发编程的优点) 充分利用多核CPU的计算能力:通过并发编程的形式可以将多核CPU的计算能力发挥到 ...

  2. Spring Boot面试题(2020最新版)

    转载自  Spring Boot面试题(2020最新版) 概述 什么是 Spring Boot? Spring Boot 是 Spring 开源组织下的子项目,是 Spring 组件一站式解决方案,主 ...

  3. [转]Linux面试题(2020最新版)

    文章目录 Linux 概述 什么是Linux Unix和Linux有什么区别? 什么是 Linux 内核? Linux的基本组件是什么? Linux 的体系结构 BASH和DOS之间的基本区别是什么? ...

  4. Linux面试题(2020最新版)

    文章目录 Linux 概述 什么是Linux Unix和Linux有什么区别? 什么是 Linux 内核? Linux的基本组件是什么? Linux 的体系结构 BASH和DOS之间的基本区别是什么? ...

  5. Java异常面试题(2020最新版)

    文章目录 Java异常架构与异常关键字 Java异常简介 Java异常架构 1. Throwable 2. Error(错误) 3. Exception(异常) 运行时异常 编译时异常 4. 受检异常 ...

  6. Spring Cloud面试题(2020最新版)

    转载自  Spring Cloud面试题(2020最新版) 为什么需要学习Spring Cloud 不论是商业应用还是用户应用,在业务初期都很简单,我们通常会把它实现为单体结构的应用.但是,随着业务逐 ...

  7. 史上最全Redis面试题(2020最新版)

    导读:2020 年最新版 68 道Redis面试题,两万字干货,整理分享至此,希望对大家有帮助!文末有PDF文档下载方式,可按需下载. 概述 1. 什么是Redis? Redis(Remote Dic ...

  8. [转载] Java基础知识面试题(2020最新版)

    参考链接: Java中的异常类型与示例 文章目录 Java概述何为编程什么是Javajdk1.5之后的三大版本JVM.JRE和JDK的关系什么是跨平台性?原理是什么Java语言有哪些特点什么是字节码? ...

  9. 【金三银四】Tomcat面试题(2021最新版)

    目录 前言 1.Tomcat的缺省端口是多少,怎么修改? 2.tomcat 有哪几种Connector 运行模式(优化)? 3.Tomcat有几种部署方式? 4.tomcat容器是如何创建servle ...

最新文章

  1. typescript 叹号_TypeScript系列(五)最佳实践
  2. 全景照片不怕歪!Facebook 用神经网络矫正扭曲的地平线
  3. 下一次大跃进?将机器人与物联网相结合
  4. 【Android 逆向】函数拦截 ( 修改内存页属性 | x86 架构插桩拦截 )
  5. 哈,你猜一个 TCP 连接上面能发多少个 HTTP 请求?
  6. selenium编写脚本_Selenium脚本编写技巧和窍门
  7. Spring JDBC数据库连接池设置
  8. nginx php环境搭建_php+nginx环境配置
  9. 用hibernate类实现数据库的基本操作
  10. sqlhelper 下载 使用指南 代码 [收藏]
  11. Java并发编程(三)什么是线程池
  12. js随机获取数组中的值
  13. angular自带的一些api_在Angular软件中执行API请求的正确方式,了解一下
  14. 文本区域css,如何知道文本从一个CSS区域溢出到另一个区域?
  15. VARCHART XGantt 甘特图中的数据表介绍
  16. 如何批量提取多个 PDF 文档中的图片
  17. SpringMVC整合百度富文本编辑器
  18. Android物联网(一)—— 蓝牙通讯
  19. 用Python玩转二维码
  20. 视频剪辑技巧,给每个视频添加不同背景图

热门文章

  1. 蓝桥杯国信长天单片机--程序下载(三)
  2. 游戏研发流程与构成要素
  3. python 接口自动化测试-----常见面试题汇总
  4. 【木马查杀】记第一次遇到黑客入侵主机
  5. 【selenium】对键盘的的操作(控制键盘的输入,以及键盘组合操作比如复制粘贴) ;对鼠标的操作(单击,双击,右击,拖拽)
  6. php 冒泡排序详解非常详细
  7. 李宏毅机器学习2016 第二十一讲 隐马尔可夫模型和条件随机场
  8. LeetCode174——地下城游戏
  9. iOS进阶_下载管理器(封装下载用工具类)
  10. RMAN异机恢复步骤