什么是Tomcat:Tomcat是一个web应用服务器,早期的名称为Catalina(卡塔利娜),属于轻量级应用服务器,因为Tomcat里包含了静态页面和web的请求处理,还有servlet来实现动态的请求,也属于一个servlet容器;简单理解:我们学习了css和html之后会发现自己写的页面就只能自己访问,别人不好远程访问你的页面,Tomcat就是提供能够让别人访问自己写的页面的一个程序。
整体架构
在学习一个框架,我一般都会先对他有一个整体的认识。知道他整体是如何运转的,然后再深入其中某部分进行研究,这样会更加事半功倍。
首先我们需要知道这个框架是用来干什么的;Tomcat我们都知道,是用来处理连接过来的Socket请求的。那么Tomcat就会有这两个功能
1、对外处理连接,将收到的Socket字节流转换为自己想要的Request和Response对象
2、对内处理Servlet,将对应的Request请求分发到相应的Servlet中
一个Tomcat中可以配置一个或多个Service,每个Service又对应一个或多个连接器(Connector)用来处理对外连接;同时对应唯一的一个容器(Container)管理对内的Servlet;
连接器(Connector)又主要有三个组件负责三件事:
Endpoint:网络通信,主要负责监听网络事件,获取请求的字节流并且把响应的字节流通过网卡推送回网络中,功能类似于Socket,是用来实现tcp/ip协议的;Endpoint组件有一个抽象类AbstractRndpoint,具体实现类有三个
(1)NIOEndpoint是Tomcat的默认实现,通过调用java的NIO组件来实现IO多路复用模型
(2)NIO2Endpoint通过调用java的NIO2组件来实现一部IO模型,在SSL也就是加密的情况下,速度要远好于NIOEndpoint。在非SSL的情况下,也就是http协议下,性能和NIOEndpoint没有实质性的差异
(3)AJPEndpoint是通过调用JNI技术调用了C语言编写的库,对应的是APR模式,简单理解就是从操作系统层面解决NIO的问题,性能上要远好于上面两种Endpoint;但是启动这种模式需要安装一些其他的依赖库;(主要是对于一些类似网络通讯的与操作系统打交道的情况java没有C语 言效率高,同时主要的是APR使用的DirectByteBuffer区避免java堆与本地内存之间的内存拷贝,但是在内存管理上可能会出现内存泄漏的情况)
Processor:应用层协议的解析,上面说的Endpoint是用来实现tcp/ip协议的,那么Processor就是用来实现http协议的,他通过解析Endpoint传过来的字节流,用http的方式解析成Tomcat的Request对象,然后把该对象传递到Adapter组件中
Adapter:Adapter的作用和他的名字一样,他Tomcat的Request和Response对象转换成ServletRequest和ServletResponse。这种方式就是我们在设计模式中常用到的适配器模式。
容器(Container):容器,顾名思义就是装东西的器皿,那么Tomcat容器是装什么的呢?其实主要是装Servlet的。Tomcat容器设计使用到了组合设计模式。容器主要由四个模块组成:顶(一)级模块Engine,顶(一)级模块下的二级模块Host,二级模块下的三级模块Context,三级模块下的四级模块Wrapper。
Engine引擎:表示可运行的Catalina的引擎实例,并且包含了Servlet的核心功能。在一个服务中只能由一个引擎,同时,作为一个真正的容器,Engine元素下可以包含一个或多个虚拟主机(Host)。他主要功能是将传入的请求委托给适当的虚拟主机处理,如果根据名称没有找到可处理的虚拟主机,那么将根据默认的Host来判断该由那个虚拟主机处理。
Host虚拟主机:作用就是运行多个应用,它负责安装和展开这些应用,并且标识这个应用以便能够区分它们。他的子容器通常是Context。一个虚拟主机对应一个或多个Web App,每个Web App对应一个Context,当Host获取一个请求时,会把该请求匹配到Context上,然后把请求交给Context来处理,Host同时还负责解析web.xml。
Context上下文:代表Servlet的Context,它具备了Servlet运行的基本环境,他表示Web应用程序本身。Context最重要的功能是管理他里面的Servlet实例,一个Context对应一个Web Application,一个Web Application由一个或多个Servlet实例组成。
Wrapper包装器:代表一个Servlet,同时负责管理一个Servlet,包括Servlet的装载、初始化、执行以及资源回收。Wrapper是最底层的容器了,所以调用他的addChild将会报错。
嵌套组件:一个完整的Tomcat除了包含连接器(Connector)和容器(Container)的核心业务组件外,针对其他的扩展功能(日志,授权,监听,集群等)则由嵌套组件负责;
Valve阀门:类似于Servlet规范中定义的过滤器,用来拦截请求并在将其转至目标之前进行某种处理操作。Valve可以定义在任何容器类的组件中。Valve常被用来记录客户端请求、客户端IP地址和服务器等信息,这种处理技术通常被称作请求转储(request dumping)。请求转储valve记录请求客户端请求数据包中的HTTP首部信息和cookie信息文件中,响应转储valve则记录响应数据包首部信息和cookie信息至文件中。
Logger日志记录器:用于记录组件内部的状态信息,可被用于除Context之外的任何容器中。日志记录的功能可被继承,因此,一个引擎级别的Logger将会记录引擎内部所有组件相关的信息,除非某内部组件定义了自己的Logger组件。
Loader类加载器:负责加载、解释Java类编译后的字节码。
Realm领域:用于用户的认证和授权;在配置一个应用程序时,管理员可以为每个资源或资源组定义角色及权限,而这些访问控制功能的生效需要通过Realm来实现。Realm的认证可以基于文本文件、数据库表、LDAP服务等来实现。Realm的效用会遍及整个引擎或顶级容器,因此,一个容器内的所有应用程序将共享用户资源。同时,Realm可以被其所在组件的子组件继承,也可以被子组件中定义的Realm所覆盖。
Excutor执行器:执行器组件允许您配置一个共享的线程池,以供您的连接器使用。从tomcat 6.0.11版本开始。
Listener监听器:监听已注册组件的生命周期。
Manager会话管理器:用于实现http会话管理的功能,tomcat6种有5种会话管理的manager的实现(standardManager、persisentManager、DeltaManager、BackupManager、SimpleTcpReplicationManager)。会话让使用无状态HTTP协议的应用程序完成通信。会话表示客户端和服务器之间的通信,会话功能是由javax.servlet.http.HttpSession 的实例实现的,该实例存储在服务器上而且与一个唯一的标识符相关联,客户端在与服务器的每次交互中根据请求中的标识符找到它的会话。一个新的会话在客户端请求后被创建,会话一直有效直到一段时间后客户端连接超时,或者会话直接失效例如客户退出访问服务器。
Cluster集群:专用于配置Tomcat集群的元素,可用于Engine和Host容器中。