设为首页 收藏本站
查看: 342|回复: 0

[经验分享] Tomcat的结构和对请求的处理

[复制链接]

尚未签到

发表于 2017-2-2 14:33:07 | 显示全部楼层 |阅读模式
  Tomcat的结构和对请求的处理
  Writenby 蒋彪@东京
  2012/7/3
  


1. 问题

  起因是今天帮一个小朋友装开发环境。
  工程是javaEE的,基于maven管理依赖,开发工具是eclipsetomcat
  工程怎么搞都启动出错,最后发现是该工程的web.xml中定义了自己的defaultservletjspservlet
  tomcat启动的时候,会首先读取conf/web.xml下的定义,两者之间肯定要有一个被comment掉。
  tomcat玩了这么多年,有必要把东西理一遍。
  

2. Tomcat的大结构
  tomcat启动之后,将作为一个运行于JVM上的进程存在。
DSC0000.gif

  tomcat从层次上,最外围是server本身。
  然后server里可以有多个service。每个service可以监听几个不同的端口号。
  接下来,每个service里有多个connector。不同的connector监听不同的端口好,使用不同的通信协议。多个connector连接同一个containercontainer管辖多个webapp
  所有的这一切都定义在server.xml中。

<!—最高节点 8005端口是shudown shell用端口号-->
<Server port="8005" shutdown="SHUTDOWN">
//JNDI全局资源
<GlobalNamingResources>
//service,可以有多个
<Service name="Catalina">
//connector 我们一般都是用8080端口的http请求
<Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443"/>
//每个connector都可以定义自己的线程池
<Connector executor="tomcatThreadPool"
port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
//处理请求的容器
<Engine defaultHost="localhost" name="Catalina">
//cluster配置
<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/>
//虚拟主机,可以定义多个虚拟主机。比如www.aaa.com,www.bbb.com,全部映射到同一个容器中。(用于实现SSO)
<Host appBase="webapps" autoDeploy="true" name="localhost" unpackWARs="true" xmlNamespaceAware="false" xmlValidation="false">
//具体的context,用来指明webapp的路径
<Context docBase="xxx" path="/xxx" reloadable="true" source="xxx"/>

  

  作为tomcat的启动而言,一般来说
   根据conf/server.xml启动所有必要组建
   加载conf/web.xml中所有配置
   依次加载所有webapp中的web.xml
  

3. Tomcat中请求的处理
  假设来自客户的请求为:http://www.xxx.com/test/index.jsp
  a. 请求被发送到该物理机器的默认端口80,被在那里侦听的Coyote HTTP/1.1 Connector获得 (没有考虑apache)
  b. Connector封装http请求,并且从线程池中唤醒一个线程,将任务调度给该线程


  • 被唤醒线程在Engine中寻找www.xxx.com匹配的虚拟主机
  • 被找到的Host获得请求/test/index.jsp,匹配它所拥有的所有Context
  • Host匹配到路径为/test的Context(如果匹配不到就把该请求交给路径名为""的Context去处理)
  • path="/test"的Context获得请求/index.jsp
  • Context开始解析http请求,首先由filter处理,再次交给servlet
  现行的Web框架都是由filter拦截
  顺便提一下,这也就是为什么很多人说servlet不是线程安全的。


  • Context把执行完了之后的HttpServletResponse对象返回给Host
  • Host把HttpServletResponse对象返回给Engine
  • Engine把HttpServletResponse对象返回给Connector
  • Connector把HttpServletResponse对象返回给客户browser
  • 线程重回wait状态
  
  #以上#

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-336623-1-1.html 上篇帖子: 一个tomcat服务实现多个应用目录的配置 下篇帖子: 网站服务器tomcat禁止ip直接访问
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表