Tomcat核心组件

Tomcat简介

Tomcat相信对于所有小伙伴来说都不陌生,它是一个基于JAVA的WEB容器,其实现了JAVA EE中的 Servlet 与 jsp 规范,与Nginx apache 服务器不同在于一般用于动态请求处理。在架构设计上采用面向组件的方式设计。即整体功能是通过组件的方式拼装完成。另外每个组件都可以被替换以保证灵活性。

Tomcat 各组件及关系

介绍组件之前我们先来看一个图片,来梳理一下各组件之间的关系

根据上面图片,我们整体来认识一下Tomcat。一个Tomcat只能有一个server,server是Tomcat的顶级配置,server中又可以包含多个service,connector连接器包含在service中,用于接收指定协议下的连接,并指定给唯一的Engine进行处理,当然,一个service中可以配置多个连接器,Engine引擎与连接器是同级的,引擎中可以建立多个Host通过域名来分发请求,Host默认去webapps去查找工程,也可以通过相对或绝对路径去分发,这个后面我们再着重介绍,最后就是Context,Context用于隔离各个WEB应用,每个Context的ClassLoader都是独立,用于连接上下文。

如果还是对Tomcat组件之间的关系比较模糊的话,那么我们再来看下以下图片相信对tomcat组件之间的关系就比较清楚了

组件详解

Server 

server的顶级配置,主要包含了port与shutdown属性,这两个属性是用来关闭Tomcat的,可以通过port默认的8005端口来关闭,例:telent 127.0.0.1 8005,也可以通过shutdown指定的参数“SHUTDOWN”关闭。

GlobalNamingResources

服务器的全局JNDI资源,可以有子标签<Resource>

Service

将多个connector与一个Engine组合成一个服务,可以配置多个服务。

Connector

用于接收指定协议下的连接,并指定给唯一的Engine进行处理。

主要属性:

  • protocol:监听的协议,默认是http/1.1,这里也可以指定Tomcat支持的三种线程模型AIO,BIO,NIO,用法:org.apache.coyote.http11.Http11NioProtocol
  1. AIO:异步非阻塞,不需要多路复用选择器,而是请求处理线程执行完程进行回调调知,主要用于Tomcat6以下
  2. BIO:同步阻塞,每个请求都会创建一个线程,对性能开销大,不适合高并发场景,稳定,适合连接数目小且固定架构,用于tomcat7
  3. NIO:同步非阻塞,基于多路复用选择器监测连接状态在同步通知线程处理,从而达到非阻塞的目的,比传统BIO能更好的支持并发性能。Tomcat 8.0之后默认采用该模式
  • port:指定服务器端要创建的端口号
  • minSpareThreads:服务器启动时最小激活的线程数
  • maxThread  最大可以创建处理请求的线程数
  • enableLookups:如果为true,则可以通过调用request.getRemoteHost()进行DNS查询来得到远程客户端的实际主机名,否则返回ip地址
  • redirectPort:指定服务器正在处理http请求时收到了一个SSL传输请求后重定向的端口号
  • acceptCount:指定当所有可以使用的处理请求的线程数都被使用时,可以放到处理队列中的请求数,超过这个数的请求将不予处理
  • connectionTimeout:指定等待超时的时间数(以毫秒为单位)
  • SSLEnabled:是否开启 sll 验证,在Https 访问时需要开启

Engine

用于处理连接的执行器,默认的引擎是catalina。一个service 中只能配置一个Engine。name为引擎名称,defaultHost默认为localhost

Host

基于域名匹配至指定虚拟机。默认的虚拟机是localhost。appBase默认指定webapps,也可以自定义路径。unpackWARs与autoDeploy为true是代表自动解压与自动部署

Valve

主要配置Tomcat日志,prefix前缀,suffix代表后缀,pattern是日志格式

Context

应用上下文,相互隔离,以免造成ClassPath冲突。path上下文路径,docBase配置后也可以通过这个配置的参数来应用上下文

Host案例

<Host name="localhost"  appBase="webapps"
   unpackWARs="true" autoDeploy="true">
</Host>
<Host name="www.test.com"  appBase="/www/test/"
   unpackWARs="true" autoDeploy="true">
</Host>

在本地创建“/www/test/context”目录,在目录里随便生成一个index.html文件,这样在Tomcat启动时候我们就可以通过www.test.com/context访问到了,但是你发现没有,这里为啥多了一层目录呢?这是因为Host中还包含了Context,必须再创建一个站点连接上下文才可以访问,如果index.html直接放到“/www/test”下,是访问不到的,因为默认查找ROOT,如果在context同级目录上创建ROOT目录,index.html是在ROOT下,这样才可以直接访问到,不过不建议这样使用。创建站点来直接访问一般放静态或者临时站点时选择这种方式。

注意:www.test.com需要在/etc/hosts中配置 127.0.0.1 www.test.com

Context案例

<Context docBase="hello" path="/he" reloadable="true"/>

如果docBase站点写死的话就不需要走Host上的appBase站点了,这么配置可以通过www.test.com/hello或者www.test.com/he来访问到/www/test/hello目录下的index.html了

在生产环境还有一种玩法,就是在Tomcat的conf/catalina/www.test.com中创建ROOT.xml,在里面放上两句代码,在这里path是不起作用的

<?xml version="1.0" encoding="UTF-8"?> 
<Context docBase="/www/112233" path="/he" reloadable="true"/>

创建/www/112233/index.html,这样地址上访问www.test.com就可以直接访问到/www/112233站点下了,
如果再创建个XXX.xml,就可以通过www.test.com/XXX来访问。

 

 

 

 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值