最近看了tomcat的源码,想写点总结。
tomcat的模块划分可以用下面的图视之:
从上面的图可以看出,在客户端访问tomcat的时候有一层叫做connector的东西,这其实是处理来自于客户端的协议,左边的coyote connector是对HTTP/1.1协议处理,右边的jk connector是对AJP/1.3协议做处理。
以下就针对coyote connector做一下源代码分析。
首先我们看两个相关的类图:
对上面的类图做一下简单说明:
JIoEndpoint:提供监听线程Acceptor接受socket并且创建一个新的Worker线程处理connection,处理完放入WorkerStack。
WorkerStack:含有一个存放Worker线程的数组。
Acceptor:Server socket acceptor thread。
Worker:线程类,并调用Http11ConnectionHandler处理socket。
Executor:执行线程,线程作为参数传入
SocketProcessor:线程类,类似于Worker,也是调用Http11ConnectionHandler处理socket。
Http11Processor:真正的Processes HTTP requests类。涉及到http协议中一些参数的实现,比如长连接。并且继承了ActionHook,可以对ActionCode代表的事件做相应的处理,即修改http协议中的参数。
Http11ConnectionHandler:从队列ConcurrentLinkedQueue<Http11Processor>中取出Http11Processor对socket处理。
Http11Protocol:继承了ProtocolHandler,是处理协议的总的处理器。从名字就可以看出这一点。其实例变量包括Http11ConnectionHandler,JIoEndpoint,ServerSocketFactory,SSLImplementation,Adapter,有两个重要的方法init()和start(),就是初始化和启动的方法。
下面看几个流程图。
先看一下tomcat启动时的load流程:
tomcat启动时的load从Bootstrap这个类的load方法开始,一步一步的初始化,在初始化Http11Protocol的时候会把Http11ConnectionHandler注入到JIoEndpoint,并调用JIoEndpoint的初始化方法,就是用DefaultServerSocketFactory去创建ServerSocket。
再来看tomcat启动时的start流程:
tomcat启动时的start从是紧接着上面的load,load完后从Bootstrap这个类的start开始一步一步的start,在Http11Protocol调用start的时候会调用JIoEndpoint的start方法,这个方法会new一个WorkerStack,并会new一个Acceptor线程,放入到Thread中,用Thread的start方法启动线程。
下面看一下上面启动的线程里如何运作,Acceptor线程其实是一个循环接受socket的类,我们还是来看一下流程图:
在Acceptor线程的run方法里,对每一个socket会产生一个Worker线程,在启动这个Worker线程后,这个线程的run方法会调用await方法其实是先让这个线程处于wait状态。再说上面的Acceptor线程这时会调用assign方法,其实是用notifyAll()去解开Worker线程的wait状态。当然由于是线程并没有一定的先后,以上也许是先assign,后await也有可能,这时就不会产生wait状态了。在处理完socket后,会把此Worker线程回收到WorkerStack中,下次可以从其中拿而不用新创建,但是当很多请求的时候,Worker不够用了,也需要创建新的Worker线程。WorkerStack中Worker数组的最大值默认是200。
由于Worker线程中的run方法是处在一个不断的循环中,当下一次循环的时候又将进入wait状态,等待唤醒。因此在WorkerStack中的Worker线程就是一个个处于wait状态的线程。
以上的这种请求处理方式就是用一个线程循环的去接受,再创建线程或从线程数组中获取线程去处理请求。
其实tomcat可以配置线程池的,在代码中也是这样判断的:如果没有线程池就创建WorkerStack,后面用Worker线程处理socket;如果有线程池时就使用线程池,看代码executor.execute(new SocketProcessor(socket));就是创建一个SocketProcessor线程去处理socket,SocketProcessor中的run方法和Worker线程类似,只是不循环,也不回收。
- 大小: 46.6 KB
- 大小: 37.9 KB
- 大小: 58.5 KB
- 大小: 44.7 KB
- 大小: 45.6 KB
- 大小: 51.4 KB
- 大小: 96.4 KB
分享到:
相关推荐
《Tomcat6源码分析——深入理解Web服务器的运行机制》 Tomcat6作为Apache软件基金会的Jakarta项目的一部分,是一款广泛使用的Java Servlet容器,它实现了Java Servlet和JavaServer Pages(JSP)规范,为开发和部署...
### Tomcat架构的源码分析 #### 一、Tomcat的架构概述 Tomcat作为一款广泛使用的开源Java Servlet容器,其内部架构设计简洁而高效。本文档将对Tomcat的架构进行详细介绍,并从源码层面深入分析其核心组成部分。...
【TOMCAT源码分析(启动框架)】 Tomcat是一款广泛应用的开源Java Servlet容器,它实现了Java Servlet和JavaServer Pages(JSP)规范,为Web应用程序提供了运行环境。本篇文章将深入探讨Tomcat的系统框架及其启动流程...
《深入理解Tomcat源码分析1:Connector配置详解》 Tomcat,作为广泛使用的Java Servlet容器,其核心组件之一就是Connector,它负责处理Web服务器与客户端之间的通信。本篇文章将详细探讨Tomcat Connector的种类、...
以上是对Tomcat工作原理的简要介绍,通过阅读和分析源码,我们可以更深入地理解其内部机制,对于开发、调试以及性能优化都有极大的帮助。在实际应用中,结合官方文档和社区资源,我们可以解决遇到的各类问题,让...
《Tomcat源码分析1——服务启动与架构详解》 Tomcat,作为一款广泛应用的开源Java Servlet容器,其内部架构和启动流程对于深入理解和优化Web应用程序至关重要。本文将重点解析Tomcat启动时的关键步骤和核心组件,...
源码分析是提升开发者对服务器内部运作机制理解的重要途径,尤其对于Tomcat这样的核心组件,源码的学习能够帮助我们更深入地理解Web应用的部署、运行以及性能优化。 首先,我们要了解Tomcat的架构。Tomcat7基于...
Apache Tomcat 8.5.23 源码分析 Apache Tomcat 是一个开源的、免费的Web服务器和Servlet容器,它实现了Java Servlet和JavaServer Pages(JSP)规范,是开发和部署Java Web应用的重要平台。深入理解Tomcat的源码有助...
### Tomcat源码研究知识点概览 #### 1.1 Catalina.bat脚本解析 - **脚本功能**:`catalina.bat`是Tomcat启动过程中的关键脚本之一,其主要作用在于构建合适的Java命令行参数,进而启动Tomcat服务。此脚本根据环境...
二、Tomcat源码分析 1. **启动流程**:从`bin/catalina.sh`或`bin/catalina.bat`开始,通过`org.apache.catalina.startup.Bootstrap`启动Catalina,加载配置文件,初始化服务器,最后启动主循环监听端口。 2. **...
《Tomcat源码研读笔记》是对Apache Tomcat服务器内部工作原理的深度探索。Tomcat作为一款广泛应用的开源Java Servlet容器,它的源码是理解Java Web应用运行机制的关键。本笔记将围绕Tomcat的核心组件、架构设计以及...
Tomcat源码分析有助于识别性能瓶颈,例如调整线程池大小、缓存策略、连接器设置等。此外,了解如何配置和使用NIO或APR(Apache Portable Runtime)连接器可以显著提升Tomcat的并发处理能力。 8. **故障排查** ...
### tomcat源码解析 #### 简介与概览 Tomcat作为一款开源的Servlet容器,被广泛应用于Java ...通过对Tomcat源码的深入分析,我们可以更好地理解它是如何工作的,以及如何利用其强大的功能来构建高效、稳定的Web应用。
### TOMCAT源码分析——启动框架详解 #### 一、前言 TOMCAT作为一款广泛使用的开源Java Servlet容器,其内部实现复杂且强大。本文旨在深入剖析TOMCAT的启动框架及其整体架构,帮助读者更好地理解其工作原理。...