精华内容
下载资源
问答
  • 版权声明:本文为CSDN博主「ThinkWon」...Tomcat的缺省端口是多少,怎么修改tomcat 有哪几种Connector 运行模式(优化)?Tomcat有几种部署方式?tomcat容器是如何创建servlet类实例?用到了什么原理?Tomcat工作模式Tomc

    版权声明:本文为CSDN博主「ThinkWon」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    原文链接:https://blog.csdn.net/ThinkWon/article/details/104397665

    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" />
    
     
    • 1
    • 2
    • 3
    • 4

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

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

    • BIO:同步并阻塞 一个线程处理一个请求。缺点:并发量高时,线程数较多,浪费资源。Tomcat7或以下,在Linux系统中默认使用这种方式。

    配制项: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容器,有三种工作模式:

    • 1、独立的servlet容器,servlet容器是web服务器的一部分;
    • 2、进程内的servlet容器,servlet容器是作为web服务器的插件和java容器的实现,web服务器插件在内部地址空间打开一个jvm使得java容器在内部得以运行。反应速度快但伸缩性不足;
    • 3、进程外的servlet容器,servlet容器运行于web服务器之外的地址空间,并作为web服务器的插件和java容器实现的结合。反应时间不如进程内但伸缩性和稳定性比进程内优;

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

    • Tomcat作为应用程序服务器:请求来自于前端的web服务器,这可能是Apache, IIS, Nginx等;
    • Tomcat作为独立服务器:请求来自于web浏览器;

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

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

    • Server、Service、Connector、Container四大组件之间的关系和联系,以及他们的主要功能点;
    • Tomcat执行的整体架构,请求是如何被一步步处理的;
    • Engine、Host、Context、Wrapper相关的概念关系;
    • Container是如何处理请求的;
    • Tomcat用到的相关设计模式;

    Tomcat顶层架构

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

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

    在这里插入图片描述

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

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

    • Connector用于处理连接相关的事情,并提供Socket与Request请求和Response响应相关的转化;
    • Container用于封装和管理Servlet,以及具体处理Request请求;

    一个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-12-19 10:20:04
    Tomcat是什么? Tomcat的缺省端口是多少,怎么修改 Tomcat 有哪几种Connector 运行模式(优化)? Tomcat有几种部署方式? tomcat容器是如何创建servlet类实例?用到了什么原理? Tomcat工作模式 进入Tomcat的...

    目录

    Tomcat是什么?

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

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

    Tomcat有几种部署方式?

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

    Tomcat工作模式

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

    Tomcat顶层架构

    Connector和Container的微妙关系

    Connector架构分析

     Container架构分析

    Container如何处理请求的


    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 运行模式(优化)?

    BIO:同步并阻塞

    • 一个线程处理一个请求。
    • 缺点:并发量高时,线程数较多,浪费资源。
    • Tomcat7或以下,在Linux系统中默认使用这种方式。

    NIO:同步非阻塞IO

    •  利用Java的异步IO处理,可以通过少量的线程处理大量的请求,可以复用同一个线程处理多个connection(多路复用)。
    • Tomcat8在Linux系统中默认使用这种方式。
    • Tomcat7必须修改Connector配置来启动。:配制项:protocol=”org.apache.coyote.http11.Http11NioProtocol”

    Tomcat有几种部署方式?

    (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工作模式

    (1) 独立的Servlet容器, servlet容器是web服务器的一部分

     (2)进程内的servlet容器, servlet容器是作为web服务器的插件java容器的实现,web服务器插件在内部地址空间打开一个jvm使得java容器在内部得以运行。反应速度快但伸缩性不足

    (3) 进程外的servlet容器,servlet容器运行于web服务器之外的地址空间,并作为web服务器的插件和java容器实现的结合。反应时间不如进程内但伸缩性和稳定性比进程内优;

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

    • Tomcat作为应用程序服务器:请求来自前端的web服务器,这可能是Apace, IIS, Nginx等等
    • Tomcat作为独立服务器: 请求来自web浏览器

    Tomcat顶层架构

     

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

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

    • Service 是对外提供服务的;

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

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

    Connector和Container的微妙关系

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

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

    Connector架构分析

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

    可以把Connector分为四个方面进行理解:

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

     Container架构分析

    Container用于封装和管理Servlet,以及具体处理Request请求,在Container内部包含了4个子容器

    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处理请求是使用Pipeline-Valve管道来处理的!(Valve是阀门之意)

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

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

    • 每个Pipeline都有特定的Valve,而且是在管道的最后一个执行,这个Valve叫做BaseValve,BaseValve是不可删除的;
    • 在上层容器的管道的BaseValve中会调用下层容器的管道。

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

    Pipeline的处理流程图如下

    • 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的方式将结果返回给客户端。

     

    展开全文
  • 即将进入金三银四的黄金时段,所以很多人已经开始准备自己的面试抱佛脚了。今天我整理了6道关于tomcat的核心面试题以及参看答案,看完对于绝大多数人应对面试妥妥的。1、Tomcat的缺省端口...

    即将进入金三银四的黄金时段,所以很多人已经开始准备自己的面试抱佛脚了。今天我整理了6道关于tomcat的核心面试题以及参看答案,看完对于绝大多数人应对面试妥妥的。


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


    默认端口为8080,可以通过在tomcat安装包conf目录下,service.xml中的Connector元素的port属性来修改端口。


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

    这三种模式的不同之处如下:

    BIO:一个线程处理一个请求。缺点:并发量高时,线程数较多,浪费资源。Tomcat7版本或更低版本中,在Linux系统中默认使用这种方式。

    NIO:利用Java的异步IO处理,可以通过少量的线程处理大量的请求。tomcat8.0.x中默认使用的是NIO。Tomcat7必须修改Connector配置来启动:

    <Connector port="8080" protocol="org.apache.coyote.http11.Http11NioProtocol"          connectionTimeout="20000" redirectPort="8443"/> 
    
    
    

    APR:即Apache Portable Runtime,从操作系统层面解决io阻塞问题。Tomcat7或Tomcat8在Win7或以上的系统中启动默认使用这种方式。


    3、Tomcat有几种部署方式?


    • 利用Tomcat的自动部署:把web应用拷贝到webapps目录(生产环境不建议放在该目录中)。Tomcat在启动时会加载目录下的应用,并将编译后的结果放入work目录下。

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

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

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


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


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

    2. 在servlet注册时加上1如果为正数,则在一开始就实例化,如果不写或为负数,则第一次请求实例化。


    5、tomcat 如何优化?


    tomcat作为Web服务器,它的处理性能直接关系到用户体验,下面是几种常见的优化措施:

    掉对web.xml的监视,把jsp提前编辑成Servlet。有富余物理内存的情况,加大tomcat使用的jvm的内存

    服务器所能提供CPU、内存、硬盘的性能对处理能力有决定性影响。

    • 对于高并发情况下会有大量的运算,那么CPU的速度会直接影响到处理速度。

    • 内存在大量数据处理的情况下,将会有较大的内存容量需求,可以用-Xmx -Xms -XX:MaxPermSize等参数对内存不同功能块进行划分。我们之前就遇到过内存分配不足,导致虚拟机一直处于full GC,从而导致处理能力严重下降。

    • 硬盘主要问题就是读写性能,当大量文件进行读写时,磁盘极容易成为性能瓶颈。最好的办法还是利用下面提到的缓存。

    利用缓存和压缩

    • 对于静态页面最好是能够缓存起来,这样就不必每次从磁盘上读。这里我们采用了Nginx作为缓存服务器,将图片、css、js文件都进行了缓存,有效的减少了后端tomcat的访问。

    • 另外,为了能加快网络传输速度,开启gzip压缩也是必不可少的。但考虑到tomcat已经需要处理很多东西了,所以把这个压缩的工作就交给前端的Nginx来完成。

    • 除了文本可以用gzip压缩,其实很多图片也可以用图像处理工具预先进行压缩,找到一个平衡点可以让画质损失很小而文件可以减小很多。曾经我就见过一个图片从300多kb压缩到几十kb,自己几乎看不出来区别。

    采用集群

    单个服务器性能总是有限的,最好的办法自然是实现横向扩展,那么组建tomcat集群是有效提升性能的手段。我们还是采用了Nginx来作为请求分流的服务器,后端多个tomcat共享session来协同工作。可以参考之前写的《利用nginx+tomcat+memcached组建web服务器负载均衡》。

    优化线程数优化

    找到Connector port="8080" protocol="HTTP/1.1",增加maxThreads和acceptCount属性(使acceptCount大于等于maxThreads),如下:

    <Connector port="8080" protocol="HTTP/1.1"connectionTimeout="20000" redirectPort="8443"acceptCount="500" maxThreads="400" />
    
    
    

    其中:

    • maxThreads:tomcat可用于请求处理的最大线程数,默认是200
    • minSpareThreads:tomcat初始线程数,即最小空闲线程数
    • maxSpareThreads:tomcat最大空闲线程数,超过的会被关闭
    • acceptCount:当所有可以使用的处理请求的线程数都被使用时
    
    

    使用线程池优化

    在server.xml中增加executor节点,然后配置connector的executor属性,如下:

    <Executor name="tomcatThreadPool" namePrefix="req-exec-"maxThreads="1000" minSpareThreads="50"maxIdleTime="60000"/>
    <Connector port="8080" protocol="HTTP/1.1"executor="tomcatThreadPool"/>
    
    
    

    其中:

    • namePrefix:线程池中线程的命名前缀
    • maxThreads:线程池的最大线程数
    • minSpareThreads:线程池的最小空闲线程数
    • maxIdleTime:超过最小空闲线程数时,多的线程会等待这个时间长度,然后关闭
    • threadPriority:线程优先级
    
    
    

    注:当tomcat并发用户量大的时候,单个jvm进程确实可能打开过多的文件句柄,这时会报java.net.SocketException:Too many open files错误。可使用下面步骤检查:

    • ps -ef |grep tomcat 查看tomcat的进程ID,记录ID号,假设进程ID为10001
    • lsof -p 10001|wc -l 查看当前进程id为10001的 文件操作数
    • 使用命令:ulimit -a 查看每个用户允许打开的最大文件数
    
    
    

    启动速度优化

    • 删除没用的web应用:因为tomcat启动每次都会部署这些应用。

    • 关闭WebSocket:websocket-api.jar和tomcat-websocket.jar。

    • 随机数优化:设置JVM参数:-Djava.security.egd=file:/dev/./urandom。

    内存优化

    因为tomcat启动起来后就是一个java进程,所以这块可以参照JVM部分的优化思路。堆内存相关参数,比如说:

    • -Xms:虚拟机初始化时的最小堆内存。

    • -Xmx:虚拟机可使用的最大堆内存。-Xms与-Xmx设成一样的值,避免JVM因为频繁的GC导致性能大起大落

    • -XX:MaxNewSize:新生代占整个堆内存的最大值。

    另外还有方法区参数调整(注意:JDK版本)、垃圾收集器等优化。JVM相关参数请看:手把手教你设置JVM调优参数


    6、熟悉tomcat的哪些配置?


    Context(表示一个web应用程序,通常为WAR文件,关于WAR的具体信息见servlet规范)标签。

    docBase:该web应用的文档基准目录(Document Base,也称为Context Root),或者是WAR文件的路径。可以使绝对路径,也可以使用相对于context所属的Host的appBase路径。

    path:表示此web应用程序的url的前缀,这样请求的url为http://localhost:8080/path/****。

    reloadable:这个属性非常重要,如果为true,则tomcat会自动检测应用程序的/WEB-INF/lib和/WEB-INF/classes目录的变化,自动装载新的应用程序,我们可以在不重启tomcat的情况下改变应用程序。

    useNaming:如果希望Catalina为该web应用使能一个JNDI InitialContext对象,设为true。该InitialialContext符合J2EE平台的约定,缺省值为true。

    workDir:Context提供的临时目录的路径,用于servlet的临时读/写。利用javax.servlet.context.tempdir属性,servlet可以访问该目录。如果没有指定,使用$CATALINA_HOME/work下一个合适的目录。

    swallowOutput:如果该值为true,System.out和System.err的输出被重定向到web应用的logger。如果没有指定,缺省值为false

    debug:与这个Engine关联的Logger记录的调试信息的详细程度。数字越大,输出越详细。如果没有指定,缺省为0。

    host(表示一个虚拟主机)标签。

    name:指定主机名。

    appBase:应用程序基本目录,即存放应用程序的目录。

    unpackWARs:如果为true,则tomcat会自动将WAR文件解压,否则不解压,直接从WAR文件中运行应用程序。

    Logger(表示日志,调试和错误信息)标签。

    className:指定logger使用的类名,此类必须实现org.apache.catalina.Logger接口。

    prefix:指定log文件的前缀。

    suffix:指定log文件的后缀。

    timestamp:如果为true,则log文件名中要加入时间,如下例:localhost_log.2001-10-04.txt。

    总结

    本文一共六道关于tomcat的题目:

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

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

    • Tomcat有几种部署方式?

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

    • tomcat 如何优化?熟悉tomcat的哪些配置?

    再次回头想想你会几道呢?

    「做人可以没天赋,但不能没斗志。」


    回复干货】获取精选干货视频教程

    回复加群】加入疑难问题攻坚交流群

    回复mat】获取内存溢出问题分析详细文档教程

    回复赚钱】获取用java写一个能赚钱的微信机器人

    回复副业】获取程序员副业攻略一份

    都收藏了,就点个「在看」支持一下吧!

    点下在看,你最好看

    展开全文
  • Tomcat 面试题

    2021-11-09 15:59:50
    一、Tomcat的缺省端口修改 1、打开Tomcat配置文件server.xml(路径:Tomcat-conf-server.xml) 2、在server.xml文件里面找到下列信息  <Connector connectionTimeout="20000" port="8080" protocol=...

    一、Tomcat的缺省端口修改

    1、打开Tomcat配置文件server.xml(路径:Tomcat-conf-server.xml)
    2、在server.xml文件里面找到下列信息

     <Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443" uriEncoding="utf-8"/>
    
    • port=“8080” :端口号

    二、tomcat Connector 运行模式(优化)

    1、BIO:同步且阻塞IO。

    传统的Java I/O操作,一个线程处理一个请求,并发量高时,线程数较多,浪费资源
    BIO更适合处理简单流程,如程序处理较快可以立即返回结果,Tomcat在默认情况下,是以BIO模式运行

     <Executor name="tomcatThreadPool" namePrefix="catalina-exec-" maxThreads="150"  minSpareThreads="4"/>
    
    • maxThreads:Tomcat使用线程来处理接收的每个请求。这个值表示Tomcat可创建的最大的线程数。默认值200。可以根据机器的时期性能和内存大小调整,一般可以在400-500。最大可以在800左右。
    • minSpareThreads:Tomcat初始化时创建的线程数。默认值4。如果当前没有空闲线程,且没有超过maxThreads,一次性创建的空闲线程数量。Tomcat初始化时创建的线程数量也由此值设置。
    • maxSpareThreads:一旦创建的线程超过这个值,Tomcat就会关闭不再需要的socket线程。默认值50。一旦创建的线程超过此数值,Tomcat会关闭不再需要的线程。线程数可以大致上用 “同时在线人数每秒用户操作次数系统平均操作时间” 来计算。
    • acceptCount:指定当所有可以使用的处理请求的线程数都被使用时,可以放到处理队列中的请求数,超过这个数的请求将不予处理。默认值10。如果当前可用线程数为0,则将请求放入处理队列中。这个值限定了请求队列的大小,超过这个数值的请求将不予处理。
    • connectionTimeout:网络连接超时,默认值20000,单位:毫秒。设置为0表示永不超时,这样设置有隐患的。通常可设置为30000毫秒。

    2、NIO:同步非阻塞IO

    利用Java的异步IO处理,基于缓存区,可以通过少量的线程处理大量的请求,比传统I/O操作(bio)更好的并发运行性能

    //NIO  
    protocol="org.apache.coyote.http11.Http11NioProtocol"  
    //NIO2  
    protocol="org.apache.coyote.http11.Http11Nio2Protocol" 
    
    • protocol=“org.apache.coyote.http11.Http11NioProtocol” 指定使用NIO模型来接受HTTP请求。默认是BlockingIO,配置为protocol=“HTTP/1.1”
    • acceptorThreadCount=“2” 使用NIO模型时接收线程的数目

    3、APR:Apache Portable Runtime

    Tomcat将以JNI的形式调用Apache HTTP服务器的核心动态链接库来处理文件读取或网络传输操作,从而大大地提高Tomcat对静态文件的处理性能,从操作系统层面解决io阻塞问题。

    protocol="org.apache.coyote.http11.Http11AprProtocol"  
    

    4、总结

    Connector 参数对比
     并不是说 BIO的性能就一定不如 NIO,这几种类型 Connector之间并没有明显的性能区别,它们之间实现流程和原理不同,所以它们的选择是需要根据应用的类型来决定的。
     BIO更适合处理简单流程,如程序处理较快可以立即返回结果。简单项目及应用可以采用BIO。
     NIO更适合后台需要耗时完成请求的操作,如程序接到了请求后需要比较耗时的处理这已请求,所以无法立即返回结果,这样如果采用BIO就会占用一个连接,而使用NIO后就可以将此连接转让给其他请求,直至程序处理完成返回为止。
     APR可以大大提升Tomcat对静态文件的处理性能,同时如果你使用了HTTPS方式传输的话,也可以提升SSL的处理性能。

    三、Tomcat 部署方式

    1、直接将 web 项目文件(一般是复制生成的war包)复制到tomcat的webapps目录中

    2、在Tomcat/conf/Catalina/localhost 路径下新建 xml文件,文件名为站点名字

    如:http://localhost:8080/jstore,jstore.xml 文件内容配置如下:

    <Context docBase="C:\workSpace\project" path="/jstore" reloadable="true"/>
    
    • Reloadable= “true” 指tomcat在运行状态下会自动检测应用程序的WEB-INF/classes和WEB-INF/lib目录下的class文件,如果监测到有class文件有改动,服务器自动加载新的web应用程序,可以在不重起tomcat的情况下改变应用程序,也就是热部署;一般我们会在开发阶段将Reloadable属性设为true,有助于调试servlet和其它的class文件,但是由于这样会增加服务器的运行负荷,损耗系统性能,在项目运行阶段建议将它设为false。

    3、修改 Tomcat/conf/server.xml文件,在节点中添加一个context,具体为:

    <Context Path="/jstore"Docbase="C:\workSpace\project" Debug="0" Privileged="True" Reloadable="True"></Context>
    

    四、tomcat 容器创建servlet类实例及原理

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

    五、tomcat 优化

    1、内存优化

    默认情况下Tomcat的相关内存配置较低,需要重新配置Tomcat的相关内存
    1.1 修改内存等 JVM相关配置

    • Linux下修改TOMCAT_HOME/bin/catalina.sh,在其中加入,可以放在CLASSPATH=下面:
      JAVA_OPTS="-server -XX:PermSize=512M -XX:MaxPermSize=1024m -Xms2048m -Xmx2048m"
    • Windows下修改TOMCAT_HOME/bin/catalina.bat,在其中加入,可以放在set CLASSPATH=下面:
      set JAVA_OPTS=-server -XX:PermSize=512M -XX:MaxPermSize=1024m -Xms2048m -Xmx2048m
    • 参数说明
      • -server:启用 JDK的 server 版本;
      • -Xms:Java虚拟机初始化时堆的最小内存,一般与 Xmx配置为相同值,这样的好处是GC不必再为扩展内存空间而消耗性能;
      • -Xmx:Java虚拟机可使用堆的最大内存;
      • -XX:PermSize:Java虚拟机永久代大小;
      • -XX:MaxPermSize:Java虚拟机永久代大小最大值;

    1.2 验证

    • jps:用来显示本地的java进程,以及进程号,进程启动的路径等。
    • jmap(jmap -heap 端口号):观察运行中的JVM 物理内存的占用情况,包括Heap size , Perm size 下载地址等。

    2、配置优化

    2.1 Connector 优化

    Connector是连接器,负责接收客户的请求,以及向客户端回送响应的消息。所以 Connector的优化是重要部分。默认情况下 Tomcat只支持200线程访问,超过这个数量的连接将被等待甚至超时放弃,所以我们需要提高这方面的处理能力

    <Connector port="8080"          <!-- Tomcat监听端口 -->
              protocol="HTTP/1.1"   <!-- protocol 协议类型,可选类型有四种,分别为BIO(阻塞型IO),NIO,NIO2和APR -->
              maxThreads="1000"     <!-- 由该连接器创建的处理请求线程的最大数目-->
              minSpareThreads="100" <!-- 线程的最小运行数目 -->
              acceptCount="1000"    <!-- acceptCount允许的最大连接数,应大于等于maxProcessors-->
              maxConnections="1000" <!-- 在任何给定的时间内,服务器将接受和处理的最大连接数 -->
              connectionTimeout="20000"   <!-- 当请求已经被接受,但未被处理,也就是等待中的超时时间 -->
              maxHttpHeaderSize="8192"    <!-- 请求和响应的HTTP头的最大大小,以字节为单位指定 -->
              tcpNoDelay="true"  <!-- 如果为true,服务器socket会设置TCP_NO_DELAY选项,在大多数情况下可以提高性能 -->
              compression="on"   <!-- 是否启用gzip压缩,默认为关闭状态 -->
              compressionMinSize="2048"    <!-- compression="on"时启用此项。被压缩前数据的最小值,也就是超过这个值后才被压缩 -->
              disableUploadTimeout="true"  <!-- 这个标志允许servlet Container在一个servlet执行的时候,使用一个不同的,更长的连接超时 -->
              redirectPort="8443"  
          	 enableLookups="false"  <!-- 关闭DNS反向查询-->
              URIEncoding="UTF-8" />  <!-- URL编码字符集 -->
    

    更多参见:Tomcat官方网站

    2.2 连接池

    Executor 代表了一个线程池,可以在Tomcat组件之间共享。使用线程池的好处在于减少了创建销毁线程的相关消耗,而且可以提高线程的使用效率

    <Service name="Catalina">  
      <Executor name="tomcatThreadPool"       	<!-- 线程池名称,用于 Connector中指定 -->
             namePrefix="catalina-exec-"      	<!-- 所创建的每个线程的名称前缀,单独的线程名称为 namePrefix+threadNumber -->
             maxThreads="1000"   				<!-- 池中最大线程数 -->
             minSpareThreads="100"  			<!-- 活跃线程数,也就是核心池线程数,这些线程不会被销毁,会一直存在 -->
             maxIdleTime="60000"  				<!-- 线程空闲时间,超过该时间后,空闲线程会被销毁 -->
             maxQueueSize="Integer.MAX_VALUE"  	<!-- 在被执行前最大线程排队数目,默认为Int的最大值,也就是广义的无限 -->
             prestartminSpareThreads="false"  	<!-- 启动线程池时是否启动 minSpareThreads部分线程 -->
             threadPriority="5"  				<!-- 线程池中线程优先级,默认值为5,值从1到10 -->
             className="org.apache.catalina.core.StandardThreadExecutor"/>  <!-- 线程池实现类,未指定情况下,默认实现类为org.apache.catalina.core.StandardThreadExecutor。如果想使用自定义线程池首先需要实现 org.apache.catalina.Executor接口 -->
      .... 
    
    2.3 Listener

    另一个影响Tomcat 性能的因素是内存泄露。Server标签中可以配置多个Listener,其中 JreMemoryLeakPreventionListener是用来预防JRE内存泄漏。此Listener只需在Server标签中配置即可,默认情况下无需配置,已经添加在 Server中

    <Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" />  
    

    3、组件优化

    3.1 APR (Apache Portable Runtime)

    APR(Apache Portable Runtime)是一个高可移植库,它是Apache HTTP Server 2.x的核心。APR有很多用途,包括访问高级 IO功能(例如sendfile,epoll和OpenSSL),OS级别功能(随机数生成,系统状态等等),本地进程管理(共享内存,NT管道和UNIX sockets)。这些功能可以使Tomcat作为一个通常的前台WEB服务器,能更好地和其它本地web技术集成,总体上让Java更有效率作为一个高性能web服务器平台而不是简单作为后台容器。
    APR的目的如其名称一样,主要为上层的应用程序提供一个可以跨越多操作系统平台使用的底层支持接口库。在早期的Apache版本中,应用程序本身必须能够处理各种具体操作系统平台的细节,并针对不同的平台调用不同的处理函数。随着Apache的进一步开发,Apache组织决定将这些通用的函数独立出来并发展成为一个新的项目。这样,APR的开发就从Apache中独立出来,Apache仅仅是使用APR而已。目前APR主要还是由Apache使用,不过由于APR的较好的移植性,因此一些需要进行移植的C程序也开始使用APR。
    APR使得平台细节的处理进行下移。对于应用程序而言,它们根本就不需要考虑具体的平台,不管是Unix、Linux还是Window,应用程序执行的接口基本都是统一一致的。因此对于APR而言,可移植性和统一的上层接口是其考虑的一个重点。而APR最早的目的并不是如此,它最早只是希望将Apache中用到的所有代码合并为一个通用的代码库,然而这不是一个正确的策略,因此后来APR改变了其目标。有的时候使用公共代码并不是一件好事,比如如何将一个请求映射到线程或者进程是平台相关的,因此仅仅一个公共的代码库并不能完成这种区分。APR的目标则是希望安全合并所有的能够合并的代码而不需要牺牲性能。

    3.2 Tomcat Native

    Tomcat Native是 Tomcat可选组件,它可以让 Tomcat使用 Apache 的 APR包来处理包括文件和网络IO操作,从而提升性能及兼容性。

    六、垃圾回收策略调优

    垃圾回收的设置也是在catalina.sh中,调整JAVA_OPTS变量。 
    具体设置如下: 
    JAVA_OPTS="$JAVA_OPTS -Xmx3550m -Xms3550m -Xss128k -XX:+UseParallelGC  -XX:MaxGCPauseMillis=100" 
    具体的垃圾回收策略及相应策略的各项参数如下: 
    串行收集器(JDK1.5以前主要的回收方式) 
    -XX:+UseSerialGC:设置串行收集器 
    并行收集器(吞吐量优先) 
    示例: 
    java -Xmx3550m -Xms3550m -Xmn2g -Xss128k -XX:+UseParallelGC  -XX:MaxGCPauseMillis=100 
    
    -XX:+UseParallelGC:选择垃圾收集器为并行收集器。此配置仅对年轻代有效。即上述配置下,年轻代使用并发收集,而年老代仍旧使用串行收集。 
    -XX:ParallelGCThreads=20:配置并行收集器的线程数,即:同时多少个线程一起进行垃圾回收。此值最好配置与处理器数目相等。 
    -XX:+UseParallelOldGC:配置年老代垃圾收集方式为并行收集。JDK6.0支持对年老代并行收集 
    -XX:MaxGCPauseMillis=100:设置每次年轻代垃圾回收的最长时间,如果无法满足此时间,JVM会自动调整年轻代大小,以满足此值。 
    -XX:+UseAdaptiveSizePolicy:设置此选项后,并行收集器会自动选择年轻代区大小和相应的Survivor区比例,以达到目标系统规定的最低相应时间或者收集频率等,此值建议使用并行收集器时,一直打开。 
    并发收集器(响应时间优先) 
    示例:java -Xmx3550m -Xms3550m -Xmn2g -Xss128k -XX:+UseConcMarkSweepGC 
    -XX:+UseConcMarkSweepGC:设置年老代为并发收集。测试中配置这个以后,-XX:NewRatio=4的配置失效了,原因不明。所以,此时年轻代大小最好用-Xmn设置。 
    -XX:+UseParNewGC: 设置年轻代为并行收集。可与CMS收集同时使用。JDK5.0以上,JVM会根据系统配置自行设置,所以无需再设置此值。 
    -XX:CMSFullGCsBeforeCompaction:由于并发收集器不对内存空间进行压缩、整理,所以运行一段时间以后会产生“碎片”,使得运行效率降低。此值设置运行多少次GC以后对内存空间进行压缩、整理。 
    -XX:+UseCMSCompactAtFullCollection:打开对年老代的压缩。可能会影响性能,但是可以消除碎片 
    

    七、打印类的加载情况及对象的回收情况

    这个可以通过配置JVM的启动参数,打印这些信息(到屏幕(默认也会到catalina.log中)或者文件),具体参数如下: 
    -XX:+PrintGC:输出形式:[GC 118250K->113543K(130112K), 0.0094143 secs] [Full GC 121376K->10414K(130112K), 0.0650971 secs] 
    -XX:+PrintGCDetails:输出形式:[GC [DefNew: 8614K->781K(9088K), 0.0123035 secs] 118250K->113543K(130112K), 0.0124633 secs] [GC [DefNew: 8614K->8614K(9088K), 0.0000665 secs][Tenured: 112761K->10414K(121024K), 0.0433488 secs] 121376K->10414K(130112K), 0.0436268 secs] 
    -XX:+PrintGCTimeStamps -XX:+PrintGCPrintGCTimeStamps可与上面两个混合使用,输出形式:11.851: [GC 98328K->93620K(130112K), 0.0082960 secs] 
    -XX:+PrintGCApplicationConcurrentTime:打印每次垃圾回收前,程序未中断的执行时间。可与上面混合使用。输出形式:Application time: 0.5291524 seconds 
    -XX:+PrintGCApplicationStoppedTime:打印垃圾回收期间程序暂停的时间。可与上面混合使用。输出形式:Total time for which application threads were stopped: 0.0468229 seconds 
    -XX:PrintHeapAtGC: 打印GC前后的详细堆栈信息 
    -Xloggc:filename:与上面几个配合使用,把相关日志信息记录到文件以便分析 
    -verbose:class 监视加载的类的情况 
    -verbose:gc 在虚拟机发生内存回收时在输出设备显示信息 
    -verbose:jni 输出native方法调用的相关情况,一般用于诊断jni调用错误信息 
    

    八、共享session处理

    目前的处理方式有如下几种: 
    1).使用Tomcat本身的Session复制功能 
    参考http://ajita.iteye.com/blog/1715312Session复制的配置) 
    方案的有点是配置简单,缺点是当集群数量较多时,Session复制的时间会比较长,影响响应的效率 
    2).使用第三方来存放共享Session 
    目前用的较多的是使用memcached来管理共享Session,借助于memcached-sesson-manager来进行TomcatSession管理 
    参考http://ajita.iteye.com/blog/1716320(使用MSM管理Tomcat集群session) 
    3).使用黏性session的策略 
    对于会话要求不太强(不涉及到计费,失败了允许重新请求下等)的场合,同一个用户的session可以由nginx或者apache交给同一个Tomcat来处理,这就是所谓的session sticky策略,目前应用也比较多 
    参考:http://ajita.iteye.com/blog/1848665(tomcat session sticky) 
    nginx默认不包含session sticky模块,需要重新编译才行(windows下我也不知道怎么重新编译) 
    优点是处理效率高多了,缺点是强会话要求的场合不合适 
    

    九、关于Tomcat的session数目

    使用JDK自带的jconsole可以比较明了的看到内存的使用情况,线程的状态,当前加载的类的总量等;
    JDK自带的jvisualvm可以下载插件(如GC等),可以查看更丰富的信息。如果是分析本地的Tomcat的话,还可以进行内存抽样等,检查每个类的使用情况
    

    十、添加JMS远程监控

    对于部署在局域网内其它机器上的Tomcat,可以打开JMX监控端口,局域网其它机器就可以通过这个端口查看一些常用的参数(但一些比较复杂的功能不支持),同样是在JVM启动参数中配置即可,配置如下: 
    -Dcom.sun.management.jmxremote.ssl=false  -Dcom.sun.management.jmxremote.authenticate=false 
    -Djava.rmi.server.hostname=192.168.71.38 设置JVM的JMS监控监听的IP地址,主要是为了防止错误的监听成127.0.0.1这个内网地址 
    -Dcom.sun.management.jmxremote.port=1090 设置JVM的JMS监控的端口 
    -Dcom.sun.management.jmxremote.ssl=false 设置JVM的JMS监控不实用SSL 
    -Dcom.sun.management.jmxremote.authenticate=false 设置JVM的JMS监控不需要认证
    

    十一、分析工具

    IBM ISA,JProfiler、probe 等
    

    十二、Tomcat一个请求的完整过程

    Ng:(nginx)
    
    upstream yy_001{
            server 10.99.99.99:8080; 
            server 10.99.99.100:8080; 
    
            hash $**; 
    
            healthcheck_enabled; 
            healthcheck_delay 3000; 
            healthcheck_timeout 1000; 
            healthcheck_failcount 2; 
            healthcheck_send 'GET /healthcheck.html HTTP/1.0' 'Host: wo.com' 'Connection: close'; 
        }
    
         server {
            include base.conf;
            server_name  wo.de.tian;
             ...
            location /yy/ { 
                proxy_pass http://yy_001;
            }
    
    首先 dns 解析 wo.de.tian机器,一般是ng服务器ip地址 
    然后 ng根据server的配置,寻找路径为 yy/的机器列表,ip和端口 
    最后 选择其中一台机器进行访问—->下面为详细过程
    
    1) 请求被发送到本机端口8080,被在那里侦听的Coyote HTTP/1.1 Connector获得 
    2) Connector把该请求交给它所在的ServiceEngine来处理,并等待来自Engine的回应 
    3) Engine获得请求localhost/yy/index.jsp,匹配它所拥有的所有虚拟主机Host 
    4) Engine匹配到名为localhost的Host(即使匹配不到也把请求交给该Host处理,因为该Host被定义为该Engine的默认主机) 
    5) localhost Host获得请求/yy/index.jsp,匹配它所拥有的所有Context 
    6) Host匹配到路径为/yy的Context(如果匹配不到就把该请求交给路径名为”“的Context去处理) 
    7) path=/yy”的Context获得请求/index.jsp,在它的mapping table中寻找对应的servlet 
    8) Context匹配到URL PATTERN为*.jsp的servlet,对应于JspServlet9) 构造HttpServletRequest对象和HttpServletResponse对象,作为参数调用JspServlet的doGet或doPost方法 
    10)Context把执行完了之后的HttpServletResponse对象返回给Host 
    11)HostHttpServletResponse对象返回给Engine 
    12)EngineHttpServletResponse对象返回给Connector 
    13)ConnectorHttpServletResponse对象返回给客户browser
    

    十三、Tomcat工作模式

    笔者回答:Tomcat是一个JSP/Servlet容器。其作为Servlet容器,有三种工作模式:独立的Servlet容器、进程内的Servlet容器和进程外的Servlet容器。
    进入Tomcat的请求可以根据Tomcat的工作模式分为如下两类:
    Tomcat作为应用程序服务器:请求来自于前端的web服务器,这可能是Apache, IIS, Nginx等;
    Tomcat作为独立服务器:请求来自于web浏览器;
    
    展开全文
  • 一键三连加关注。。。感谢 ! ! ! 文章目录 一. Tomcat的缺省端口是多少,怎么修改?... 找到Tomcat目录下的conf文件夹 进入conf文件夹里面找到server.xml文件 打开server.xml文件 在server.xml文件里面找到下列信息 ...
  • 1、Tomcat的缺省端口是多少,怎么修改? 2、tomcat 有哪几种Connector 运行模式(优化)? 3、Tomcat有几种部署方式? 4、tomcat容器是如何创建servlet类实例?用到了什么原理? 5.tomcat 如何优化? 6.内存调优 ...
  • 即将进入金三银四的黄金时段,所以很多人已经开始准备自己的面试抱佛脚了。今天我整理了6道关于tomcat的核心面试题以及参看答案,看完对于绝大多数人应对面试妥妥的。1、Tomcat的缺省端...
  • Tomcat面试题笔记

    2021-03-27 13:40:38
    1、Tomcat 的缺省端口是多少,怎么修改? 1)找到 Tomcat 目录下的 conf 文件夹 2)进入 conf 文件夹里面找到 server.xml 文件 3)打开 server.xml 文件 4)在 server.xml 文件里面找到下列信息 ...
  • (8)Try-with-resource语句 (9)使用一个catch语言来处理多种异常类型 4、JDK 8 (1)接口的默认方法 ( 【一线大厂Java面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义】 浏览器打开:qq....
  • Tomcat常见面试题

    2021-06-07 20:27:41
    1、tomcat有哪些组件? 2、tomcat有哪些Connector? http ajp 3、tomcat的Valve的作用是什么? 给每一个虚拟主机定义访问日志 4、servlet的生命周期? Servlet 生命周期可被定义为从创建直到毁灭的整个过程...
  • 1、Tomcat 的缺省端口是多少,怎么修改? 1)找到 Tomcat 目录下的 conf 文件夹 2)进入 conf 文件夹里面找到 server.xml 文件 3)打开 server.xml 文件 4)在 server.xml 文件里面找到下列信息 <Connector ...
  • 面试题--maven和tomcat

    2021-11-05 11:44:06
    面试题--maven和tomcat篇Maven1、什么是maven?2、maven能为我们解决什么问题?3、说说maven有什么优缺点?5、什么是Maven的坐标?6、讲一下maven的生命周期7、说说你熟悉哪些maven命令?8、如何解决依赖传递引起的...
  • Tomcat的缺省端口是多少,怎么修改tomcat默认缺省端口是8080修改方法:找到Tomcat目录下的conf文件夹进入conf文件夹里面找到server.xml文件打开server.xml文件在server.xml文件里面找到下列信息修改port属性,改成你...
  • 原标题:超实用的Java web面试题Java web面试题1、Tomcat的优化经验答:去掉对web.xml的监视,把jsp提前编辑成Servlet。有富余物理内存的情况,加大tomcat使用的jvm的内存2、HTTP请求的GET与POST方式的区别答:servlet...
  • Tomcat相关面试题

    2021-08-09 23:08:34
    Tomcat的缺省端口是多少,怎么修改?二. Tomcat 有哪几种Connector 运行模式(优化)?三. Tomcat有几种部署方式?四. Tomcat容器是如何创建servlet类实例?用到了什么原理?五. Tomcat 如何优化?六. 内存调优七. ...
  • 最近梳理2021最新 Spring 面试题 全家桶【附答案解析】,包含了 Java基础、Spring、SpringMVC、Redis、SpringCloud、设计模式、等多个类型。 今天这篇是关于 Spring 全家桶面试题,总结了 110 道经典问题。 这套...
  • Tomcat常见面试题 Tomcat的缺省端口是多少,怎么修改 找到Tomcat目录下的conf文件夹 进入conf文件夹里面找到server.xml文件 打开server.xml文件 在server.xml文件里面找到下列信息 <Service name="Catalina"&...
  • 史上最全Java初中级面试题,发现网上很多Java初级面试题都没有答案,所以花了很长时间搜集整理出来了这套Java面试题大全,希望对大家有帮助哈~ 本人发现网上虽然有不少Java相关的面试题,但第一未必全,第二未必有...
  • Java中级面试题及答案【最新版及答案,干货!!!这是一个中级Java面试系列题中的第一部分。这一部分论述了可变参数,断言,垃圾回收,初始化器,令牌化,日期,日历等等Java核心问题。 Java中级面试永远是程序员...
  • 俗话说金三银四,不管是为了升职加薪...我们无法改变环境,也无法左右市场,但是我们能改变和左右的是自己的知识深度和广度,只有武装到牙齿,不断的充实自己,才能在面试这场江湖纷争里游刃有余。你是不是经常被...
  • 1、Tomcat的缺省端口是多少,怎么修改? 2、tomcat 有哪几种Connector 运行模式(优化)? 3、Tomcat有几种部署方式? 4、tomcat容器是如何创建servlet类实例?用到了什么原理? 5、tomcat 如何优化? 6、熟悉...
  • 2021刚开始,很多朋友问题,有没有一些Java基础面试题及答案面试题,最近抽时间整理了一份Java面试题。或许这份面试题还不足以囊括所有 Java 问题,但有了它,我相信足以应对目前市面上绝大部分的 最新Java 面试了,...
  • 最新常Java面试题汇总(含答案解析)发现网上很多Java面试题都没有答案,所以花了很长时间搜集整理出来了这套Java面试题大全汇总,希望对大家有帮助哈 本套Java面试题大全,全的不能再全,哈哈~ 1、创建socket通讯的...
  • 最新SpringCloud面试题及答案【附答案解析】SpringCloud面试题及答案,SpringCloud最新面试题及答案,SpringCloud面试题新答案已经全部更新完了,有些答案是自己总结的,也有些答案是在网上搜集整理的。这些答案难免...
  • 今年10月份刚刚整理出来的SpringBoot面试题,时间比较赶就没有按照模块分类排序了。总而言之,顺序比较乱,希望大家耐着性子 看。如果实在介意,评论告知,我会视情况作修改的。另外如果大家觉得我找的SpringBoot...
  • 一般情况下,我们都是在单独的Tomcat实例上运行自己的Web应用,其实与这种经典方案相比,我们可以将服务器运行时直接集成到应用程序中,从而更加的灵活和方便。 嵌入式Tomcat的Maven依赖 要使用嵌入式Tomcat并将其...
  • 下面给大家带来的是一个2020年最新的腾讯java面试题,一起来看看腾讯java面试都会问些什么问题吧!希望下面的内容可以帮助到大家呢!腾讯,一面,面试时长大约花费了五十分钟左右,下面是具体的面试题。一、面试题...
  • 最新Jvm面试题及答案【附答案解析】Jvm面试题大全带答案,Jvm面试题最新面试题,Jvm面试题新答案已经全部更新完了,有些答案是自己总结的,也有些Jvm面试题答案是在网上搜集整理的。这些答案难免会存在一些错误,仅...
  • 在这部分,我将详细讲解面试前我们需要做哪些方面的工作,以保证我们在面试过程中更加顺利。 准备一份漂亮的简历 一份漂亮的简历就是你进入大厂的敲门砖。 网上有很多教程教大家如何写出一份漂亮的简历,这里我就不...
  • 主体内容包含:职业规划篇,跳槽篇,实操篇,一线大厂面试题篇,以及高频面试必备综合篇 等知识内容。 总归一句话:养成一颗奋发的平常心!! 目录:------------------- 程序员职业规划篇 职业分析及定位 ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 31,585
精华内容 12,634
关键字:

tomcat面试题