Tomcat是著名的基于Java语言的轻量级应用服务器,是一款完全开源免费的Servlet 容器实现。同时,它支持HTML、JS等静态资源的处理,因此又可以作为轻量级Web服务器使用。
Tomcat最初由Sun公司的软件架构师James Duncan Davidson开发,
名称为“JavaWebServer”, 该项目作为Servlet容器的参考实现,以展示Servlet容器相关技术。随后在Davidson的帮助下,该项目于1999年与Apache软件基金会旗下的JServ项目合并,即为现在的Tomcat。
Tomcat的第一个版本(3.x)发布于1999年,该版本基本源自Sun公司贡献的代码,实现了Servlet 2.2和JSP 1.1规范。2001年,Tomcat发布了4.0版本,作为里程碑式的版本,Tomcat完全重新设计了其架构,并实现了Servlet 2.3和JSP 1.2规范。
发展至今,作为Sun相关规范的参考实现,Tomcat已经成为一款成熟的Servlet容器产品,并作为JBoss等应用服务器产品内嵌的Servlet容器(最新的JBoss版本已改为Undertow)。Tomcat不仅广泛用于开发及测试环境,更大量应用于生产环境当中。事实证明,简单如单独服务器、主备部署,复杂至大型的集群架构,Tomcat均可以实现有效的支撑。当前Tomcat存在5个主要版本,分别支持不同版本的规范,其对规范及JDK的版本支持如下表。
Tomcat中最顶层的容器是Server,代表着整个服务器,从上图中可以看出,一个Server可以包含至少一个Service,用于具体提供服务。
Service 的核心组件包括 连接器 (connector)和容器 (container)。
一个容器可能对接多个连接器,每一个连接器都对应某种协议某种IO模型,Tomcat将单个容器和多个连接器组成一个service组件,一个Tomcat中可能存在多个Service组件。
Connector:将不同协议不同IO模型的请求转换为标准的标准的 ServletRequest 对象交给容器处理。
Container:Container本质上是一个Servlet容器,负责servelt的加载和管理,处理请求ServletRequest,并返回标准的 ServletResponse 对象给连接器。
connector 又包含三个核心组件,EndPoint, Processor, Adapter。
Endpoint: "通信端点",主要负责网络通信,这其中包括,监听客户端连接创建于客户端连接的Socket,并负责连接Socket 接收和发送处理器。因此Endpoint是对传输层的抽象,是用来实现 TCP/IP 协议的。
Processor:"处理器",主要负责根据具体应用层协议(HTTP/AJP)读取字节流解析成 Tomcat Request 和 Response,因此Processor是对应用层的抽象,是用来实现 HTTP/AJP 协议的。
Adapter:”适配器” 由于协议不同,客户端发过来的请求信息也不尽相同,Tomcat 定义了自己的 Request 类来“存放”这些请求信息。Adapter用于将Request交给Container进行具体的处理。
EndPoint组件,Processor组件合并在一起表示 Protocol Handler”协议处理器”。
Container本质上是一个Servlet容器,负责servelt的加载和管理,处理请求ServletRequest,并返回标准的 ServletResponse 对象给连接器。
Container容器按功能分为4个组件,分别是 Engine、Host、Context 和 Wrapper。这 4 种容器不是平行关系,而是父子关系。
Wrapper:表示一个 Servlet
Context:表示一个 Web 应用程序,一个 Web 应用程序中可能会有多个 Servlet
Host:表示的是一个虚拟主机,或者说一个站点,可以给 Tomcat 配置多个虚拟主机地址,而一个虚拟主机下可以部署多个 Web 应用程序。
Engine:表示引擎,用来管理多个虚拟站点,一个 Service 最多只能有一个 Engine。
为了能够快速地通过指定的URI找到对应的wrapper及servlet,tomcat开发人员设计出了两个组件:MapperListener和Mapper。
MapperListener主要作用如下:
通过监听容器的AFTER_START_EVENT事件来对容器进行注册;
通过监听容器的BEFORE_STOP_EVENT事件来完成对容器的取消注册。
而Mapper作为URI映射到容器的工具,扮演的角色就是一个映射组件。它会缓存所有容器信息(包括容器名称、容器本身、容器层级等等),同时提供映射规则,将一个URI按照映射规则映射到具体的Host、Context和Wrapper,并最终通过Wrapper找到逻辑处理单元Servlet。
Tomcat通过Mapper组件来确定由哪个wrapper处理发送过来的请求。
Mapper 组件里保存了 Web 应用的配置信息,其实就是容器组件与访问路径的映射关系,比如 Host 容器里配置的域名、Context 容器里的 Web 应用路径,以及 Wrapper 容器里 Servlet 映射的路径,你可以想象这些配置信息就是一个多层次的映射(Map)。
当一个请求到来时,Mapper 组件通过解析请求 URL 里的域名和路径,再到自己保存的 Map 里去查找,就能定位到一个 Servlet。请注意,一个请求 URL 最后只会定位到一个 Wrapper 容器,也就是一个 Servlet。
下面是针对一个网购系统的实际示例,表明Tomcat是如果确定路径的。
用户访问一个 URL,比如图中的http://user.shopping.com:8080/order/buy
1) 根据协议和端口号选定 Service 和 Engine
2) 根据域名选定 Host
3) 根据 URL 路径找到 Context 组件
4) Context 确定后,Mapper 再根据web.xml中配置的 Servlet 映射路径来找到具体的 Wrapper 和 Servlet
需要注意的是,并不是说只有 Servlet 才会去处理请求,实际上这个查找路径上的父子容器都会对请求做一些处理,整个调用过程是通过”pipeline-valve”责任链机制。Pipeline-Valve 是责任链模式,责任链模式是指在一个请求处理的过程中有很多处理者依次对请求进行处理,每个处理者负责做自己相应的处理,处理完之后将再调用下一个处理者继续处理。
Tomcat 目录结构是很清晰的。主要的目录和功能如下所示。
在K1 Power Linux 上运行Tomcat 与x86 平台可以说只有一个差别,即使用OpenJDK。需要在Tomcat 启动时设置,通常都是在 catalina.sh 文件中。
得益于Power9芯片的SMT技术,同样的2路服务器,K1 Power 可以提供更多的逻辑核,支持更多的并发用户数。在进行Tomcat 优化时,可以大幅增加参数 maxThreads 的值。在某个证券行业ISV处进行的测试表明(使用的是Spring内嵌Tomcat),使用12台 FP5280G2 服务器就达到了预计使用30多台主流x86服务器的性能指标。
参考链接:
如果觉得我的文章对您有用,请点赞。您的支持将鼓励我继续创作!
赞0
添加新评论0 条评论