第11章 Tomcat的系统架构与设计模式
11.1 Tomcat总体设计
11.1.1 Tomcat总体架构
Tomcat和核心有连个组件:Connector和Container,Connector是可以被替换的。一个container可以有多个connector,多个connector和一个container形成一个service,service的生存环境就是server。所以Tomcat的声明周期由Server控制。
1. 以Service作为“婚姻”
Connector负责对外交流,container主要处理connector接受的请求,主要处理内部事务。Service将两者组合到一起。Service只是在Connector和Container外面包一层,向外提供服务。一个Service可以设置多个Connector,但是只能有一个Connector容器。
Tomcat中service接口的标准实现类是StandardService,它不仅实现了Service接口,同时实现了Lifecycle接口。
2. 以Server为“居”
提供接口让其他程序能访问这个Service集合,同时维护它包含的所有Service生命周期,包括如何初始化,如何结束服务 如何找别人要访问的service。
server的标准实现类StandardServer实现了先关方法。
3. 组件的生命“Lifecycle”
Tomcat中组件的生命周期通过Lifecycle接口控制,组件只要继承这个接口,并实现其中的方法就可以统一被拥有它的组件控制了。这样一层一层的,直到最高级的组件就可以控制Tomcat中酥油组件的生命周期了,这个最高组件就是Server,而控制server的是StartUP,也就是启动和关闭Tomcat
Server启动时,下面的services都启动;stop时,所有的services都stop
11.1.2 Connector组件
Connector组件是Tomcat中的两个核心组件之一。主要任务是负责监听浏览器发过来的TCP连接请求,创建一个Request和Response对象分别用于和请求端交换数据。然后会产生一个线程来处理这个请求并把产生的Request和Response对象传递给处理这个请求的线程。处理这个请求的线程就是Container组件要做的事了。
当Connector将Socket连接封装成Request和Respone对象后,接下来的事交给Container来处理。
11.1.3 Servlet容器Container
Container是容器的父接口,所有的子容器都必须实现这个接口,Container容器的设计用的是典型的责任链的设计模式,它由4个子容器组件构成,分别是Engine, Host, Context和Wrapper,这4个组件不是平行的,而是父子关系,Engine包含Host,Host包含Context,Context包含Wrapper。通常是一个Servlet class对应一个Wrapper,如果多个Servlet可以定义多个Wrapper;如果有多个Wrapper,则要定义一个更高级别的Container,如Context,Context通常对应下面的配置:
<Context path="/library" docBase="D:/proects\library\deploy\target\library.war" reloadable=true>
1. 容器的总体设计
Context还可以定义在父容器Host中,Host不是必须的,但是要运行war程序,就必须用Host,因为在war中必有web.xml文件,这个文件的解析需要Host。如果有多个HOSt,就需要定义Engine了。Engine就是一个完整的Servlet引擎。
2. Engine容器
标准实现类是StandardEngine,添加子容器只能是Host类型。
3. Host容器
Host是engine的子容器,一个Host代码一个虚拟主机,这个主机的作用就是运行多个应用,它负责安装和展开这些应用,
4. Context容器
Context代表Servlet的Context,它具备了Servlet运行的基本环境,理论上只要要Context就可以运行Servlet了,简单的Tomcat可以没有Engine和Host。
Context最重要的功能是管理它里面的Servlet实例,Servlet实例在Context中是以Wrapper出现的。
Context的配置文件有个reloadable属性,为true时,war被修改后Tomcat会自动重新加载这个应用。
5. Wrapper容器
Wrapper代表一个Servlet,它负责管理一个Servlet,包括Servlet的装载、初始化、执行及资源回收。
实现类是StandardWrapper,还实现了一个Servlet初始化信息的ServletConfig。
它基本描述了对Servlet的操作,装载了Servlet后就会调用Servlet的init方法。
当Servlet被初始化完成后,就等着StandardWrapperValue去调用它的service方法了,调用Service方法之前要调用Servlet所有的的filter。
11.1.4 Tomcat中的其他组件
安全组件security, 日志组件logger, session, mbeans,naming等。这些组件共同为Connector和Container提供必要的服务。
11.2 Tomcat中的设计模式
11.2.1 门面设计模式
1. 门面设计模式的原理
2. Tomcat的门面设计模式示例
11.2.2 观察者设计模式
1. 观察者模式的原理
2. Tomcat的观察者模式示例
11.2.3 命令设计模式
1. 命令模式的原理
2. Tomcat中命令模式的示例
11.2.4 责任链设计模式
1. 责任链模式的原理
2. Tomcat中的责任链模式示例
11.3 总结
第11章 Tomcat的系统架构与设计模式的更多相关文章
- 第十一章 Tomcat的系统架构与设计模式(待续)
Tomcat总体设计 Tomcat中的设计模式
- Tomcat 系统架构与设计模式
Tomcat 系统架构与设计模式,第 1 部分: 工作原理 这个分为两个部分的系列文章将研究 Apache Tomcat 的系统架构以及其运用的很多经典设计模式.本文是第 1 部分,将主要从 Tomc ...
- Tomcat 系统架构与设计模式,第 1 部分: 工作原理(转载)
简介: 这个分为两个部分的系列文章将研究 Apache Tomcat 的系统架构以及其运用的很多经典设计模式.本文是第 1 部分,将主要从 Tomcat 如何分发请求.如何处理多用户同时请求,还有它的 ...
- Tomcat 系统架构与设计模式,第 1 部分: 工作原理
简介: 这个分为两个部分的系列文章将研究 Apache Tomcat 的系统架构以及其运用的很多经典设计模式.本文是第 1 部分,将主要从 Tomcat 如何分发请求.如何处理多用户同时请求,还有它的 ...
- tomcat 系统架构与设计模式 第一部分 系统架构工作原理 转
Tomcat 系统架构与设计模式,第 1 部分: 工作原理 许 令波, Java 开发工程师, 淘宝网 许令波,现就职于淘宝网,是一名 Java 开发工程师.对大型互联网架构设计颇感兴趣,并对一些开源 ...
- 【Tomcat】Tomcat 系统架构与设计模式,第 1 部分: 工作原理
这个分为两个部分的系列文章将研究 Apache Tomcat 的系统架构以及其运用的很多经典设计模式.本文是第 1 部分,将主要从 Tomcat 如何分发请求.如何处理多用户同时请求,还有它的多级容器 ...
- Tomcat 系统架构与设计模式之一
Tomcat 系统架构与设计模式,第 1 部分: 工作原理 来自:http://www.ibm.com/developerworks/cn/java/j-lo-tomcat1/index.html 这 ...
- tomcat 系统架构与设计模式 第二部分 设计模式 转
Tomcat 系统架构与设计模式,第 2 部分: 设计模式分析 许 令波, Java 开发工程师, 淘宝网 许令波,现就职于淘宝网,是一名 Java 开发工程师.对大型互联网架构设计颇感兴趣,并对一些 ...
- Tomcat 系统架构与设计模式之二
Tomcat 系统架构与设计模式,第 2 部分: 设计模式分析 来自:http://www.ibm.com/developerworks/cn/java/j-lo-tomcat2/ 这个分为两个部分的 ...
随机推荐
- spring3: 延迟初始化Bean
3.3.1 延迟初始化Bean 延迟初始化也叫做惰性初始化,指不提前初始化Bean,而是只有在真正使用时才创建及初始化Bean. 配置方式很简单只需在<bean>标签上指定 “lazy- ...
- python脚本1_给一个半径求圆的面积和周长
#给一个半径,求圆的面积和周长,圆周率3.14 r = int(input('r=')) print('area='+str(3.14*r*r)) print('circumference='+str ...
- AtCoder Regular Contest 079
C题,刚开始以为遍历整个树,后来发现二重循环判断就行了 #include<map> #include<set> #include<cmath> #include&l ...
- Chrome浏览器导入数字证书
1.打开 chrome ,点击 右上角的选项图标,在下拉列表中找到 设置 . 2.在设置页面中,滚动到页面的最底部,找到,并点击显示高级设置,找到 HTTPS/SSL 这一项,点击 管理证书 按键.
- ubuntu定时执行任务——crontab的使用
先补上几个链接,后续再总结 #参考# http://www.cnblogs.com/kaituorensheng/p/4494321.html http://blogread.cn/it/articl ...
- easyui tabs页签显示在底部属性
data-options="tabPosition:'bottom'" 如果没有该属性 页签默认显示在最上面,效果如下 当加上了该属性 ,页签会出现在底部
- 【scala】占位符
Scala语言为了让函数字面量更加精简,还可以使用下划线作为占位符,用来表示一个或多个参数. 我们用来表示的参数必须满足只在函数字面量中出现一次. 我们用例子来看占位符的用法 scala> va ...
- laravel支持的日志写入模式和日志严重程度级别:
四种日志写入模式: single:单一的 daily:日常的 syslog:系统记录 errorlog:错误日志 Monolog 识别以下严重程度的级别, 从低到高为: debug. info.not ...
- 第七次scrum meeting记录
文章负责:张华杰 日期:2017年10月31日 会议地点:主楼主南201 各组员工作情况 团队成员 昨日完成任务 明日要完成任务 赵晓宇 课程列表页面搭建 issue20 课程列表页面搭建(part ...
- iOS开发之谓词Predicate和对象数组的排序
我们在开发中经常使用的Predicate谓词,主要是正则表达式的使用,今天给大家简单的讲讲怎样去使用谓词. 因为内容比较简单,所以直接上代码展示: NSMutableArray *people_arr ...