从整体预览Tomcat

194 阅读4分钟

1.Tomcat整体结构和组件

Server: 代表Tomcat的一个运行实例,一个JVM中只包含一个Server。

包含关系:

  • Listener,为了方便拓展
  • GlobalNamingResources,为了集成JNDI
  • 多个Service组件

Service: 服务的抽象,代表请求从接受到处理的所有组件的集合。

包含关系:

  • 若干Connector组件,用于接收客户端消息
  • 一个Engine组件,处理客户端消息
  • 若干Executor,为Service内所有组件提供线程池执行任务

Connector:接收客户端连接并接收消息报文,消息报文经由它解析后送往容器中处理。

分类:

  • 按协议:HTTP/AJP

  • 网络I/O方式:阻塞/非阻塞/APR(JIO/NIO/APR)

包含关系:

  • 一个协议组件XXXXProtocol
  • Mapper,客户端请求的路由导航组件,通过它能对一个完整的请求地址进行路由,它能通过请求地址找到对应的Servlet。
  • CoyoteAdapter,将Connector和Engine连接起来的适配器

HTTP11Protocol:是HTTP协议1.1版本的抽象。包含接受客户端连接,接收客户端消息报文,报文解析处理,对客户端响应等整个过程。

包含关系:

  • JIO/NIO/APR Endpoint(包含Acceptor和Executor)
  • Processor

工作流程:

Acceptor启动某个端口的监听,一个请求到来后扔进线程池,进行任务处理,处理过程中通过Processor对HTTP协议解析并传到Engine容器继续解析。

Engine:全局Servlet引擎

包含关系:

  • 若干Host
  • Listener,完成Engine相关工作的监听器。
  • AccessLog, 客户端访问日志,所有客户端访问都会被记录。
  • Cluster, 提供集群功能,共享Engine内数据到集群中的其他Tomcat实例。
  • Pipeline,Engine容器对请求进行处理的管道。
  • Realm,提供Engine容器级别的用户-密码-权限的数据对象,配合资源认证模块使用

Host组件: 代表虚拟主机,这些虚拟主机可以存放若干Web应用的抽象(Context容器)。

还包含:

  • Listenner
  • AccessLog,只记录该虚拟主机上的Web应用的访问记录。
  • Cluster
  • Pipeline
  • Realm

Context组件:Web应用的抽象

包含:

  • Listenner
  • AccessLog
  • Pipeline
  • Realm
  • Loader,Web应用加载器,用于加载Web应用的资源,它要保证不同Web应用之间的资源隔离
  • Manager, 会话管理器,维护会话的生成,更新和销毁
  • NamingResource, 命名组件,将conf/server.xml和Web应用的context.xml资源和属性映射到内存中
  • Mapper
  • Wrapper,Servlet相关的包装容器。

Wrapper:对应一个Servlet

包含:

  • Servlet
  • Pipeline
  • ServletPool,当Servlet实现了SingleThreadModel接口时,会在Wrapper中产生 一个Servlet对象池。线程执行时,需要先从对象池中取一个Servlet对象。ServletPool组件能保证Servlet对象的线程安全

2. 请求处理的整体过程

  1. Tomcat启动,Connector组件的接收器(Acceptor)将会监听是否有客户端套接字连接并接收Socket。
  2. 一旦监听到客户端连接,则将连接交由线程池Executor处理,开始执行请求响应任务。
  3. Processor负责从客户端连接中读取消息报文,然后开始解析请求行、请求体。封装成Request对象,方便后面处理时通过Request对象获取HTTP协议相关值。
  4. Mapper组件根据HTTP协议请求行中的URL属性值和请求头部的Host属性值匹配由哪个Host容器、哪个Context容器、哪个Wrapper容器处理请求,这个过程中根据请求从Tomcat中找到对应的Servlet。然后将路由的结果封装到Request对象中,方便后面处理时通过Request对象选择容器。
  5. CoyoteAdapter负责将Connector和Engine连接起来,把前面处理过程中生成的请求对象Request和响应对象Response传递给Engine容器中调用它的管道
  6. Engine容器的管道开始处理请求,管道里包含了若干阀门(Valve),每个阀门负责某些处理逻辑。它会调用Host容器的管道。
  7. Host容器的管道开始处理请求,类似Engine的处理流程。继续调用下层Context容器的管道。
  8. Context管道处理若干阀门之后,调用Wrapper的管道。
  9. Wrapper,执行若干阀门之后,会执行该Wrapper对应的Servlet对象的处理方法,对请求进行逻辑处理,将结果输出到客户端。