tomcat + spring mvc 原理(一):tomcat原理综述和静态架构

    tomat + spring mvc 是目前比较流行java微服务体系架构,包括现在的spring boot以及基于spring boot的进一步应用化封装的spring cloud框架,底层都是基于tomcat + spring mvc的框架。因此学习tomcat + spring mvc的基础原理,对于解决使用中出现的问题会有比较大的帮助。

tomcat + spring mvc的运作模式

    理解tomcat+spring mvc的工作原理之前,最好能自己配置一下tomcat环境,然后部署一个spring mvc服务,实际感受一下整个流程,对tomcat和spring mvc暴露在外的配置有一个大概的了解。这样有了感性的认识之后,再深入了解原理,会有比较好的理解。网上已经有很多比较详细的关于tomcat环境搭建的文章,这里我就不再赘述。
    传统的使用tomcat + spring mvc框架的服务在开发之前,需要先行配置tomcat的环境。这个过程包括下载和安装tomcat,配置环境变量,修改tomcat的配置文件,最后运行tomcat。对,你没看错,tomcat独立运行,而spring mvc的服务是tomcat运行时加载的。基于spring mvc框架的服务可以在流行的java IDE中自动创建,比如eclipse或者idea。自动创建的工程基本配置已经写入,你可以直接动手书写业务代码,这也是这种架构的显著优势。当然你也可以创建一个空的项目,自行配置。总的来说,spring mvc基于xml或者java代码的config文件的配置是比较繁琐的。项目最后需要打包成一个war文件,复制到tomcat的指定目录下,tomcat会自动解包加载,然后基于你的配置,访问指定端口的指定路由链接,就可以请求服务器的信息应答。
    显然,这种运作模式要求:tomcat需要有监视指定目录,一旦有新的war包加入,就完成解包并动态加载编译后的class的能力;tomcat需要有网络端口开闭和监视的机制,维护线程池来处理随时可能到来的请求;tomcat还需要将到来的请求顺利地传递给spring mvc服务,然后再将服务返回的数据发送出去。

tomcat内部的基本容器构成

    所谓容器(Container),并不是常说的用来存储数据结构的类,比如Collection、Set、List等,而是专指tomcat和spring mvc中用来对功能和结构进行分层抽象的概念(类或者接口)。tomcat的基本容器结构如图所示:

server structure

    tomcat最顶层的容器Server,代表整个tomcat服务器,一个Server可以包含一个或者多个Service。一个Service包含一个或者多个Connetor,但是只能包含一个Container。Connector主要用来处理连接相关的事,比如网络套接字Socket的监听、请求request的接收和应答response的发送。这里的Container是一个抽象的概念,一个接口。其实是指一个Service只能包含一个Engine--Engine继承自Container。Engine容器结构如图所示:
container 结构

其中Engine、Host、Context和Wrapper都继承自Container。
    Engine用来管理多个站点,即可以有多个Host。Host代表一个站点,其实是一个虚拟主机。Context,上下文,代表一套应用程序,一套应用程序总是有相同的应用上下文配置。最后是Wrapper,<font color=Red>每个wrapper只有一个Servlet,而每个Servlet即对应每个开发的spring mvc服务程序</font>。所以我们开发的spring mvc服务程序都是通过Wrapper加载到tomcat中。Context和Wrapper是动态添加的,我们在tomcat的指定目录下每添加一个war包,tomcat加载war包时,就可以添加Context和Servlet。

tomcat容器对应的外部配置

    之所以强调学习原理之前,最好先自己配置tomcat环境和部署一个spring mvc服务程序,是因为tomcat的很多配置和内部容器相关。外部感性理解和对内部原理的理性理解的结合,有益于认知的深入和记忆。
    在tomcat的安装目录下(使用linux yum安装的默认目录在/usr/local/tomcat下,其他系统和安装方法的目录需要百度),有一个conf文件夹,里面存放着一些tomcat层次的容器配置。server.xml配置了Server容器下Service、Connector、Engine和Host的配置,格式类似上图所显示的嵌套结构,不过是以xml的形式。以其中一个Connector配置为例:

<Connector port="8080" protocol="HTTP/1.1"
           connectionTimeout="20000"
           redirectPort="8443" />

上面说到Connector主要用来处理连接相关的事,比如网络套接字Socket的监听、请求request的接收和应答response的发送。所以这里就配置了端口、网络协议、连接超时时间和重定向端口。其他容器的配置也比较类似,可以自行打开浏览一下。conf目录下的context.xml文件存放Context容器的配置:

<Context>

    <!-- Default set of monitored resources. If one of these changes, the    -->
    <!-- web application will be reloaded.                                   -->
    <WatchedResource>WEB-INF/web.xml</WatchedResource>
    <WatchedResource>${catalina.base}/conf/web.xml</WatchedResource>

    <!-- Uncomment this to disable session persistence across Tomcat restarts -->
    <!--
    <Manager pathname="" />
    -->
</Context>

内部主要包括了两个web.xml的目录配置。按照上文所讲的容器结构,Context容器可以中可以有一个或者多个Wrapper,每个Wrapper中包含一个Servlet,Servlet就是我们开发的spring mvc 服务程序。web.xml里写的是spring mvc Servlet的相关配置,一般的spring mvc项目中会有一个WEB-INF目录,内部包含一个自己配置的web.xml文件。另一个是tomcat默认的web.xml的配置,可以看到就是conf目录下的web.xml,这个默认配置是针对所有部署在tomcat中的spring mvc程序。具体关于web.xml配置内容的解释,放在后面的spring mvc原理综述中。

本系列文章:
tomcat + spring mvc原理(一):tomcat原理综述和静态架构
tomcat + spring mvc原理(二):tomcat容器初始化加载和启动
tomcat + spring mvc原理(三):tomcat网络请求的监控与处理1
tomcat + spring mvc原理(四):tomcat网络请求的监控与处理2
tomcat + spring mvc原理(五):tomcat Filter组件实现原理
tomcat + spring mvc原理(六):tomcat WAR包的部署与加载
tomcat + spring mvc原理(七):spring mvc的Servlet和九大标准组件的静态结构与初始化
tomcat + spring mvc原理(八):spring mvc对请求的处理流程

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,047评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,807评论 3 386
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,501评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,839评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,951评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,117评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,188评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,929评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,372评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,679评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,837评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,536评论 4 335
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,168评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,886评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,129评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,665评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,739评论 2 351

推荐阅读更多精彩内容