前言
按照惯例,厘清应用之间的关系,使学习本身形成一个体系框架。Tomcat、常见的一个Web应用服务器(暂时以此称呼,下文会有分类辨析),旨在总结学习过程中的重点,相应知识不清晰时可以有一个相对明朗的概念,底层原理建议从专业书籍中获取。
辨析Web服务器、应用程序服务器与Web容器
随着技术的逐渐发展,各个服务器的功能都在逐渐扩展,界限也越来越模糊,以至于初听到这些名词的时候,感觉不能理解。最好的理解应该是在特定的应用场景下对具体的技术深入了解,而后再做体系的学习。先介绍三个概念,再简单对服务器作一个划分。
Web服务器:基本功能是提供Web信息浏览服务,存储、处理和传递网页给客户端,使用HTTP协议进行传输,不涉及非静态资源的获取
。其涉及到的功能模块主要如下:
- TCP监听模块:服务器监听某个端口(一般是8080端口),以建立与客户端之间的连接
- 预处理:此处主要做三件事:1. 从TCP报文中获取HTTP请求报文。 2. 根据和用户代理的协商进行解密,解压,安全处理等。3. 根据服务器自身的配置进行安全处理,建立会话状态等
- URI路由:解析URL字符串和动作以确定用户代理请求的资源,根据匹配规则(通常根据正则表达式+后缀)路由到静态资源处理模块或动态资源处理模块
- 静态资源处理模块:负责找到静态资源,比如HTML/Javascript/CSS文件/图片/图像,确定内容是字符流或者字节流,并确定对应MIME,比如HTML生成MIME为text/html的字符流,mpeg视频文件生成MIME为video/mpeg的字节流
- 动态资源处理模块:运行业务处理逻辑,我理解是调用其他程序对应的服务处理信息。
- 后处理:根据和客户端协商的协议进行加密,压缩,安全处理等
- 资源输出模块:把处理好的内容和类型封装成HTTP报文,发送到TCP连接的另一端
应用程序服务器:作为应用程序服务器,它通过各种协议(包括HTTP协议),把商业逻辑暴露给(expose)客户端应用程序。Web服务器主要是处理向浏览器发送HTML以供浏览,而应用程序服务器提供访问商业逻辑的途径以供客户端应用程序使用。应用程序使用此商业逻辑就象你调用对象的一个方法(或过程语言中的一个函数)一样。
在大多数情形下,应用程序服务器是通过组件(component)的应用程序接口(API)把商业逻辑暴露(expose)(给客户端应用程序)的,例如基于J2EE(Java 2 Platform, Enterprise Edition)应用程序服务器的EJB(Enterprise JavaBean)组件模型。此外,应用程序服务器可以管理自己的资源,例如看大门的工作(gate-keeping duties)包括安全(security),事务处理(transaction processing),资源池(resource pooling), 和消息(messaging)。就象Web服务器一样,应用程序服务器配置了多种可扩展(scalability)和容错(fault tolerance)技术。
Web容器:可以理解为增强Web服务器动态获取资源的能力,以下是代表性的动态获取资源技术:
技术名词 | 特点 |
---|---|
CGI 公用网关接口 | 以独立进程运行,可以用多种语言开发,比如C,C++,VB,Perl,灵活但效率低,维护复杂 |
PHP | 服务器端嵌入HTML脚本,开源,功能强大,扩展性较差 |
JSP | 服务器端嵌入HTML脚本,跨平台,部署前需编译,主要缺点是编写JSP比较复杂,需熟悉JAVA及相关技术 |
ASP | 服务器端嵌入HTML脚本,开发简单,功能强大,只能在windows下运行 |
开发一个Web程序开发框架,包含运行环境(比如解释执行JSP、Php等),解决鲁捧性、可靠性,提供快速开发接口,开发人员专注于业务实现,框架也提供定制和扩展,这个框架也称为Web容器。相比较于,增加的主要功能模块为:
- 分配线程池资源:容器为每个请求分配一个线程进行处理,通常采取线程池的方式高效理由CPU算资源
- 封装Request/Response上下文:一个请求对应一个上下文,Request请求包括URL、Http请求、以及构建的Session、Cookie等对象
- URl路由
- 动态资源处理模块:比如Java的Servlet
- 回收资源:回收线程资源,一般都以线程池方式实现,所以将线程返回线程池
一些主流服务器
名词 | Web服务器 | Web容器 | 应用程序服务器 | 反向代理支持 |
---|---|---|---|---|
IIS | ✅ | ✅ | ✅ | |
Nginx | ✅ | ✅ | ||
Apache | ✅ | ✅ | ||
Tomcat | ✅ | ✅ | ✅ | |
Jetty | ✅ | ✅ | ✅ | |
WebSphere | ✅ | ✅ | ✅ | |
WebLogic | ✅ | ✅ | ✅ |
可以见到
Web服务器:IIS、Nginx、Apache
应用程序服务器:WebSphere、WebLogic
至于Tomcat、Jetty,其提供了静态资源服务器的功能,也扩展了应用程序服务器的一些功能。所以其一般称为Web容器,也有叫做轻量级应用程序服务器,其他叫法依我看是不太准确的。
还有一个观点,既然Tomcat包含了静态服务器的功能,兼具应用程序服务器的某些特性,那只用Tomcat、Jetty就行了??emmm不置可否,实际上一般在Tomcat这些Web容器前流量会走一层Nginx做代理,同时处理静态资源。
最后赘述一点,Jetty与Tomcat同为ServletWeb容器,主要处理HTTP;Netty是一个高性能、异步事件驱动的 NIO 框架,它提供了对 TCP、UDP 和文件传输的支持。
Tomcat底层
Tomcat的架构核心内容是Connector和Container组件
一个Server服务器中可能有多个Service,Service可以暂时理解为“服务”。Server负责管理Service的生命周期,让外界能够访问,Service将Connector和Container联系在一起。
Connector:负责创建Request和Response对象
Container
- Engine
- Host:虚拟主机
- Context:所属Web应用的上下文
- Wrapper:针对每一个具体的Servlet
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。