深入理解Tomcat之一:Tomcat基础架构

Tomcat的定义(来自wiki百科)

Tomcat是由Apache软件基金会下属的Jakarta项目开发的一个Servlet容器,按照Sun Microsystems提供的技术规范,实现了对Servlet和JavaServer Page(JSP)的支持,并提供了作为Web服务器的一些特有功能,如**Tomcat管理和控制平台、安全域管理和Tomcat阀等。

由于Tomcat本身也内含了一个HTTP服务器,它也可以被视作一个单独的Web服务器。

Http服务器与应用服务器

之前在技术讨论群里看到一个群友提问:nginx和tomcat有什么区别呀?其实提出这种问题就可以得知他对两个服务器的基础概念都还不是很清晰。 严格来讲,Nginx、Apache这些叫做Http Server; 而Tomcat是Application Server,更准确的说,是一个Servlet、Jsp容器。 一个 HTTP Server 关心的是 HTTP 协议层面的传输和访问控制,所以在 Apache/Nginx 上你可以看到代理、负载均衡等功能。客户端通过 HTTP Server 访问服务器上存储的资源(HTML 文件、图片文件等等)。一个 HTTP Server 始终只是把服务器上的文件如实的通过 HTTP 协议传输给客户端。 对于 Tomcat 来说,就是需要提供 JSP/Sevlet 运行需要的标准类库、Interface 等。为了方便,应用服务器往往也会集成 HTTP Server 的功能,但是不如专业的 HTTP Server 那么强大,所以应用服务器往往是运行在 HTTP Server 的背后,执行应用,将动态的内容转化为静态的内容之后,通过 HTTP Server 分发到客户端。 回到上面的问题,在我的理解看来,Nginx更像一个协调管理者的角色,而Tomcat用“容器”这个词语形容它会更加形象贴切一点。

Tomcat的整体架构

Tomcat最顶层的容器是Server, 代表整个服务器,从上图可以看出一个 Server至少包含 一个Service,用于具体提供服务。

两个主要组件

Connecter

用于处理连接相关的事,并提供Socket与Request和Response相关的转化;

基本功能

一个Connecter将在某个指定的端口上侦听客户请求,接收浏览器的发过来的 tcp 连接请求,创建一个 Request 和 Response 对象分别用于和请求端交换数据,然后会产生一个线程来处理这个请求并把产生的 Request 和 Response 对象传给处理Engine(Container中的一部分),从Engine出获得响应并返回客户。 Tomcat中有两个经典的Connector,

  • 一个直接侦听来自Browser的HTTP请求,

  • 另外一个来自其他的WebServer请求。

HTTP/1.1 Connector在端口8080处侦听来自客户Browser的HTTP请求,AJP/1.3 Connector在端口8009处侦听其他Web Server(其他的HTTP服务器)的Servlet/JSP请求。

Connector 最重要的功能就是接收连接请求然后分配线程让 Container 来处理这个请求,所以这必然是多线程的,多线程的处理是 Connector 设计的核心。

Connector 中具体是用ProtocolHandler 来处理请求的,不同的ProtocolHandler 代表不同的连接类型,比如, Http11Protocol 使用的是普通Socket 来连接的, Http 11 NioProtocol 使用的是NioSocket 来连接的。

ProtocolHandler 里面有3 个非常重要的组件: Endpoint 、Processor 和Adapter。

  • Endpoint用于处理底层Socket 的网络连接,

    • Acceptor 用于监昕请求

    • AsyncTimeout 用于检查异步request 的超时

    • Handler 用于处理接收到的Socket,在内部调用了Processor 进行处理。

  • Processor 用于将Endpoint 接收到的Socket 封装成Request,

  • Adapter 用于将封装好的Request 交给Container 进行具体处理。

也就是说Endpoint用来实现TCP/IP 协议, Processor 用来实现HTTP 协议, Adapter 将请求适配到Servlet 容器进行具体处理。

Container

用于封装和管理Servlet,以及具体处理Request请求

Container用于封装和管理Servlet,以及具体处理Request请求,在Connector内部包含了4个子容器。

4个子容器的作用分别是:

(1)Engine:引擎,用来管理多个站点,一个Service最多只能有一个Engine;

(2)Host:代表一个站点,也可以叫虚拟主机,通过配置Host就可以添加站点;

(3)Context:代表一个应用程序,对应着平时开发的一套程序,或者一个WEB-INF目录以及下面的web.xml文件;

(4)Wrapper:每一Wrapper封装着一个Servlet;

其他组件

  • Jasper:负责jsp页面的解析,jsp属性的验证,同时负责将jsp动态转换为java代码并编译成class。

  • Naming:资源管理,负责数据库连接池、EJB、mail等通过JDNI获取的内容。

  • Session:会话管理的组件

  • Logging:日志相关

  • JMX:性能监控等