Tomcat 源码分析

Tomcat 源码分析
------------------

Bootstrap
引导过程:

1 初始化自定义的类加载器:
common
shared
catalina

2 创建并实例化第一个组件类 Catalina

Tomcat 组件体系:
Server
    Service
        Connector
        Engine
            Host
                Context


实现Lifecycle生命周期接口: 表示支持生命周期管理.
start
stop

实现MBeanRegistration接口: 表示这是一个MBean.

实现Service接口,表示这是一个服务组件.

3. 创建Server, Service, Connector, Executor, LifecycleListener, GlobalNamingResource 等组件
读取配置文件 conf/server.xml 并通过反射调用:
setServer(Catalina)
setGlobalNamingResources
addLifecycleListener
addService
addExecutor
addConnector

4. 初始化 Server
StandardServer
4.1 JMX 注册 StandardServer MBean 到 JMBean Server,名称:Catalina:type=Server
4.2 注册 StringCache MBean, 名称: Catalina:type=StringCache

5. 初始化 Service, Executor, Connector
StandardService
5.1 注册 StandardService MBean, 名称: Catalina:type=Service,serviceName=Catalina
5.2 注册 StandardThreadExecutor MBean,名称: Catalina:type=Executor,name=org.apache.catalina.core.StandardThreadExecutor
5.3 注册 Connector MBean, 名称: Catalina:type=Connector,port=8080,address=127.0.0.1
Catalina:type=Connector,port=8009,address=127.0.0.1
5.4 创建适配器CoyoteAdapter
5.5 初始化ProtocolHandler, 我们这里只看Http11Protocol

6 JIoEndpoint
处理TCP连接,默认一个连接分配给一个线程,支持队列.
6.1 创建 DefaultServerSocketFactory
6.2 创建 ServerSocket

---------------- 引导初始化 ---------------

7 启动Server
7.1 启动Service
7.2 启动 Servlet Engine
     注册 StandardEngine, 名称: Catalina:type=Engine
     读取并注册 conf/tomcat5-mbeans.xml, 调用 MBean.init
    
7.3 启动 Executor
     创建 TaskQueue, TaskThreadFactory
     创建 线程池 ThreadPoolExecutor
    
7.4 启动 Connector
     注册JIOEndpoint, 名称: Catalina:type=ThreadPool,name=HTTP11Protocol
     注册GlobalRequestProcessor, 名称: Catalina:type=GlobalRequestProcessor,name=HTTP11Protocol

7.5 启动 JIOEndpoint
     创建 WorkerStack 工人线程集合
     启动TCP接收线程

8 启动TCP处理线程
当有连接建立时,会获取一个Socket对象.
一个ServerSocket可以服务多个Socket. 并发时会有多个ServerSocket.

过程如下:
并发情况下, Socket处理会加入队列, 队列满时,会抛出拒绝连接异常.
正常情况下会启动 SocketProcessor线程处理Socket. 在线程内转交对应的协议Processor来进行处理.
然后获取Socket Stream,保存到InputBuffer/OutputBuffer
解析请求头
然后调用 adapter.service(request, response) 转交请求数据给adapter.
adapter将请求转交给enginee -> host -> context -> listener -> wrapper -> filter -> ApplicationFilterChain -> Servlet.service() 来链式处理.
...
关闭Socket
重复上面过程



















-> Catalina -> conf/server.xml -> Server -> StandardServer -> Service -> StandardService -> Connector -> CoyoteAdapter -> ProtocolHandler -> Http11Protocol -> JIoEndpoint -> Http11ConnectionHandler -> ServerSocketFactory
-> StandardThreadExecutor -> ThreadPoolExecutor -> WorkerStack -> Acceptor -> SocketProcessor -> Request & Response -> Adapter -> CoyoteAdapter -> StandardWrapper -> Filter & Servlet

猜你喜欢

转载自w26.iteye.com/blog/2088476