极客时间 Tomcat 04

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”

扫描二维码关注公众号,回复: 10532147 查看本文章

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

  tomcat默认采用的BIO模型,在几百并发下性能会有很严重的下降。tomcat自带还有NIO的模型,另外也可以调用APR的库来实现操作系统级别控制。

    NIO模型是内置的,调用很方便,只需要将上面配置文件中protocol修改成org.apache.coyote.http11.Http11NioProtocol,重启即可生效。上面配置我已经改过了,默认的是HTTP/1.1。

    APR则需要安装第三方库,在高并发下会让性能有明显提升。如使用默认protocal就是apr,但最好把protocol修改成org.apache.coyote.http11.Http11AprProtocol,会更加明确。

Tomcat容器是如何创建servlet类实例?用到了什么原理
当容器启动时,会读取在webapps目录下所有的web应用中的web.xml文件,然后对 xml文件进行解析,并读取servlet注册信息。然后,将每个应用中注册的servlet类都进行加载,并通过 反射的方式实例化。(有时候也是在第一次请求时实例化)
在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浏览器;

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

Tomcat顶层架构小结
Tomcat中只有一个Server,一个Server可以有多个Service,一个Service可以有多个Connector和一个Container;

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

Service 是对外提供服务的;

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

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

Tomcat 容器的4层 

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

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

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

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

Servlet生命周期可分为5个步骤

加载Servlet: 当Tomcat第一次访问Servlet的时候,Tomcat会负责创建Servlet的实例;
初始化:当Servlet被实例化后,Tomcat会调用init()方法初始化这个对象;
处理服务 :当浏览器访问Servlet的时候,Servlet 会调用service()方法处理请求;
销毁: 当Tomcat关闭时或者检测到Servlet要从Tomcat删除的时候会自动调用destroy()方法,让该实例释放掉所占的资源。一个Servlet如果长时间不被使用的话,也会被Tomcat自动销毁;
卸载 :当Servlet调用完destroy()方法后,等待垃圾回收。如果有需要再次使用这个Servlet,会重新调用init()方法进行初始化操作。


 

发布了386 篇原创文章 · 获赞 2 · 访问量 9847

猜你喜欢

转载自blog.csdn.net/kuaipao19950507/article/details/104876764